使用sklearn预处理数据之标准化、归一化、正则化

文章目录

      • 前言
      • 二值化
      • 最小最大化(属性缩放)
      • 正则化
      • 标准化

前言

sklearn.preprocessingsklearn库中非常重要的一个module,集成了很多预处理数据的方法,今天对常用的几个加以解释说明。

二值化

sklearn.preprocessing.binarizer(threshold=0.0, copy=True)

对数据根据给定的阈值将其映射到0和1,其中阈值默认为0.0,可接收float类型的阈值,注意数据大于阈值的时候映射为1,小于等于阈值的时候映射为0。
可用的方法有:

方法 说明
.fit(x[,y]) fit data
.fit_transform(x[,y]) fit to data, and transform it
.transform(x[,y]) transform data
.get_params() get parameters of the estimator
.set_params() set parameters of the estimator

example:

>>> from sklearn.preprocessing import Binarizer
>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> binary = Binarizer() 
>>> transformer =binary.fit(X) # fit does nothing.
>>> transformer
Binarizer(copy=True, threshold=0.0)
>>> transformer.transform(X)
array([[1., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

binary = Binarizer()实例化一个阈值为0的二值化对象,transformer =binary.fit(X)使用这个二值化对象的fit()方法去fit X,返回一个二值化类的实例化对象,注意此时X还没有被二值化,transformer.transform(X)调用二值化对象的transform()方法对X进行二值化,返回二值化后的X。fit()方法transform()方法也可以合并为一个方法fit_transform(),这里分部调用旨在说明它们各自进行的操作。


最小最大化(属性缩放)

sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)

将数据均匀映射到给定的range(min,max),默认range为(0, 1),计算方式如下:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

首先计算出归一化后的X_std,X与最小值的差与特征的极差(最大值与最小值之差)相比,此时将X映射到(0,1)区间上(最小值映射为0,最大值映射为1)。若采用默认的(0,1)区间,下一步不需要再计算,且等价于对X进行归一化。若指定了目标区间,则再进行下一步,将标准化后的X_std均匀映射到给定的区间上。
可用的方法有:

方法 说明
.fit(x[,y]) 计算X中的最小值和最大值,以便后面使用
.fit_transform(x[,y]) 对X做最小最大化,映射到给定区间
.transform(x[,y]) 用MinMaxScaler()对象中已经使用fit()方法计算出来的最小最大值将X映射到指定的区间
.get_params() get parameters of the estimator
.set_params() set parameters of the estimator
.inverse_transform(X) 与transform对应,对X做反最小最大化,即还原过程

example:

>>> from sklearn.preprocessing import MinMaxScaler
>>>
>>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
>>> scaler = MinMaxScaler()
>>> print(scaler.fit(data))
MinMaxScaler(copy=True, feature_range=(0, 1))
>>> print(scaler.data_max_)
[ 1. 18.]
>>> print(scaler.transform(data))
[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]
>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]

scaler = MinMaxScaler()实例化一个最小最大化对象,scaler.fit(data)计算data的最小值和最大值,返回一个对象,此时可查看此对象的属性值scaler.data_max_,然后使用scaler.transform(data)对data进行最小最大化,返回最小最大化后的结果。注意:在这个例子中,我们使用data来fit这个对象,然后去transform data,结果在(0,1)之间;我们去transform 其他的数据,则结果可能不在(0,1)区间。在机器学习过程中,我们通常使用训练数据去fit对象,然后去transform测试数据。


正则化

sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)

对样本进行l1或者l2正则化,使其l1l2范数为1,标准说法是:对具有至少一个非零分量的每个样本(即数据矩阵的每一行)都独立于其他样本进行缩放,使其范数(l1l2)等于1。
l1正则化的计算方式:
X m ( i ) = X m ( i ) ∑ i X m ( i ) X_m^{(i)}=\frac{X_m^{(i)}}{\sum_iX_m^{(i)}} Xm(i)=iXm(i)Xm(i)这里 X m ( i ) X_m^{(i)} Xm(i)表示第 m m m个样本,第 i i i个特征。
l2正则化的计算方式:
X m ( i ) = X m ( i ) 2 ∑ i X m ( i ) 2 X_m^{(i)}=\sqrt\frac{{X_m^{(i)}}^2}{{\sum_iX_m^{(i)}}^2} Xm(i)=iXm(i)2Xm(i)2 这里 X m ( i ) X_m^{(i)} Xm(i)表示第 m m m个样本,第 i i i个特征。
可用的方法有:

