Scikit-learn提供了预处理模块,即sklearn.preprocessing模块,能够将原始的特征向量转换为更适合机器学习算法的形式。该preprocessing模块支持机器学习中常用的数据预处理功能,包括数据缩放、数据转换、归一化以及离群数据的处理等。
对于Scikit-learn中实现的很多机器学习算法,将数据集进行标准化是常见的需求。许多目标函数都是假定所有特征的均值为零且方差在同一阶数上,如果个别数据特征不服从标准正态分布,如方差数量级较大,则会影响学习过程,降低模型的准确度。因此,标准化是机器学习中非常重要的一种数据预处理手段,下面是通过scale函数进行标准化的例子:
In [1]: from sklearn import preprocessing
In [2]: import numpy as np
In [3]: data = np.random.randint(1, 10, (4, 4))
In [4]: data
Out[4]:
array([[8, 8, 3, 8],
[9, 9, 2, 7],
[5, 1, 6, 2],
[8, 5, 1, 7]])
In [5]: data_scaled = preprocessing.scale(data)
In [6]: data_scaled
Out[6]:
array([[ 0.33333333, 0.7228974 , 0. , 0.85280287],
[ 1. , 1.04418513, -0.53452248, 0.42640143],
[-1.66666667, -1.52611672, 1.60356745, -1.70560573],
[ 0.33333333, -0.2409658 , -1.06904497, 0.42640143]])
处理后的数据,均值为0,方差为1:
n [7]: data_scaled.mean(axis=0).round(2)
Out[7]: array([-0., -0., 0., -0.])
In [8]: data_scaled.std(axis=0).round(2)
Out[8]: array([1., 1., 1., 1.])
适配后的转换器可以用transform接口对训练集进行标准化:
In [15]: x_train_scaled = scaler.transform(x_train)
In [16]: x_train_scaled.mean(axis=0)
Out[16]: array([ 0.00000000e+00, 5.55111512e-17, 0.00000000e+00, -1.38777878e-17])
In [17]: x_train_scaled.std(axis=0)
Out[17]: array([1., 1., 1., 1.])
调用转换接口,可以将同样的转换操作应用在测试集上:
In [18]: scaler.transform(x_test)
Out[18]:
array([[ 2.20139816, 1.14707867, -0.43685203, -0.42640143],
[-0.31448545, -1.60591014, -1.4852969 , -0.42640143],
[ 2.20139816, -4.35889894, -0.43685203, 1.70560573],
[ 0.52414242, 0.22941573, -0.43685203, 1.2792043 ]])
归一化是将特征数据缩放到限定范围内,通常是0-1之间。不同的特征之间可能具有量纲和数量级上的差异,归一化可以避免这种差异带来的负面影响,加速优化过程。预处理模块中,normalize函数提供了快速、便捷的归一化操作:
In [1]: from sklearn import preprocessing
In [2]: import numpy as np
In [3]: data = np.random.randint(1, 10, (4, 4))
In [4]: data
Out[4]:
array([[6, 4, 2, 4],
[9, 6, 9, 9],
[2, 4, 1, 7],
[3, 6, 7, 1]])
In [5]: data_normalized = preprocessing.normalize(data, norm='l2')
In [6]: data_normalized
Out[6]:
array([[0.70710678, 0.47140452, 0.23570226, 0.47140452],
[0.53881591, 0.3592106 , 0.53881591, 0.53881591],
[0.23904572, 0.47809144, 0.11952286, 0.83666003],
[0.30779351, 0.61558701, 0.71818485, 0.10259784]])
其中,norm参数用来指定归一化所使用的范数类型,支持L1和L2范数,对应的参数值分别为l1和l2。预处理模块还提供了Normalizer转换器,类似于标准化的StandardScaler转换器,它在数据适配后可以对所有输入对象进行统一的归一化操作。下面是该转换器的用法示例:
In [7]: normalizer = preprocessing.Normalizer(norm='l2')
In [8]: normalizer.fit(data)
Out[8]: Normalizer(copy=True, norm='l2')
In [9]: data2 = np.random.randint(1, 10, (1, 4))
In [10]: normalizer.transform(data2)
Out[10]: array([[0.08873565, 0.26620695, 0.53241391, 0.79862086]])
初始化转换器时,可以通过norm参数指定范数类型,默认值为l2。执行归一化转换前,需要调用fit接口进行数据适配。归一化转换的接口为transform,输入参数是待转换的数组。
在很多机器学习的建模场景下,都期望特征变量服从正态分布。幂变换是一类参数化的单调变换,旨在将原数据分布尽可能地映射到高斯分布中,以达到稳定方差、降低偏度的目的。预处理模块的PowerTransformer 转换器支持两种幂变换,分别是Yeo-Johnson幂变换和Box-Cox幂变换,通过method参数来指定。例如,使用Box-Cox幂变换:
In [1]: from sklearn import preprocessing
In [2]: import numpy as np
In [3]: data = np.random.RandomState(616).lognormal(size=(4, 4))
In [4]: transformer = preprocessing.PowerTransformer(method='box-cox', standardize=False)
In [5]: data
Out[5]:
array([[1.28331718, 1.18092228, 0.84160269, 0.94293279],
[1.60960836, 0.3879099 , 1.35235668, 0.21715673],
[1.09977091, 0.98751217, 3.10856524, 1.64193898],
[0.88024529, 0.21202234, 4.17198777, 0.46721295]])
In [6]: transformer.fit_transform(data)
Out[6]:
array([[ 0.24840307, 0.1711119 , -0.16980009, -0.05849047],
[ 0.47219482, -0.80902253, 0.3101936 , -1.35809287],
[ 0.09494971, -0.01253951, 1.25813603, 0.51566077],
[-0.12782912, -1.20392375, 1.62867338, -0.7173335 ]])
PowerTransformer类默认会将标准化操作应用到转换后的输出结果上,可以在初始化时通过指定standardize为False来关闭这个默认选项。
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习
⑤ 历年互联网企业Python面试真题,复习时非常方便****
因篇幅问题不能全部显示,请点此查看更多更全内容