特征选择

特征选择是特征工程中的重要问题(另一个重要的问题是特征提取),坊间常说:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程尤其是特征选择在机器学习中占有相当重要的地位。通常而言,特征选择是指选择获得相应模型和算法最好性能的特征集,工程上常用的方法有以下:
1. 计算每一个特征与响应变量的相关性:工程上常用的手段有计算皮尔逊系数和互信息系数,皮尔逊系数只能衡量线性相关性而互信息系数能够很好地度量各种相关性,但是计算相对复杂一些,好在很多toolkit里边都包含了这个工具(如sklearn的MINE),得到相关性之后就可以排序选择特征了;
2. 构建单个特征的模型,通过模型的准确性为特征排序,借此来选择特征,另外,记得JMLR’03上有一篇论文介绍了一种基于决策树的特征选择方法,本质上是等价的。当选择到了目标特征之后,再用来训练最终的模型;
3. 通过L1正则项来选择特征:L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验
4. 训练能够对特征打分的预选模型:RandomForest和Logistic Regression等都能对模型的特征打分,通过打分获得相关性后再训练最终模型;
5. 通过特征组合后再来选择特征:如对用户id和用户特征最组合来获得较大的特征集再来选择特征,这种做法在推荐系统和广告系统中比较常见,这也是所谓亿级甚至十亿级特征的主要来源,原因是用户数据比较稀疏,组合特征能够同时兼顾全局模型和个性化模型,这个问题有机会可以展开讲。
6.通过深度学习来进行特征选择:目前这种手段正在随着深度学习的流行而成为一种手段,尤其是在计算机视觉领域,原因是深度学习具有自动学习特征的能力,这也是深度学习又叫unsupervised feature learning的原因。从深度学习模型中选择某一神经层的特征后就可以用来进行最终目标模型的训练了。

常见的特征处理方法:离散化和特征组合。
离散化

离散化就是把数值型特征离散化到几个固定的区间段。比如说成绩0-100,离散化成A、B、C、D四档,然后用4个01特征来one-hot编码,比如
A为1,0,0,0
B为0,1,0,0
C为0,0,1,0
D为0,0,0,1
那第一位就表示是否为A,第二位表示是否为B……
这里起到的作用就是减少过拟合,毕竟95和96分的两个学生能力不见得就一定有差别,但是A的学生跟D的比起来还是有明显差别的。其实就是把线性函数转换成分段阶跃函数了。

另外一种,比如把汽车时速按10公里/小时之类的分一些档,就像这样:
0-10
10-20
20-30
……

如果现在我们想学习的目标是油耗

这里以某款国内比较热销的车型做了下面的几项测试:
120km/h匀速行驶时,油耗为7.81升/100km
90km/h匀速行驶时, 油耗为5.86升/100km
60km/h匀速行驶时, 油耗为4.12升/100km
30km/h匀速行驶时 ,油耗为4.10升/100km

显然油耗不是线性的,不离散化肯定不行。仔细想想,这样离散化之后,其实可以近似拟合任意函数了。

特征组合也叫特征交叉

合成特征 (synthetic feature)和特征组合(Feature Crosses)不太一样,特征交叉是特征组合的一个子集。

合成特征 (synthetic feature)

一种特征,不在输入特征之列,而是从一个或多个输入特征衍生而来。通过标准化或缩放单独创建的特征不属于合成特征。合成特征包括以下类型:

  1. 将一个特征与其本身或其他特征相乘(称为特征组合)。
  2. 两个特征相除。
  3. 对连续特征进行分桶,以分为多个区间分箱。

特征组合 (feature cross):对非线性规律进行编码

  • 通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征。特征组合有助于表示非线性关系。</li>
  • 对于下面的非线性问题。线性学习器画的任何一条线都不能很好地预测树的健康状况。

要解决上图所示的非线性问题,可以创建一个特征组合。特征组合是指通过将两个或多个输入特征相乘来对特征空间中的非线性规律进行编码的合成特征。“cross”(组合)这一术语来自 cross product(向量积)。我们通过将 与 组合来创建一个名为x3的特征组合:
x3 = x1x2

我们像处理任何其他特征一样来处理这个新建的x3特征组合。线性公式变为:
y = b + w1x1 + w2x2 + w3x3

虽然w3表示非线性信息,但您不需要改变线性模型的训练方式来确定w3的值。

特征组合的种类
通过采用随机梯度下降法,可以有效地训练线性模型。因此,在使用扩展的线性模型时辅以特征组合一直都是训练大规模数据集的有效方法。我们可以创建很多不同种类的特征组合。例如:

[A X B]:将两个特征的值相乘形成的特征组合。
[A x B x C x D x E]:将五个特征的值相乘形成的特征组合。
[A x A]:对单个特征的值求平方形成的特征组合。
特征组合 (Feature Crosses):组合独热矢量
在实践中,机器学习模型很少会组合连续特征。不过,机器学习模型却经常组合独热特征矢量,将独热特征矢量的特征组合视为逻辑连接.例如,假设我们具有以下两个特征:国家/地区和语言。对每个特征进行独热编码会生成具有二元特征的矢量,这些二元特征可解读为 country=USA, country=France 或language=English,language=Spanish。然后,如果您对这些独热编码进行特征组合,则会得到可解读为逻辑连接的二元特征,如下所示:

country:usa AND language:spanish
再举一个例子,假设您对纬度和经度进行分箱,获得单独的独热 5 元素特征矢量。例如,指定的纬度和经度可以表示如下:

binned_latitude = [0, 0, 0, 1, 0]
binned_longitude = [0, 1, 0, 0, 0]
假设您对这两个特征矢量创建了特征组合:

binned_latitude X binned_longitude
此特征组合是一个 25 元素独热矢量(24 个 0 和 1 个 1)。该组合中的单个 1 表示纬度与经度的特定连接。然后,您的模型就可以了解到有关这种连接的特定关联性。

假设我们更粗略地对纬度和经度进行分箱,如下所示:

binned_latitude(lat) = [ 
 0 < lat <= 10 
 10 < lat <= 20 
 20 < lat <= 30 
 ]binned_longitude(lon) = [ 
 0 < lon <= 15 
 15 < lon <= 30 
 ]


针对这些粗略分箱创建特征组合会生成具有以下含义的合成特征:

binned_latitude_X_longitude(lat, lon) = [ 
 0 < lat <= 10 AND 0 < lon <= 15 
 0 < lat <= 10 AND 15 < lon <= 30 
 10 < lat <= 20 AND 0 < lon <= 15 
 10 < lat <= 20 AND 15 < lon <= 30 
 20 < lat <= 30 AND 0 < lon <= 15 
 20 < lat <= 30 AND 15 < lon <= 30 
 ]


现在,假设我们的模型需要根据以下两个特征来预测狗主人对狗狗的满意程度:

行为类型(吠叫、叫、偎依等)
时段
如果我们根据这两个特征构建以下特征组合:

[behavior type X time of day]
我们最终获得的预测能力将远远超过任一特征单独的预测能力。例如,如果狗狗在下午 5 点主人下班回来时(快乐地)叫喊,可能表示对主人满意度的正面预测结果。如果狗狗在凌晨 3 点主人熟睡时(也许痛苦地)哀叫,可能表示对主人满意度的强烈负面预测结果。

线性学习器可以很好地扩展到大量数据。对大规模数据集使用特征组合是学习高度复杂模型的一种有效策略。神经网络可提供另一种策略。