07-预处理数据之标准化、归一化

2019-03-21  本文已影响0人  wshsdm

安装wordcloud:

 python -m pip install --upgrade pip

pip install wordcloud

sklearn.preprocessing是sklearn库中非常重要的一个module,集成了很多预处理数据的方法

1 标准化

标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。

标准化通过计算训练集中样本的相关统计量(均值和单位方差),存储均值和标准差,对每个特征单独进行中心化和缩放,使用变换方法对测试数据进行使用。

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

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

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

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

可用的方法有:

.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]) 为以后的缩放在线计算均值和标准差

代码:

from sklearn.preprocessingimport 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_)

print(scaler.transform(data))

print(scaler.transform([[2,2]]))

输出:

2 二值化

归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

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

代码:

# 二值化

from sklearn.preprocessingimport Binarizer

X = [[1., -1.,2.],

[2.,0.,0.],

[0.,1., -1.]]

binary = Binarizer()

transformer =binary.fit(X)# fit does nothing.

print(transformer)

# Binarizer(copy=True, threshold=0.0)

Y=transformer.transform(X)

print(Y)

输出:

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

3  归一化和标准化的区别

归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。

标准化和中心化的区别:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。

无量纲:通过某种方法能去掉实际过程中的单位,从而简化计算。

4 最小最大化(属性缩放)

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做反最小最大化,即还原过程

代码:

from sklearn.preprocessingimport MinMaxScaler

data = [[-1,2], [-0.5,6], [0,10], [1,18]]

scaler = MinMaxScaler()

print(scaler.fit(data))

print(scaler.data_max_)

print(scaler.transform(data))

print(scaler.transform([[2,2]]))

结果:

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

上一篇下一篇

猜你喜欢

热点阅读