机器学习中的特征工程 —— 七月在线总结
(1)特征很关键,百度、阿里他们得模型效果那么好多半归功于特征工程
数据与特征处理
-数据选择/清洗/采样
- 数值型/类别型/日期型/文本型特征处理
- 组合特征处理
特征选择
- filter
- wrapper
- embedded
(1)大多数人都在做什么?
a. 跑数据,各种map-reduce,hive SQL,数据仓库搬砖
b. 数据清洗、数据清洗、数据清洗
c. 业务分析、分析case、找特征、找特征...
d. 一招LR打天下... (有点夸张)
百度:
2周完成一次特征迭代,在有效的情况下AUC【ROC下面的面积】提升约3-5(千分之)
1个月左右完成一个模型的小优化,有效情况下提升千分之5,但是比较困难
阿里:
挖掘业务场景挖得非常深,贴近业务产出了高效的特征
特征迭代:把新造的、组合的、修正的特征加入,优化,这就是一次特征迭代
特征工程 - 决定结果的上限
model算法 - 多大程度的接近上限
garbage in, garbage out
数据采集
(1)从业务角度(你要做什么建模)去思考哪些数据有帮助?(运营、策略、产品)—— 这是一个脑暴的过程【不局限于部门内部】
(2)这些数据能够采集到吗?(产品、技术)
(3)是否实时快捷,满足需求(技术)
采集到的数据要格式化,确定存储格式,比如日期,以及单个动作记录/一天行为的聚合
数据清洗
去除脏数据
数据清洗的思路:
(1)简单的impossible 不应该有的值,这种是因为错误造成的,比如3米高的人
(2)组合属性或者统计属性来判断
(3)缺失过多的字段可以考虑不用
数据采样
正负样本不均衡,所以要采样 【随机采样、分层抽样】
如果正>>负,而且量都很大,那么可以欠采样,也叫下采样
如果正>>负,但是量不大:
采集更多
oversampling 过采样,一种方式是直接复制,一种方式是生成新的,smote算法
修改损失函数,另一种方式就是修改权重
特征处理
对采集到的原始属性进行进一步的变化
数值型:
(1)scaling、归一化
(2)对于一序列数值,可求其统计值,比如平均值,最大值,最小值,方差,标准差
(3)离散化
cut qcut 一种是值等距,一种是量等距
类别型:
(1)独热变换 one-hot encoding sk learn里有,哑变量 dummy variable pandas里有
绿红蓝
[0, 1, 0]
[1, 0, 0]
每种可能由一个独立的变量表示,这样是有好处的,表达能力更强
这种方法可能会导致数据变得非常稀疏。可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
- 解决了分类器不好处理属性数据的问题
- 在一定程度上也起到了扩充特征的作用
(2)统计每个类别变量下各个target比例
(3)Hash映射
比如性别、爱好,对于性别,可以映射成 [爱好1的比例,爱好2的比例...],实际上是将一个变量变成另一个变量的统计反应,另一个变量有多少可能,那么这个变量就有几维
时间型:
时间是很重要的属性、既可以看作连续值、又可以看作离散值
(1)连续值
持续时间、间隔时间
(2)离散值
哪个时间段、星期几、哪个星期、哪个月、等等
统计型:
(1)加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登陆天数超过平均多少
(2)分位线:商品属于售出商品价格的多少分位线处
(3)次序:排位第几
(4)比例:超过百分之多少
组合特征:
(1)简单拼接
(2)用GBDT产生特征组合路径、然后将组合特征喝原始特征一起放进LR进行训练,这个最早facebook使用,后来多家互联网公司也在用
逻辑型:
(1)=
(2)in
(3)...
特征选择
过滤型:
评估单个特征和结果之间得相关程度,排序留下topN相关特征
pearson相关系数、互信息、距离相关度
缺点,特征间关联作用,可能把有用关联特征误删除掉
对于构建线性模型可以这样,不然这种方式不太好
包裹型:
特征子集的搜索过程,有多种,递归删除,增加
嵌入型:
针对模型来分析特征重要性
用正则化来做特征选择,L1,L2,对于特征维度很大的情况,作L1, 对于特征维度很小的情况,作L2
决策树、随机森林可以作为特征选择的一种方式