【机器学习】特征工程
程序员文章站
2024-01-24 15:33:16
...
写在前面:机器学习是一门很大的学问,一个好的特征工程即便使用简单的模型也能取得很好的效果。以下文章总结于七月在线机器学习第九期课程,侵删。
前言
特征工程
- 特征 => 数据中抽取出来的对结果预测有用的信息
- 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义
- 更好的特征意味着更强的灵活度
- 更好的特征意味着只需用简单模型
- 更好的特征意味着更好的结果
实际工业界的特征工程
算法工程师在干什么?
- 找特征
- 数据清晰
- 甚至于一招LR打天下
数据与特征处理
数据选择/清洗/采样
清洗
- 数据清洗示例/思考角度
- 单维度不可信数据
- 身高3米+的人?
- 一个月买脸盆墩布买了10w的人
- 单维度不可信数据
- 组合或统计属性判定
- 号称在米国却ip一直都是大陆的新闻阅读用户?
- 你要判定一个人是否会买篮球鞋,样本中女性用户85%?
- 补齐可对应的缺省值
- 不可信的样本丢掉,缺省值极多的字段考虑不用
- 基于统计分布(箱线图)
采样
-
数据采样
- 很多情况下,正负样本是不均衡的
- 电商的用户点/买过的商品和没有行为的商品
- 某些疾病的患者 与 健康人
- …
- 大多数模型对正负样本比是敏感的(比如LR)
- 随机采样 和 分层抽样
- 很多情况下,正负样本是不均衡的
-
正负样本不平衡处理办法
- 正样本 >> 负样本,且量都挺大 => 下采样/欠采样
- 正样本 >> 负样本,量不大 =>
- 采集更多的数据
- 过采样(比如图像识别中的镜像和旋转) ,overSamping、smote
- 修改损失函数/loss function (少的那一类的样本的loss加权)
数值型/类别型/时间型/文本型/统计型/组合特征 特征处理
数值型
- 幅度调整(归一化)
- Log等数据域变化
- 统计值max, min, mean, std
- 离散化
- Hash分桶
- 每个类别下对应的变量统计值histogram(分布状况) o试试数值型=>类别型
幅度调整到[0,1]范围内
对行做处理
如果特征变化范围非常大,那么调整前等高线会非常的窄,呈现长条形等。但是调整后的等高线就会变得比较规则的圆形(碗形)
标准化
对列做处理
【重要】离散化
即:对特征进行分段(如:年龄,0-6,6-60,>60)
逻辑回归、神经网络需要进行离散化;树模型最不需要离散化
如何确定离散边界?
- 等距(平)切分 [不科学]
- 等平切分:根据分位数切分
类别型
- onehot
- 哑变量
- Hash与聚类处理
- 统计每个类别变量下各个target比例,转成数值型
one-hot编码 / 哑变量
为什么要用0010而不用1234? 避免不同的label的权重不一样
使用 pd.get_dummies 获取
Hash技巧 -> Mutil Hot
例如在文章领域,使用词表代表。
Histogram映射
使用另外一列对某一列进行表达,如下如所示:男:[1/3, 2/3, 0] 代表男生中有1/3的喜欢足球,2/3散步, 0喜欢看电视剧。它可以为特征补充到特征上。
时间型
- 既可以看做连续值,也可以看做离散值
- 连续值
- 持续时间(单页浏览时长)
- 间隔时间(上次购买/点击离现在的时间)
- 离散值
- 一天中哪个时间段(hour_0-23)
- 一周中星期几(week_monday…)
- 一年中哪个星期
- 一年中哪个季度
- 工作日/周末
统计值
- 加减平均:商品价格高于平均价格多少,用户在某个品 类下消费超过平均用户多少,用户连续登录天数超过平 均多少…
- 分位线:商品属于售出商品价格的多少分位线处
- 次序型:排在第几位
- 比例类:电商中,好/中/差评比例 你已超过全国百分之…的同学
特征处理实例
- 前一天的购物车商品很有可能第二天就被购买 =>规则
- 剔除掉在30天里从来不买东西的人 => 数据清洗
- 加车N件,只买了一件的,剩余的不会买 => 规则
- 购物车购买转化率 =>用户维度统计特征
- 商品热度 =>商品维度统计特征
- 对不同item点击/收藏/购物车/购买的总计 =>商品维度统计特征
- 对不同item点击/收藏/购物车/购买平均每个user的计数=>用户维 度统计特征
- 变热门的品牌/商品 =>商品维度统计特征(差值型)
- 最近第1/2/3/7天的行为数与平均行为数的比值=>用户维度统计特征(比例型)
- 商品在类别中的排序 =>商品维度统计特征(次序型)
- 商品交互的总人数 =>商品维度统计特征(求和型)
- 商品的购买转化率及转化率与类别平均转化率的比值=>商品维度统计特征(比例型)
- 商品行为/同类同行为均值=>商品维度统计特征(比例型)
- 最近1/2/3天的行为(按4类统计)=>时间型+用户维度统计特征
- 最近的交互离现在的时间=>时间型
- 总交互的天数=>时间型
- 用户A对品牌B的总购买数/收藏数/购物车数=>用户维度统计特征
- 用户A对品牌B的点击数的平方 =>用户维度统计特征
- 用户A对品牌B的购买数的平方=>用户维度统计特征
- 用户A对品牌B的点击购买比=>用户维度统计特征(比例型)
- 用户交互本商品前/后,交互的商品数=>时间型+用户维度统计特征
- 用户前一天最晚的交互行为时间=>时间型
- 用户购买商品的时间(平均,最早,最晚)=>时间型
组合特征处理
简单特征组合:拼接型
- user_id&&category: 10001&&女裙 10002&&男士牛仔
- user_id&&style: 10001&&蕾丝 10002&&全棉
实际电商点击率预估中: 正负权重,喜欢&&不喜欢某种类型
模型特征组合
- 用GBDT产出特征组合路径
- 组合特征和原始特征一起放进LR训练
- 最早Facebook使用的方式,多家互联网公司在用
如下图,可以使用一条路径实现特征组合(不一定选择整条路径,可以选一小截)
特征选择
- 原因:
- 冗余:部分特征的相关度太高了,消耗计算性能。
- 噪声:部分特征是对预测结果有负影响
- 特征选择VS降维
- 前者只踢掉原本特征里和结果预测关系不大的,后者做特征的计算组合构成新特征
- SVD或者PCA确实也能解决一定的高维度问题
常见的特征选择方式:过滤型
- 评估单个特征和结果值之间的相关程度,排序留下Top相关的特征部分。
- Pearson相关系数,互信息,距离相关度
- 缺点:没有考虑到特征之间的关联作用,可能把有用 的关联特征误踢掉。
如何在代码中使用:
常见特征选择方式之 包裹型
- 把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果。
- 典型的包裹型算法为 “递归特征删除算 法”(recursive feature eliminationalgorithm)
- 比如用逻辑回归,怎么做这个事情呢?
- 用全量特征跑一个模型
- 根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化
- 逐步进行,直至准确率/auc出现大的下滑停止
使用sklearn包中的RFE进行包裹型特征选择
常见特征选择方式之 嵌入型
- 根据模型来分析特征的重要性(有别于上面的方式,是从生产的模型权重等)。
- 最常见的方式为用正则化方式来做特征选择。
- 举个例子,最早在电商用LR做CTR预估,在3-5亿维的系数 特征上用L1正则化的LR模型。剩余2-3千万的feature,意 味着其他的feature重要度不够。
代码实现:
特征工程案例
kaggle EDA model: https://download.csdn.net/download/qq_31573519/12322100
下一篇: Pandas——进阶一(数据处理)