原文:http://www.flickering.cn/ads/2014/08/%E8%BD%AC%E5%8C%96%E7%8E%87%E9%A2%84%E4%BC%B0-4%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9%EF%BC%8D%E7%AE%80%E4%BB%8B/
在机器学习中从原始信息中生成和选择特征被称为特征工程(Feature Egineering)或者特征抽取(Feature Extraction)。将事物分门别类一直是人类观察和认识世界的基本手段。机器学习作为帮助人类认知和预测事物的工具,分类和聚类也自然成为机器学习中最重要的方法。人对事物做分类主要依据事物之间共同的特点和差别,一样的,分类器要做出正确的分类也依赖能对事物做出联系和区分的描述信息,这些信息就是我们提供的特征。特征生成就是从各种角度和侧面来刻画事物,例如:通过用户搜索过的词和点击过的广告来描述一个用户,用跳转到一个页面之前的Referrer Query来表征这个网页等。互联网中海量的连接蕴含着信息和价值,尽可能利用各种连接发现信息构造特征也是互联网应用场景下数据挖掘的一大乐趣所在。
华盛顿大学教授Pedro Domingos在其文章《A Few Useful Things to Know about Machine Learning》中讲到使用什么特征是很多机器学习项目成败的关键因素,特征工程也是机器学习项目中最花时间的部分。俗话说巧妇难为无米之炊,有了一个不错的学习器后,为学习器提供好的样本和特征就变得至关重要。我们的团队在做广告转化率预估时,特征构造和选择也一直是我们提升线上效果的主要途径。下面将结合我们在广告系统效果优化上的经验谈下对特征选择的理解。
独立的讲特征选择是没有意义的,特征好与坏要看学习器是否能用得上,本文主要介绍的是服务于线性分类器的特征选择方法。本文记X={x1,x2,?,xn}为特征向量,xi∈R,Y={y1,y2,?,yn}为分类目标向量,yi∈{0,1}。
一、为什么做特征选择
- 提升效果,让分类更准确和泛化效果更好。奥卡姆剃刀原理告诉我们“若无必要,勿增实体”。特征的增多会大大增加分类算法求解的搜索空间,大多数训练算法所需样本数量随着不相关特征数量的增加而显著增加。除了识别和去除出不相关的特征和冗余的特征外,一些特征添加后虽然能让模型更好的拟合训练数据,但因为复杂度的增加导致模型有更高的variance误差,过拟合的后果是在测试数据集上效果反而不好。
- 改善性能,节省存储和计算开销。在数据的处理和模型的训练过程中一般有很多参数(数据时间窗口长度,特征离散化方法,正则化系数等等)可以调节,让从数据产生到得到最终模型的时间更短,速度的提升意味着可以尝试更多的参数,更优的参数也会带来效果的改善。快速迭代是持续提升效果所需的关键能力之一。
- 更好的模型可解释性。在一些应用场景下,比起一个表现95分的黑盒模型我们可能更喜欢一个表现90分的白盒模型。可解释不仅让我们对模型效果的稳定性有更多的把握,一个可读懂的模型所提供的知识也能为我们的业务运营等工作提供指引和决策支持。以决策树为例,只有几个分支的一棵树肯定比一颗有几百个分支的树让人更容易分析和理解。
二、特征的处理
2.1 特征的分类
从特征的取值类型看可以分为下面几类:
- 浮点数特征。像商品的价格。
- 离散值特征。有些取值大小有比较意义,如用户的年龄,取值是正整数。另一些取值仅仅表示不同,如颜色,每个数字表示一种颜色。
- 二值特征。例如,一个垃圾邮件过滤应用把邮件中是否有“领奖”这个词作为特征,出现则特征取值为1,没有则取值为0。
二值特征是我们使用最多的一类特征。离散值特征和浮点数特征都可以转化成二值特征,这种转化可以看成是对空间的变换和升维,让原本不是线性可分的空间通过变换后更容易找到超平面把不同类的点分开。
2.2 特征的预处理
- 缺失值的处理。因为某些原因样本中的一些特征会缺失,例如我们不一定能判断出所有用户的性别和年龄等信息。针对缺失值常用的处理方法有:设置为均值、设置为众数、设置为Unknown等,或者这个样本不学习缺失特征的权重。
- 异常值检测和处理。通过特征取值的分布情况可以比较容易识别出异常的取值,取分位点做上下限截断以及对特征值做分桶后做值平滑是简单易操作的异常值处理方法。
- 比例缩放(Scaling)。直接使用浮点数特征,如果不同特征取值范围差异很大可能会造成严重的过拟合,所以需要把不同特征的取值都映射到相同的范围内。最常用的两种方法:1、min-max:x–xminxmax–xmin,xmin是这个特征中的最小值,xmax是这个特征中的最大值。2、z-score: x–μσ,μ是这个特征的均值,σ是这个特征的方差。可以看出上面两种标准化方法都容易受极大或者极小的特征值影响。此外对特征属于power law分布的也可以取自然对数做比例缩放。
- 离散化(Discretization)。有时对浮点数特征做离散化后能获得更好的效果,例如将用户的年龄映射到“少年,青年,中年,老年”几个区间。对于取值分布稳定的特征,我们可以画出特征的分布图通过人工尝试多种区间划分方式。在常见的离散化方法中,因为互联网数据中的特征(如商品价格)的取值分布很多符合Power Law,所以一般通过Equal-Frequency分桶的到的特征比用Equal-Interval分桶得到的特征有更好的区分性。此外还有基于信息熵和假设检验等方法。
- 截断。一个网页可能属于多个分类(Category)或者多个主题(Topic),如果取值太多放入模型可能达不到预期的效果需要做截断。一般首先会对根据取值的权重(如属于某个分类的概率)排序,截断的方法有:1、简单的取权重最大的前N个;2、从权重最大的开始往下取,当累积的权重达到一定阀值停止;3、当前后两个取值的权重比值超过一定阀值时终止;4、前面三种方法组合使用;
- 二值化(Binarization)。通过one hot encoding可以把有N个取值的离散特征变成N个二值特征。
2.3 特征和特征间的运算
- 补集
- 笛卡尔积
- 交集
- 减运算
通过上面的运算可以在单元子特征基础上得到更多的含义丰富特征。
更为复杂的可以使用多层sigmoid函数网络来加工原始特征。
三、特征选择的常用方法
3. 1 Filter
Filter这类方法是选定一个指标来评估特征,根据指标值来对特征排序,去掉达不到足够分数的特征。这类方法只考虑特征X和目标Y之间的关联,相对另两类特征选择方法Wrapper和Embedded计算开销最少。指标的选择对Filter方法至关重要,下面我们就看几种被大家通常使用的指标。
统计的视角:
- 相关系数(Correlation)。统计课本里都讲过的皮尔森相关系数是最常用的方法。需要注意的是当样本数很少或者特征的取值范围更广时,更容易得出绝对值更大的皮尔森系数,所以样本量不同或者取值范围不同的特征的之间相关系数不一定可以做比较。另外皮尔森相关系数只能衡量线性相关性,随机变量X和Y不相关并不意味二者独立。当相关系数为0时我们知道的是线性分类器不能单利用这个特征的目前的形态做到将不同的类分开,但通过特征本身的变换、和其它特征组合使用或者与其它特征结合出新的特征却可能让它焕发出生机发挥出价值。
- 假设检验(Hypothesis Testing)。将特征X和目标Y之间独立作为H0假设,选择检验方法计算统计量,然后根据统计量确定P值做出统计推断。
信息论的视角:
- 互信息(Mutual Information):MI(X,Y)=H(Y)+H(X)–H(Y,X)=–∑i,jP(yj,xi)log2P(yj,xi)P(yj)P(xi),函数H(⋅)表示信息(负熵),函数 P(⋅)表示概率。
- 信息增益(Information Gain):IG(Y,X)=H(Y)–H(Y|X)。
- 最小描述长度(Minimum Description Length)。
3.2 Wrapper
Wrapper方法和Filter不同,它不单看特征X和目标Y直接的关联性,而是从添加这个特征后模型最终的表现来评估特征的好坏。Wrapper方法需要选定一种评估模型效果的指标,如Area Under the Curve (AUC)、Mean Absolute Error (MAE)、Mean Squared Error(MSE)。假设我们有N个特征,除去空集外这N个特征可以组成2N−1个集合,最暴力的方法是分别用2N−1个特征集合训练得到模型做评估,最后选择模型效果最好的集合。显而易见当N很大时穷举法计算开销惊人。所以前向特征选择(Forward Feature Selection)和后向特征选择(Backward Feature Selection)这样的贪心策略更为大家平常所用。前向特征选择从空集开始,每次在现有特征集合的基础上添加一个让模型效果最好的特征。相反,后向特征选择一开始包括所有的候选特征,每次去掉一个让模型指标提升最多的特征。
离线评估结果是重要的参考指标,但在实际应用中,往往最终还是通过线上A/B Test实验来判断一个特征的效果。在实际应用中离线评估不错的特征在线上表现不一定就好,线上线下评估的一致性和影响因素是另一个可以值得研究的问题。
3.3 Embedded
Filter方法和Wrapper方法都是和分类算法本身的实现无关,可以与各种算法结合使用。而Embedded特征选择方法与算法本身紧密结合,在模型训练过程中完成特征的选择。例如:决策树算法每次都优先选择分类能力最强的特征;逻辑回归算法的优化目标函数在log likelihood的基础上加上对权重的L1或者L2等罚项后也会让信号弱的特征权重很小甚至为0。
一些优化算法天然就适合在每步判断一个维度特征的好坏,所以可以在学习器在设计时就同时融合了特征选择功能,在训练过程中自动尝试构造特征和选择特征。
四、小结
Filter、Wrapper、Embedded三种方法各有不同,但没有孰好孰坏之分,在我们的实际工作中会结合使用。Filter作为简单快速的特征检验方法,可以指导特征的预处理和特征的初选。Embedded特征选择是我们学习器本身所具备的能力。通过Wrapper来离线和在线评估是否增加一个特征。
本文只对特征选择做了整体的概略介绍,后面将针对一些具体的点做展开讨论。