不同特征的取值范围千差万别,常见的解决方法是对不同的特征进行规范化,使它们的特征值落在相同的值域或从属于某几个确定的类别,比如小、中和大。一旦解决这个问题,不同的特征类型对算法的影响将大大降低,分类正确率就能有大幅提升。
选择具区分度的特征、创建新特征等都属于预处理的范畴。scikit-learn的预处理工具叫作转换器(Transformer),它接受原始数据集,返回转换后的数据集。除了处理数值型特征, 转换器还能用来抽取特征。在这里,我们只看下对数值型特征的预处理方法。
下面用MinMaxScaler类进行基于特征的规范化。
from sklearn.preprocessing import MinMaxScaler
这个类可以把每个特征的值域规范化为0到1之间。小值用0代替,大值用1代替,其余值介于两者之间。
接下来,对数据集X进行预处理。我们在预处理器MinMaxScaler上调用转换函数。有些转 换器要求像训练分类器那样先进行训练,但是MinMaxScaler 不需要,直接调用 fit_transform()函数,即可完成训练和转换。
X_transformed = MinMaxScaler().fit_transform(X
X_transformed与X行列数相等,为同型矩阵。然而,前者每列值的值域为0到1。
还有很多其他类似的规范化方法,对于其他类型的应用和特征类型会很有用。
sklearn.preprocessing.Normalizer:使每条数据各特征值的和为1
用sklearn.preprocessing.StandardScaler:使各特征的均值为0,方差为1
sklearn.preprocessing.Binarizer:将数值型特征的二值化,大于阈值的为 1,反之为0。
参考资料
《Python数据挖掘入门与实践》