继续创造,加快成长!这是我参与「日新计划 10 月更文挑战」的第5天,点击查看活动详情

规范化

why?规范化

关于大多数数据挖掘算法来说,数据集的规范化是基本要求。这是因为,假如特征不服从或许近似服从规范正态散布(即,零均值、单位规范差的正态散布)的话,算法表现大打折扣

实际上,咱们经常疏忽数据的散布形状,而只是做零均值、单位规范差的处理。在一个机器学习算法的目标函数里的许多元素所有特征都近似零均值,方差具有相同的阶。假如某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。

Z-score

这种办法基于原始数据的均值mean和规范差standard deviation进行数据的规范化。

将特征A的原始值x使用z-score规范化到x’。

z-score规范化办法适用于特征A的最大值最小值不知道的情况,或有超出取值规模的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最终得到的结果是,对每个特征/每列来说所有数据都集合在0附近,方差值为1。

数学公式如下:

x′=x−xmeanxstdx^{‘} = \frac {x-x_{mean}}{x_{std}}

函数scale数组形状的数据集的规范化提供了方便的实现方式:

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)
>>>X_scaled
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])
>>> X_scaled.mean(axis=0) # 均值为0
array([ 0.,  0.,  0.])
>>> X_scaled.std(axis=0) # 规范方差1
array([ 1.,  1.,  1.])

Min-max

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

x′=x−xminxmax−xminx^{‘} = \frac {x-x_{min}}{x_{max}-x_{min}}

通过MinMaxScaler实现:

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
      [ 1.        ,  0.5       ,  0.33333333],
      [ 0.        ,  1.        ,  0.        ]])

MaxAbs

MaxAbs通过除以每个特征的最大值将练习数据特征缩放至 [-1, 1] 规模内,这就意味着,练习数据应该是已经零中心化或许是稀疏数据。

公式如下: x′=xxmaxx’ = \frac {x}{x_{max}}

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
>>> X_train_maxabs
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])

非线性转化

why? 非线性转化便是将特征映射到均匀散布或许高斯散布(正态散布)

均匀散布

相比线性缩放,该办法不受异常值影响,它将数据映射到了零到一的均匀散布上,将最大的数映射为1,最小的数映射为0。其它的数按从小到大的次序均匀散布在0到1之间,如有相同的数则取平均值。

如数据为np.array([[1],[2],[3],[4],[5]])则通过转换为:np.array([[0],[0.25],[0.5],[0.75],[1]]).

数据为np.array([[1],[2],[9],[10],[2]])则通过转换为:np.array([[0],[0.375],[0.75],[1.0],[0.375]])

「Python」sklearn第一弹-标准化和非线性转化
代码调用:

from sklearn.preprocessing import QuantileTransformer
import numpy as np
data = np.array([[1],[2],[3],[4],[5]])
quantile_transformer = QuantileTransformer(random_state=666)
data = quantile_transformer.fit_transform(data)
>>>data
array([[0.  ],
       [0.25],
       [0.5 ],
       [0.75],
       [1.  ]])

高斯散布

映射到高斯散布是为了稳定方差,并最小化偏差。在最新版sklearn 0.20.x中PowerTransformer现在有两种映射办法

  • Yeo-Johnson映射,公式如下:

xi={[(xi+1)−1],if≠0,xi≥0ln(xi)+1,if=0,xi≥0−[(−xi+1)2−−1]/(2−),if≠2,xi<0−ln(−xi+1),if=2,xi<0x_{i}^{\lambda}=\begin{cases} [(x_i+1)^{\lambda}-1],if \lambda\neq0,x_i \ge0\\\\ ln(x_i)+1,if\lambda=0,x_i \ge0 \\\\ -[(-x_i+1)^{2-\lambda}-1]/(2-\lambda),if \lambda \neq2,x_i <0 \\\\ -ln(-x_i+1),if \lambda=2,x_i < 0\end{cases}

  • Box-Cox , xi={xi−1,if≠0ln(xi),if=0x_i^{\lambda}=\begin{cases}\frac {x_i^{\lambda}-1}{\lambda}, if \ \lambda \neq0 \\\\ ln(x_i),if \ \lambda=0 \end{cases}
from sklearn.preprocessing import PowerTransformer
import numpy as np
data = np.array([[1],[2],[3],[4],[5]])
pt = PowerTransformer(method='box-cox', standardize=False)
data = pt.fit_transform(data)

本文简略的介绍了数据规范化的意义以及非线性转化的办法与理由。相信我们必定对数据预处理有了更加深刻的认识了吧~

往期好文推荐

「MongoDB」Win10版装置教程

「Python」数字推盘游戏

「Python」sklearn第一弹-规范化和非线性转化

「Python」turtle制作图形