标准化和归一化什么区别?

关注者
829
被浏览
1,925,662

33 个回答

通常来说,它们都是指特征工程中的特征缩放过程,由于中文翻译的原因,网上对它们的解释也是五花八门,但其实我们不考虑它们的名字,直接看它们的作用和操作方法,可能会更容易理解。

使用特征缩放的作用是:

  1. 使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确。
  2. 加快学习算法的收敛速度。

参考sklearn的官方文档的数据预处理章节,

缩放过程可以分为以下几种:

  1. 缩放到均值为0,方差为1(Standardization——StandardScaler())
  2. 缩放到0和1之间(Standardization——MinMaxScaler())
  3. 缩放到-1和1之间(Standardization——MaxAbsScaler())
  4. 缩放到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')