使用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:

Sklearn中的标准化是指将数据转换为均值为0,标准差为1的标准正态分布。常用的标准化方法有normalize函数、scale函数和StandardScaler类。 1. normalize函数可以通过设置norm参数来选择不同的范数进行正则化。其中,L2范数将向量的每个元素除以其L2范数,得到单位范数;L1范数将向量的每个元素除以其L1范数,得到和为1的向量;max范数将向量的每个元素除以其最大值,得到元素值在[0, 1]之间的向量。该函数返回的是标准化后的数据。 2. scale函数是另一种标准化数据方法,它将每个特征的值减去均值,再除以标准差。该函数返回的是标准化后的数据,其中每个特征的值都在[-3, 3]之间。 3. StandardScaler类是sklearn.preprocessing模块中的一个类,它提供了更加灵活的标准化方法。通过设置参数with_mean=True和with_std=True,该类可以对数据进行标准化处理,使得数据的均值为0,标准差为1。 综上所述,sklearn提供了多种标准化数据方法,可以根据需要选择不同的方法进行数据标准化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Sklearn上机笔记--标准化](https://blog.csdn.net/WSY_nian/article/details/127044728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值