一、什么是特征工程?
"Feature engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data."
简而言之,就是将原始数据转换为模型更容易理解的数据类型,从而提高模型的预测准确率。我认为包含三个方面:特征处理、特征选择、特征生成。
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程尤其是特征选择在机器学习中占有相当重要的地位。
二、特征工程的作用?
1)Better features means flexibility。伸缩性比较好,可以让你使用不太复杂的模型,运行速度更快,更容易理解,更容易维护。
2)Better features means simpler models. 就是说你即使没有选择最正确的模型和最优化的参数,依然能得到相当满意的效果。省去了大量去研究模型的时间。
3)Better features means better results。
为什么特征工程能产生这么好的效果呢?我从Jason Brownlee那里得到了启发,因为特征工程把特征之间、特征与目标变量之间的潜在关系统统挖掘并完整地展示出来了。所以,对模型来讲就很容易理解了,效果自然不错了!相当于你把一个难题已经分解的很透彻了,即使小学生也能很好的理解并给出答案了。
Jason Brownlee的主页:http://machinelearningmastery.com
三、特征工程的处理过程。
- Remove unnecessary features-去掉无用的特征
- Remove redundant features-去掉冗余的特征,如:共线特征
- Create new features-创造新特征
1)Combine existing features
2)Transform features
3)Use features from the context
4) Integrate external sources
- Modify feature types
e.g. from binary to numeric
- Modify feature values-修改特征的值,如特征的极大值、异常值、缺失值
四、特征工程举例
This is might be a foreign idea, so here are three examples:
- Categorical: You have a categorical attribute that had the values [red, green blue], you could split that into 3 binary attributes of red, green and blue and give each instance a 1 or 0 value for each.
- Real: You have a real valued quantity that has values ranging from 0 to 1000. You could create 10 binary attributes, each representing a bin of values (0-99 for bin 1, 100-199 for bin 2, etc.) and assign each instance a binary value (1/0) for the bins.
常见做法 :
1. 单一变量的基础转换:x, x^2,sqrt x ,log x, 缩放
2. 如果变量的分布是长尾的,应用Box-Cox转换,包括:对数转换、平方根转换、倒数转换、平方根后再取倒数、幂转换。
3. 你也可以检查残差(Residuals)或是log-odds(针对线性模型),分析是否是强非线性。
4. 对于基数比较大的数据,对于分类变量,创造一个表示每种类别发生频率的特征是很有用的。当然,也可以用占总量的比率或是百分比来表示这些类别。
5. 对变量的每一个可能取值,估计目标变量的平均数,用结果当做创造的特征。
6. 创造一个有目标变量比率的特征。
7. 选出最重要的两个变量,并计算他们相互之间、以及与其它变量之间的二阶交叉作用并放入模型中,比较由此产生的模型结果与最初的线性模型的结果。
8. 如果你想要的解决方案更平滑,你可以应用径向基函数核(Kadial Basis function kernel) 。这就相当应用一个平滑转换。
9. 如果你觉得你需要协变量(Covariates ),你可以应用多项式核,或者明确添加它们的协变量。
10.高基数特征:在预处理阶段,通过out-of-fold平均转换成数值变量。
两个变量组合而成的特征转换
以下为一些常见的由两个变量组合而成的特征转换:
11.加法转换
12. 相对于基数的差值
13. 乘法转换:交互效果
14. 除法转换:缩放/归一化
15. 对数值型特征设定阈值以获取其布尔值
16.笛卡儿积变换
17. 特征向量积:所有特征的向量积
试想一个特征A,它有两个可能的值:{ A1,A2 } 。假设B是一个具有两种可能性{ B1,B2 }的另一特征。那么, A和B之间的向量积(我们称之为AB)将采取以下值之一: { (A1 , B1),(A1 , B2),(A2 , B1),(A2 , B2) } 。你基本上可以赋予这些”组合”你喜欢的任何名称。但要记住,每个组合都表示一个由A和B的相应值包含的信息之间的协同作用。
18. 归一化/数据标准化变换
在机器学习算法中提出的隐含假设(对朴素贝叶斯而言,在某种程度上是显性假设)之一是:该特征服从正态分布。不过,有时我们可能会发现该特征不遵循正态分布,而是对数正态分布。那么在这种情况下常见的手段之一是取特征值的对数(即表现出对数正态分布的那些特征值),使得它展现出正态分布。如果在使用中的算法做出了正态分布的隐含/显性假设的话,则这种转化,即将一个服从对数正态分布的特征转化为正态分布,可以帮助改善该算法的性能。
19. 分位数分级转换 (Quantile Binning Transformation)
20. 白化数据 (Whitening the Data)
21. 窗体压缩化 (Windowing)
如果所有的点都分布在时间轴上,那么在同一个窗口里的先前的点往往包含丰富的信息。
22. 最小-最大归一化:不一定保留顺序
23. S型/正切/对数转换 (Sigmoid / Tanh / Log Transformations)
24. 用特殊方法处理0:对于计数特征有可能很重要
25. 去相关性/转换变量
26. 重构数量
27.将不频繁的分类变量划分到新的/独立的类别中。
28.按顺序应用一系列转换。
29.独特的编码方式
30.靶值率编码 (Target rate encoding)
31.哈希技巧 (Hash Trick)
常见的多个变量的特征转换
以下为一些常见的多个变量的特征转换:
32.主成分分析 (PCA)
33. 模型集成
34. 压缩感知 (Compressed Sensing)
35.“猜平均值”或是“猜通过变量X分段后的平均值”
36. 处理映射(hack projection):