原文链接:https://www.zhihu.com/question/20467170/answer/839255695,感谢作者
通常来说,它们都是指特征工程中的特征缩放过程,由于中文翻译的原因,网上对它们的解释也是五花八门,但其实我们不考虑它们的名字,直接看它们的作用和操作方法,可能会更容易理解。
使用特征缩放的作用是:
使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确。
加快学习算法的收敛速度。
参考sklearn的官方文档的数据预处理章节,
5.3. Preprocessing datascikit-learn.org
缩放过程可以分为以下几种:
缩放到均值为0,方差为1(Standardization——StandardScaler())
缩放到0和1之间(Standardization——MinMaxScaler())
缩放到-1和1之间(Standardization——MaxAbsScaler())
缩放到0和1之间,保留原始数据的分布(Normalization——Normalizer())
1就是常说的z-score归一化,2是min-max归一化。
举个例子来看看它们之间的区别,假设一个数据集包括「身高」和「体重」两个特征,它们都满足正态分布,画出原始数据图像为:
使用1.StandardScaler()缩放,结果为:
使用2.MinMaxScaler()缩放,结果为:
使用3.MaxAbsScaler()缩放,结果为:
使用4.Normalizer()缩放,结果为:
按需选择。
附:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing
def plot(data, title):
sns.set_style('dark')
f, ax = plt.subplots()
ax.set(ylabel='frequency')
ax.set(xlabel='height(blue) / weight(green)')
ax.set(title=title)
sns.distplot(data[:, 0:1], color='blue')
sns.distplot(data[:, 1:2], color='green')
plt.savefig(title + '.png')
plt.show()
np.random.seed(42)
height = np.random.normal(loc=168, scale=5, size=1000).reshape(-1, 1)
weight = np.random.normal(loc=70, scale=10, size=1000).reshape(-1, 1)
original_data = np.concatenate((height, weight), axis=1)
plot(original_data, 'Original')
standard_scaler_data = preprocessing.StandardScaler().fit_transform(original_data)
plot(standard_scaler_data, 'StandardScaler')
min_max_scaler_data = preprocessing.MinMaxScaler().fit_transform(original_data)
plot(min_max_scaler_data, 'MinMaxScaler')
max_abs_scaler_data = preprocessing.MaxAbsScaler().fit_transform(original_data)
plot(max_abs_scaler_data, 'MaxAbsScaler')
normalizer_data = preprocessing.Normalizer().fit_transform(original_data)
plot(normalizer_data, 'Normalizer')
robust_scaler_data = preprocessing.RobustScaler().fit_transform(original_data)
plot(robust_scaler_data, 'RobustScaler')