from http://breezedeus.github.io/2014/11/15/breezedeus-feature-processing.htmlhtml
请您移步原文观看,本文只供本身学习使用git
特征工程(Feature Engineering)常常被说为机器学习中的black art,这里面包含了不少不可言说的方面。怎么处理好特征,最重要的固然仍是对要解决问题的了解。可是,它其实也有不少科学的地方。这篇文章我之因此命名为特征处理(Feature Processing),是由于这里面要介绍的东西只是特征工程中的一小部分。这部分比较基础,比较容易说,因此由此开始。github
单个原始特征(或称为变量)一般属于如下几类之一:web
本文中我主要介绍针对单个特征的处理方法,虽然也会附带介绍基础的特征组合方法。同时处理多个特征,以及更复杂的特征处理方法介绍,之后我再另外细说。下面我由浅入深地逐渐说明针对这三类特征的经常使用处理方法。算法
这节要讲的处理技术,应该刚接触机器学习不久的同窗都会知道。机器学习
除了归一化(去中心,方差归一),不用作太多特殊处理,能够直接把连续特征扔到模型里使用。函数
可使用One-hot(也叫One-of-k)的方法把每一个无序特征转化为一个数值向量。好比一个无序特征color
有三种取值:red
,green
,blue
。那么能够用一个长度为3的向量来表示它,向量中的各个值分别对应于red
,green
,blue
。如:学习
color取值 | 向量表示 |
---|---|
red | (1, 0, 0) |
green | (0, 1, 0) |
blue | (0, 0, 1) |
这种方法在NLP里用的不少,就是所谓的词向量模型。变换后的向量长度对于词典长度,每一个词对应于向量中的一个元素。spa
机器学习书籍里在讲这个的时候介绍的处理方法可能跟我上面说的有点差异。上面说的表达方式里有一个维度是能够省略的。既然咱们知道color
必定是取3个值中的一个,那么咱们知道向量的前两个元素值,就能推断第3个值是多少。因此,其实用下面的方式就能够表达究竟是哪一种颜色:code
color取值 | 向量表示 |
---|---|
red | (1, 0) |
green | (0, 1) |
blue | (0, 0) |
这样表达的好处是少用了一个维度,下降了转化后特征之间的相关性。但在实际问题中特征基本都或多或少会有些缺失。使用第一种表达方式就能够用全0的向量来表示值缺失,而第二种表达方式是无法表达缺失的。
有些特征虽然也像无序特征那样只取限定的几个值,可是这些值之间有顺序的含义。例如一我的的状态status
有三种取值:bad
, normal
, good
,显然bad
< normal
< good
。
固然,对有序特征最简单的处理方式是忽略其中的顺序关系,把它当作无序的,这样咱们就可使用处理无序特征的方式来处理它。在实际问题中,这种处理方式其实用的不少。
固然有些问题里有序可能会很重要,这时候就不该该把其中的顺序关系丢掉。通常的表达方式以下:
status取值 | 向量表示 |
---|---|
bad | (1, 0, 0) |
normal | (1, 1, 0) |
good | (1, 1, 1) |
上面这种表达方式很巧妙地利用递进表达了值之间的顺序关系。
最容易让人掉以轻心的,每每就是你们以为最简单的事。在特征处理中,最容易让刚入门同窗忽略的,是对连续特征的处理方式。
以线性分类器Linear Regression (LinearReg)为例,它是经过特征的线性加权来预测因变量yy:
但大部分实际状况下,yy与xx都不会是这么简单的线性关系,甚至连单调关系都不会有。举个只有一个特征的例子,若是yy与xx的实际关系以下图:
那么直接把xx扔进LinearReg模型是怎么也得不到好结果的。不少人会想着既然线性分类器搞不定,那就直接找个非线性的好了,好比高斯核的SVM。咱们确实能够经过这种简单换算法的方式解决这个简单的问题。但对于不少实际问题(如广告点击率预测),每每特征很是多,这时候时间约束一般不容许咱们使用很复杂的非线性分类器。这也是为何算法发展这么多年,广告点击率预测最经常使用的方法仍是Logistic Regression (LogisticReg)。
对于上面这个问题,有没有什么办法使得LinearReg也能处理得不错?固然是有,就是对原始特征xx作转化,把原来的非线性关系转化为线性关系。
最经常使用的转化方式是对xx作离散化(discretization),也就是把原来的值分段,转化成一个取值为0或1的向量。原始值落在某个段里,向量中此段对应的元素就为1,不然为0。
离散化的目标是yy与转化后向量里的每一个元素都保持比较好的线性关系。
好比取离散点{0.5,1.5,2.5}{0.5,1.5,2.5},经过判断xx属于(−∞,0.5)(−∞,0.5),[0.5,1.5)[0.5,1.5),[1.5,2.5)[1.5,2.5),[2.5,+∞)[2.5,+∞)中哪段来把它离散化为4维的向量。下面是一些例子的离散结果:
原始值xx | 离散化后的值 |
---|---|
0.1 | (1, 0, 0, 0) |
1.3 | (0, 1, 0, 0) |
3.2 | (0, 0, 0, 1) |
5.8 | (0, 0, 0, 1) |
离散化方法的关键是怎么肯定分段中的离散点。下面是经常使用的选取离散点的方法:
上面介绍的这种离散化为0/1向量的方法有个问题,它在离散时不会考虑到具体的xx到离散边界的距离。好比等距离散中取离散点为{0.5,1.5,2.5}{0.5,1.5,2.5},那么1.499,1.501和2.49分别会离散为(0, 1, 0, 0),(0, 0, 1, 0)和(0, 0, 1, 0)。1.499和1.501很接近,但是就由于这种强制分段的离散致使它们离散的结果差距很大。
针对上面这种硬离散的一种改进就是使用软离散,也就是在离散时考虑到xx与附近离散点的距离,离散出来的向量元素值能够是0/1以外的其余值。有兴趣的同窗能够去ESL1这本书中找点感受。
函数变换直接把原来的特征经过非线性函数作变换,而后把原来的特征,以及变换后的特征一块儿加入模型进行训练。经常使用的变换函数见下表,不过其实你能够尝试任何函数。
经常使用非线性函数f(x)f(x) | xx的取值范围 |
---|---|
xαxα; α∈(−∞,+∞)α∈(−∞,+∞) | (−∞,+∞)(−∞,+∞) |
log(x)log(x) | (0,+∞)(0,+∞) |
log(x1−x)log(x1−x) | (0,1)(0,1) |
这个方法操做起来很简单,但记得对新加入的特征作归一化。
对于咱们前面的问题,只要把x2x2,x3x3也做为特征加入便可,由于实际上yy就是xx的一个三次多项式。
咱们可使用笛卡尔乘积的方式来组合2个或更多个特征。好比有两个类别特征color
和light
,它们分别能够取值为red
,green
,blue
和on
, off
。这两个特征各自能够离散化为3维和2维的向量。对它们作笛卡尔乘积转化,就能够组合出长度为6的特征,它们分别对应着原始值对(red, on)
,(red, off)
,(green, on)
,(green, off)
,(blue, on)
,(blue, off)
。下面的矩阵表达方式更清楚地说明了这种组合。
X | on |
off |
---|---|---|
red |
||
green |
||
blue |
对于3个特征的笛卡尔乘积组合,能够表达为立方的形式。更多特征的组合依次类推。 这个方法也能够直接用于连续特征与类别特征之间的组合,只要把连续特征当作是1维的类别特征就行了,这时候组合后特征对应的值就不是0/1了,而是连续特征的取值。
在上节中我已经介绍了一些经常使用的离散化单个连续特征的方法,其中一个是画图观察趋势。画图观察趋势的好处是直观、可解释性强,坏处是很麻烦。当要离散化的特征不少时,这种方法可操做性较差。
机器学习中有个很好解释,速度也不错的模型——决策树模型。大白话说决策树模型就是一大堆的if else
。它天生就能够对连续特征分段,因此把它用于离散化连续特征合情合理。我称这种方法为决策树离散化方法。例如Gmail在对信件作重要性排序时就使用了决策树离散化方法2。
决策树离散化方法一般也是每次离散化一个连续特征,作法以下:
单独用此特征和目标值yy训练一个决策树模型,而后把训练得到的模型内的特征分割点做为离散化的离散点。
这种方法固然也能够同时离散化多个连续特征,可是操做起来就更复杂了,实际用的很少。
核方法常常做为线性模型的一种推广出现。以线性回归模型为例,它对应的核方法以下:
其中{xi}ni=1{xi}i=1n为训练样本点,K(xi,xj)K(xi,xj)为核函数,好比经常使用的高斯核函数为:
若是咱们把上面模型里的{K(x,xi)}ni=1{K(x,xi)}i=1n当作特征,而θθ当作模型参数的话,上面的模型仍旧是个线性模型。因此能够认为核方法只是特征函数变换的一种方式。
固然,若是把核函数K(xi,xj)K(xi,xj)当作一种类似度的话,那上面的模型就是kNN模型了,或者叫作加权平均模型也能够。
由于核方法在预测时也要用到训练样本点,耗内存且计算量大,因此在数据量较大的实际问题中用的并很少。
到此,我已经介绍了很多针对单个特征的处理方法。这些处理方法很难说哪一个好哪一个很差。有些问题这个好,有些问题那个好,也没什么绝招能直接判断出哪一种方法能适合哪些问题。惟一的招就是:
Experiment a lot!
Trevor Hastie et al. The Elements of Statistical Learning, 2001. ↩
Douglas Aberdeen et al. The Learning Behind Gmail Priority Inbox, 2010. ↩