数据分析是当前互联网公司逐渐注重的一个大块,目前笔者从事的也是这方面的工作研究,所以笔者将不定期分享一些机器学习的算法以及技巧等。
机器学习中,预测模型将输入通过模型变成某种预测值。而特征工程则将输入转化为更适合学习算法的特征,是所有机器学习算法的基础,常常决定最终预测结果的上限。特征工程中常常会产生更有意义的变量,最终产生一个鲁棒的模型,从而成为区分普通模型和好模型的关键。
标准化数值变量
数据集中的数值变量通常是不同尺度的,比如高度和重量之间是不能做比较的。通常建议在知道语义的情况下尽量把数据标准化到同一尺度。比如使用身体质量指数(BMI)来衡量一个人是否超重。这使得不同的人可以通过这个指数互相进行比较。
如果我们不标准化变量的话,某些高尺度的变量可能会受到模型过度的关注,产生较大的偏差。这些模型包括支持向量机(SVM),神经网络(neural network),K-means算法等等。一个常用的标准化方法是减去该特征的平均值并除以标准差。
注意不是所有的情况都建议使用标准化流程,例如对于定义较好的特征比如经纬度,我们不认为对其做标准化会有帮助。
对变量进行装箱
特征装箱时一种非常流行的特征工程技巧,可能基于简单的百分比统计,领域知识或者可视化。例如数据中有用户的历史点击次数,我们根据频次将用户点击数对应到32或者64个箱中。通过这样的装箱,特征会被快速得分割成更加具有说明能力的数值变量。在每一个箱上做分别的处理往往能得到更好的效果。比如老师经常根据考试成绩对学生进行分级,把学生分成A、B、C、D、F几个不同的类别,处理起来更加具有语义和意义。
降低属性变量的层级
我们在做数据统计的时候经常发现一个属性变量可能拥有很多属性值,比如银行的分支,邮政编码或者电子商务网站上面的产品。这些属性值通常是很难处理的,少部分的属性值就涵盖了90%以上的情况,所以为了让模型更加鲁棒,我们通常会降低属性值的数目,降低属性变量的层级。
把分布变得尽量均匀
线性性态的数据通常是我们比较喜欢处理的,如图1。
在上图的(c)中,z1变量被转换为近乎线性的数据。这里使用的是常见的log函数,而log函数是非常常用的转换函数,其他的还有诸如平方根,立方根函数等。为了改变数据分布,Box-Cox转换也非常有用,有时间我会进一步介绍。