1 前言
该篇博客主要涉及到sklearn.feature_selection 以及其他相关模型,主要介绍了如何利用sklearn进行特征工程,特征工程在机器学习中占有工程师的大部分精力,目前也有很多成熟的方法和理论,但是结合实际业务背景选择特征仍然是提升模型性能的关键点。sklearn.feature_selection是一个强大的特征处理工具包,磨刀不误砍柴工,熟练使用工具是重中之重!以下是特征工程的概要图。
2 数据预处理
- 不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
- 缺失值处理:包括缺失值删除及补充。
导入数据集,sklearn具有自动生成数据集工具包例如sklearn.dataset.make_classification,也有标准数据集比如sklearn.dataset.load_boston,sklearn.dataset.load_iris,下面是鸢尾花IRIS数据的下载程序
from sklearn.datasets import load_iris
#导入IRIS数据集
iris = load_iris()
#特征矩阵
dataset = iris.data
#目标向量
labels = iris.target
print "特征矩阵\n",dataset[:5,:]
print '标签\n',set(labels)
特征矩阵
[[ 5.1 3.5 1.4 0.2]
[ 4.9 3. 1.4 0.2]
[ 4.7 3.2 1.3 0.2]
[ 4.6 3.1 1.5 0.2]
[ 5. 3.6 1.4 0.2]]
标签
set([0, 1, 2])
2.1 数据无量纲化
无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特定的范围,例如[0, 1]等。
2.1.1 标准化
标准化需要计算每个特征的均值和标准差,公式表达为:
x′=x−X¯S
使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:
标准化之后的数据范围在[-1,1]之间
至于为什么用.fit_transform(),可参考http://www.cnblogs.com/jasonfreak/p/5448462.html
from sklearn.preprocessing import StandardScaler
#标准化,返回值为标准化后的数据,矩阵形式,下面只显示了前10行数据
StandardScaler().fit_transform(dataset)[:10,:]
array([[-0.90068117, 1.03205722, -1.3412724 , -1.31297673],
[-1.14301691, -0.1249576 , -1.3412724 , -1.31297673],
[-1.38535265, 0.33784833, -1.39813811, -1.31297673],
[-1.50652052, 0.10644536, -1.2844067 , -1.31297673],
[-1.02184904, 1.26346019, -1.3412724 , -1.31297673],
[-0.53717756, 1.95766909, -1.17067529, -1.05003079],
[-1.50652052, 0.80065426, -1.3412724 , -1.18150376],
[-1.02184904, 0.80065426, -1.2844067 , -1.31297673],
[-1.74885626, -0.35636057, -1.3412724 , -1.31297673],
[-1.14301691, 0.10644536, -1.2844067 , -1.4444497 ]])
2.1.2 归一化处理
标准化与归一化的区别:
简单来说,
标准化是依照特征矩阵(每一列是用同一个特征的不同取值)的列处理数据,其通过求z-score的方法,将样本的每个特征的值转换到同一量纲下。
归一化是依照特征矩阵(每一行是不同特征的取值)的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。
规则为 L2 范数的归一化公式如下:
x′=x∑j=1mx2j√
使用preproccessing库的Normalizer类对数据进行归一化的代码如下:
from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据的符号与原数据符号相同
Normalizer().fit_transform(dataset)[:10,:]
array([[ 0.80377277, 0.55160877, 0.22064351, 0.0315205 ],
[ 0.82813287, 0.50702013, 0.23660939, 0.03380134],
[ 0.80533308, 0.54831188, 0.2227517 , 0.03426949],
[ 0.80003025, 0.53915082, 0.26087943, 0.03478392],
[ 0.790965 , 0.5694948 , 0.2214702 , 0.0316386 ],
[ 0.78417499, 0.5663486 , 0.2468699 , 0.05808704],
[ 0.78010936, 0.57660257, 0.23742459, 0.0508767 ],
[ 0.80218492, 0.54548574, 0.24065548, 0.0320874 ],
[ 0.80642366, 0.5315065 , 0.25658935, 0.03665562],
[ 0.81803119, 0.51752994, 0.25041771, 0.01669451]])
2.1.3 区间缩放法
区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为: