干货!使用Scikit-learn对数据进行预处理!

  Scikit-learn提供了预处理模块,即sklearn.preprocessing模块,能够将原始的特征向量转换为更适合机器学习算法的形式。该preprocessing模块支持机器学习中常用的数据预处理功能,包括数据缩放、数据转换、归一化以及离群数据的处理等。

1,标准化

       对于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.])

     有监督学习中我们需要同时处理训练集和测试集,预处理模块提供的StandardScaler可以先适配训练集的数据,然后对测试集应用相同的转换操作。StandardScaler类在适配过程中会计算训练集的平均值和标准差,以便能够在测试集上应用相同的变换:

In [9]: x_data = np.random.randint(1, 10, (8, 4))


In [10]: x_train, x_test = x_data[0:4, :], x_data[4:8, :]


In [11]: scaler = preprocessing.StandardScaler()


In [12]: scaler.fit(x_train)
Out[12]: StandardScaler(copy=True, with_mean=True, with_std=True)


In [13]: scaler.mean_
Out[13]: array([3.75, 5.75, 5.25, 3.  ])


In [14]: scaler.var_
Out[14]: array([5.6875, 1.1875, 8.1875, 5.5   ])

   适配后的转换器可以用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 ]])

2,归一化

       归一化是将特征数据缩放到限定范围内,通常是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,输入参数是待转换的数组。

1,正态化

      在很多机器学习的建模场景下,都期望特征变量服从正态分布。幂变换是一类参数化的单调变换,旨在将原数据分布尽可能地映射到高斯分布中,以达到稳定方差、降低偏度的目的。预处理模块的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数据分析入门与实战》一书,略有修改,经出版纸质书为准。

12ee0748cf1d01d344ab8b70afa5fc4e.jpeg

15164605bdf0509f75e37ef6328f78e1.jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值