特征工程

特征工程感觉就像数据分析的数据预处理阶段,主要目的就是挑选能够使得模型达到最佳的特征和训练数据。从另一个角度,也可以说特征工程就是人工地去设计输入变量x。我们都知道,数据分析最重要的阶段就是数据预处理,同样的,对机器学习而言,数据和特征也决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

大家往往会把特征工程看成一个大问题,在特征工程下面会有很多子问题,主要包括:特征选择(feature selection)、特征提取(feature extraction)、特征构造(feature construction)

特征选择,就是从一堆特征中选择针对具体问题的最好用的特征子集。可以通过各个特征项和标签(因变量)之间的相关性分析哪些是影响大的特征,哪些是无关特征,最常用的一些系数又Pearson相关系数、Gini-index、IG(信息增益),比如:
$$r_{xy}^2 = (\frac{con(x,y)}{\sqrt{(var(x)var(y))}})$$

Pearson相关系数的取值在01之间,通过这个指数,对特征进行排序,然后取一个子集(比如前10%)进行训练,看看性能如何,然后再取更大的子集,重复这个过程,个人认为这个过程的目的就是要找出能够让模型达到足够好的性能的情况下,最少需要选择多少个特征。因为机器学习本质上也是数据分析,每多出一个特征,模型的运算量肯定是几何级增长的,所以我们要做的就是在性能和效率之间找到最佳的平衡。

实际上特征选择的方法还有很多,上面这个考虑单个特征和标签之间的相关性只是其中一种,需要注意的是,这种方法虽然比较搞笑,但是有缺点的,因为它只考虑了单个特征,却忽略了多个特征之间的相互作用可能对标签的影响比单个特征更大。

除此之外,特征选择的方法还有wrapper(封装器)和Embeded(集成方法),wrapper方法实质上就是一个分类器,用选取的特征子集对样本集进行分类,分类的精度作为衡量特征子集好坏的标准,经过比较选出最好的特征子集,常用的有逐步回归、向前选择、向后选择。优点就是考虑了特征之间的关联性,缺点是数据少的时候容易过拟合,多的时候计算效率又很慢。Embeded集成方法是学习器自主选择特征,这里不细说了。

总的来说,特征工程包括以下一些过程:首先是选择特征子集(产生过程),然后评价这个特征子集好不好(评价函数),如果足够好就可以停止搜索新的子集了(足够好的标准一般是一个阈值,这个阈值和评价函数有关),不够好就继续搜索评价,最后通过选出来的子集验证一下它的有效性(验证过程)。

第二个问题是特征提取,简单来说,特征提取就是把机器学习不能识别的原始数据转化为可以识别的特征的过程,最常见的例子就是图像,机器不可能能够识别图像的,所以我们需要把图像的像素、颜色(RGB)等等能够决定一幅图像的因素转化成一个数字矩阵,只有变成一个个数值计算机才能识别。又比如针对天气,可能我们有一列特征是不同的天气,可能是阴天晴天等等,一般我们可以选择独热编码取解决这些文字特征无法被机器识别的问题。总的来说特征提取的方法有很多,主要还是要根据实际情况决定怎么转换特征让机器能够识别。

第三个问题是特征构建。就是从原始的特征中构建出新的有意义的特征,也是和数据预处理的过程很相似,比如之前做过的交通大数据项目,数据里面有公交在不同站点的时间,我们可以通过用两个时间相减得出公交从a站点到b站点花费的时间,除以距离,得到一个指数,我们就能通过这个指数分析出这个路段的交通状况,可是原始数据是没有直接反映出交通状况的特征的,这就是我们进行特征构建的意义所在了。

总的来说,特征工程或许有很多工作要做,但我觉得那都是和数据分析的预处理阶段是一致的,不论再怎么多步骤,我们的核心目标都是处理出一批漂亮的数据,让模型能够愉快地进行分析,得出合理的结果。
参考资料:
[1]https://blog.csdn.net/dream_angel_z/article/details/49388733