持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天, 点击查看活动详情
标准化
why?标准化
对于大多数数据挖掘算法来说,数据集的标准化是基本要求。这是因为,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。
实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。在一个机器学习算法的目标函数里的很多元素所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。
Z-score
这种方法基于原始数据的均值mean和标准差standard deviation进行数据的标准化。
将特征A的原始值x使用z-score标准化到x’。
z-score标准化方法适用于特征A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0附近,方差值为1。
数学公式如下:
函数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',其公式为:
通过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_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]])
。
代码调用:
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映射,公式如下:
- Box-Cox ,
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)
本文简单的介绍了数据标准化的含义以及非线性转化的方法与理由。相信大家一定对数据预处理有了更加深刻的认识了吧~🤤