Normalization 根据上下文有不同的含义,有时该术语具有误导性。
我认为 sklearn 可以互换使用这些术语,表示将在不同尺度上测量的值调整为概念上常见的尺度(例如,在 0 和 1 之间),而不是更改数据以使其遵循正态分布(除了 StandardScaler,它执行此操作)。
据我了解,在 sklearn 中,它们的不同之处在于它们的工作输入、使用方式和使用位置。
我假设Normalization 是指sklearn.preprocessing.Normalizer。
因此,主要区别在于 sklearn.preprocessing.Normalizer 将 样本 缩放为单位范数(向量长度),而 sklearn.preprocessing.StandardScaler 在减去均值后将 特征 缩放为单位方差.
因此,前者适用于行,而后者适用于列。
特别是,
sklearn.preprocessing.normalize"scales input vectors individually to unit norm (vector length).'。它可以应用于行(通过将参数 axis 设置为 1)和特征/列(通过将参数 axis 设置为 0)。它使用以下规范之一:l1、l2 或 max 对每个非零样本(或如果轴为 0 时的每个非零特征)进行归一化。
注意:这里的术语规范是指数学定义。有关详细信息,请参阅 here 和 here。
sklearn.preprocessing.Normalizer"normalizes samples individually to unit norm."。当axis=1 时,它的行为与sklearn.preprocessing.normalize 完全相同。与normalize 不同,Normalizer 使用 Transformer API 执行规范化(例如,作为预处理 sklearn.pipeline.Pipeline 的一部分)。
sklearn.preprocessing.StandardScaler"standardizes features by removing the mean and scaling to unit variance"。它不使用向量的范数,而是计算每个特征的 z 分数。
这个有趣的article 探索更多它们之间的差异。
为了方便,我们使用norm='max':
from sklearn.preprocessing import normalize, Normalizer, StandardScaler
X = [[1, 2],
[2, 4]]
# Normalize column based on the maximum of each column (x/max(column))
normalize(X, norm='max', axis=0)
# Normalize column based on the maximum of each row (x/max(row))
normalize(X, norm='max', axis=1)
# Normalize with Normalizer (only rows)
Normalizer(norm='max').fit_transform(X)
# Standardize with StandardScaler (only columns)
StandardScaler().fit_transform(X)
from sklearn.pipeline import Pipeline
pipe = Pipeline([('normalization_step', normalize())] # NOT POSSIBLE
pipe = Pipeline([('normalization_step', Normalizer())] # POSSIBLE
pipe = Pipeline([('normalization_step', StandardScaler())] # POSSIBLE
pipe.score(X, y) # Assuming y exists
上述代码行将数据转换如下:
# Normalize with normalize, axis=0 (columns)
[[0.5, 0.5],
[1. , 1. ]]
# Normalize with normalize, axis=1 (rows)
[[0.5, 1],
[0.5, 1. ]]
# Normalize with Normalizer (rows)
[[0.5, 1],
[0.5, 1. ]]
# Standardize with StandardScaler (columns)
[[-1, -1],
[1, 1. ]]