You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.8 KiB

3.2 数据预处理常用技巧---标准化

为什么要进行标准化

对于大多数数据挖掘算法来说,数据集的标准化是基本要求。这是因为有些数据挖掘算法中需要计算距离或梯度等信息,而这些信息需要数据中的特征处于同一量纲内才会有比较好的效果。

比如现在问你个问题,是 1000 克的棉花重,还是 1 公斤的铁重?你肯定能不假思索的回答:一样重!但是,有些数据挖掘算法会觉得 1000 克的棉花重,因为它并不会看 1000 后面的单位是克还是公斤。所以如果想要使用这类算法来进行数据挖掘,那么首先要做的事情就是对数据进行标准化,因为标准化能够解决特征量纲不一致的问题。

Z-score标准化

这种方法基于原始数据的均值和标准差进行数据的标准化。对特征A的原始值x使用z-score标准化,将其值标准化为到xz-score标准化方法适用于特征A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0附近,方差值为1。数学公式如下:


x^,=\frac{x-x_{mean}}{x_{std}}

sklearnpreprocessing模块中的函数scale实现了Z-score标准化的功能。实例代码如下:

# 导入preprocessing模块
from sklearn import preprocessing
# 导入numpy库
import numpy as np

# 定义数据该数据中有3条记录每条记录有3个特征
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])

# 对数据进行z-score标准化并将结果保存至X_scaled
X_scaled = preprocessing.scale(X_train)

# z-score标准化的结果
>>>X_scaled
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

从结果上看,可以看出scale函数好像起了作用,为了验证标准化是否正确,我们可以检查一下X_scaled的均值和方差。代码如下:

# 计算X_scaled中每个特征的均值发现全是0
>>> X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])

# 计算X_scaled中每个特征的方差发现全是1
>>> X_scaled.std(axis=0)
array([ 1.,  1.,  1.])

嗯,不错,scale成功地对数据进行了标准化。

Min-max标准化

Min-max标准化方法是对原始数据进行线性变换。设minAmaxA分别为特征A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间[0,1]中的值x',其公式为:


x^, = \frac{x-x_{min}}{x_{max}-x_{min}}

sklearnpreprocessing模块中的MinMaxScaler类的fit_transform函数实现了Min-max标准化的功能。实例代码如下:

# 导入preprocessing模块
from sklearn import preprocessing
# 导入numpy库
import numpy as np

# 定义数据该数据中有3条记录每条记录有3个特征
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])

# 实例化MinMaxScaler对象
min_max_scaler = preprocessing.MinMaxScaler()
# 对数据进行Min-max标准化并将结果保存至X_train_minmax
X_train_minmax = min_max_scaler.fit_transform(X_train)

# Min-max标准化的结果
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
      [ 1.        ,  0.5       ,  0.33333333],
      [ 0.        ,  1.        ,  0.        ]])

可以看出,经过Min-max标准化后,数据中的所有特征值都缩放到了[0, 1]的区间内。

MaxAbs标准化

MaxAbs的工作原理与Min-max非常相似,但是它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1] 范围内,这就意味着,训练数据应该是已经零中心化或者是稀疏数据。公式如下:


x^, = \frac{x}{x_{max}}

sklearnpreprocessing模块中的MaxAbsScaler类的fit_transform函数实现了MaxAbs标准化的功能。实例代码如下:

# 导入preprocessing模块
from sklearn import preprocessing
# 导入numpy库
import numpy as np

# 定义数据该数据中有3条记录每条记录有3个特征
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])

# 实例化MaxAbsScaler对象
max_abs_scaler = preprocessing.MaxAbsScaler()
# 对数据进行MaxAbs标准化并将结果保存至X_train_maxabs
X_train_maxabs = max_abs_scaler.fit_transform(X_train)

# MaxAbs标准化的结果
>>> X_train_maxabs
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])

可以看出,经过MaxAbs标准化后,数据中的所有特征值都缩放到了[-1, 1]的区间内。