数据清洗和特征选择:特征放缩与One Hot编码
特征放缩Feature Scaling
在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放,比如:在随机梯度下降(stochastic gradient descent)算法中,特征缩放有时能提高算法的收敛速度。
什么是特征缩放
特征缩放是用来标准化数据特征的范围。
机器算法为什么要特征缩放
特征缩放还可以使机器学习算法工作的更好。比如在K近邻算法中,分类器主要是计算两点之间的欧几里得距离,如果一个特征比其它的特征有更大的范围值,那么距离将会被这个特征值所主导。因此每个特征应该被归一化,比如将取值范围处理为0到1之间。
特征缩放的一些方法
-
调节比例(Rescaling)
这种方法是将数据的特征缩放到[0,1]或[-1,1]之间。缩放到什么范围取决于数据的性质。对于这种方法的公式如下:x是最初的特征值, x′是缩放后的值。
![][equation2]
[equation2]: http://latex.codecogs.com/svg.latex?x'=\frac{x-min(x)}{max(x)-min(x)} -
标准化(Standardization)
特征标准化使每个特征的值有零均值(zero-mean)和单位方差(unit-variance)。这个方法在机器学习地算法中被广泛地使用。例如:SVM,逻辑回归和神经网络。这个方法的公式如下:
![][equation3]
[equation3]: http://latex.codecogs.com/svg.latex?x'=\frac{x-\bar{x}}{\sigma}
One-Hot Encoding
One-Hot编码,主要是采用位状态寄存器来对每个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。在实际的机器学习的应用任务中,特征有时候并不总是连续值,有可能是一些分类值,如性别可分为“male”和“female”。
另外有些看似连续的特征实际上并不具有可加性。比如统计喝咖啡的偏好杯型,分[中杯,超大杯],如果我们误认为这是一个连续特征,那么我们会误认为该特征的均值是大杯,从而产生谬误。
在机器学习任务中,对于这样的特征,通常我们需要对其进行特征数字化,如下面的例子:
有如下三个特征属性:
性别:["male","female"]
地区:["Europe","US","Asia"]
浏览器:["Firefox","Chrome","Safari","Internet Explorer"]
对于某一个样本,如["male","US","Internet Explorer"],我们需要将这个分类值的特征数字化,最直接的方法,我们可以采用序列化的方式:[0,1,3]。但是这样的特征处理并不能直接放入机器学习算法中。
One-Hot Encoding的处理方法
对于上述的问题,性别的属性是二维的,同理,地区是三维的,浏览器则是四维的,这样,我们可以采用One-Hot编码的方式对上述的样本“["male","US","Internet Explorer"]”编码,“male”则对应着[1,0],同理“US”对应着[0,1,0],“Internet Explorer”对应着[0,0,0,1]。则完整的特征数字化的结果为:[1,0,0,1,0,0,0,0,1]。这样导致的一个结果就是数据会变得非常的稀疏。
实际的Python代码
sklearn中有现成的OneHot方法,直接调用即可。
首选对原本的特征进行序列化编码,然后一键完成OneHot。
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
array = enc.transform([[0,1,3]]).toarray()
print array