方法 说明
.fit(x[,y]) fit data
.fit_transform(x[,y]) fit to data, and transform it
.transform(x[,y]) transform data
.get_params() get parameters of the estimator
.set_params() set parameters of the estimator

example:

>>> from sklearn.preprocessing import Normalizer
>>> X = [[4, 1, 2, 2],
...      [1, 3, 9, 3],
...      [5, 7, 5, 1]]
>>> transformer = Normalizer().fit(X) # fit does nothing.
>>> transformer
Normalizer(copy=True, norm='l2')
>>> transformer.transform(X)
array([[0.8, 0.2, 0.4, 0.4],
       [0.1, 0.3, 0.9, 0.3],
       [0.5, 0.7, 0.5, 0.1]])

同样,这里的fit()方法只是用数据 X X X确定了标准化对象的参数,返回一个对象,然后transform()才是真正的实现标准化过程,返回标准化后的结果。


标准化

标准化通过计算训练集中样本的相关统计量(均值和单位方差),存储均值和标准差,对每个特征单独进行中心化和缩放,使用变换方法对测试数据进行使用。
标准化的计算方式是:
X n o r m = X − X m e a n X s t d X_{norm}=\frac{X-X_{mean}}{X_{std}} Xnorm=XstdXXmean

数据集的标准化是许多机器学习估计器的一个常见要求:如果单个特征看起来不像标准正态分布数据(例如均值为0的高斯分布和单位方差),它们的性能可能会很差。

例如,在学习算法的目标函数中使用的许多元素(如支持向量机的RBF核或线性模型的L1和L2正则化)都假设所有特征以0为均值,并且具有相同的方差。如果一个特征的方差比其他特征大几个数量级,那么它可能会主导目标函数,使估计器无法按照预期正确地学习其他特征。

该scaler还可以通过传递with_mean=False来应用于稀疏的CSR或CSC矩阵,以避免破坏数据的稀疏结构。

标准化有两种实现方式,,一是调用sklearn.preprocessing.scale()函数,二是实例化一个sklearn.preprocessing.StandardScaler()对象,后者的好处是可以保存训练得到的参数(均值、方差),直接使用其对象对测试数据进行转换。

sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)[source]

sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)

可用的方法有:

方法 说明
.fit(x[,y]) 计算X中的均值和标准差,以便后面使用
.fit_transform(x[,y]) 对X做标准化,映射为0均值单位方差的正态分布
.transform(x[,y]) 用存有均值和方差的标准化方法对x做标准化
.get_params() get parameters of the estimator
.set_params() set parameters of the estimator
.inverse_transform(X) 将数据回退到原始表示形式
.partial_fit(X[, y]) 为以后的缩放在线计算均值和标准差

example:

>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> print(scaler.fit(data))
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> print(scaler.mean_)
[0.5 0.5]
>>> print(scaler.transform(data))
[[-1. -1.]
 [-1. -1.]
 [ 1.  1.]
 [ 1.  1.]]
>>> print(scaler.transform([[2, 2]]))
[[3. 3.]]

partial_fit(X[, y])的说明:

Online computation of mean and std on X for later scaling. All of X is processed as a single batch. This is intended for cases when fit is not feasible due to very large number of n_samples or because X is read from a continuous stream.

The algorithm for incremental mean and std is given in Equation 1.5a,b in Chan, Tony F., Gene H. Golub, and Randall J. LeVeque. “Algorithms for computing the sample variance: Analysis and recommendations.” The American Statistician 37.3 (1983): 242-247:

你可能感兴趣的:(机器学习工具&库)