Scikit-learn 中非正态分布的标准化与缩放

Normalization vs Scaling for not normal distribution in Scikit-learn

在我的大学项目中,我得到的数据具有不同的值范围,也不是正态分布。我已经阅读了 sklearn normalization it said normalization is a process of scaling individual samples to have unit norm. Also in sklearn there are Normalization and StandardScaler they seemed to have same function that is to scale the data. But then I read this article 函数的文档,通过说 规范化是您达到正态分布 和 [=15 的方式来区分缩放和规范化之间的区别=]缩放是您调整数据范围的方式。

  1. 为什么 sklearn 规范化函数与 StandardScaler 具有相同的功能,如果两者都应该对数据做不同的事情?
  2. 这是否意味着通过缩放我们可以达到正态分布并且缩放实际上是规范化分布的一种方式?
  3. 对于我的情况,如果我有各种范围的值而不是正态分布,如果归一化和缩放是不同的东西那么这意味着我必须缩放 来归一化我的数据?

Normalization 根据上下文有不同的含义,有时该术语具有误导性。 我认为 sklearn 可以互换使用这些术语,意思是 将在不同尺度上测量的值调整为概念上的通用尺度 (例如,在 0 和 1 之间),而不是更改数据,使它们遵循正态分布(StandardScaler 除外,它会这样做)。

据我了解,在 sklearn 中,它们的不同之处在于它们处理的输入以及它们的使用方式和使用位置。

我假设 Normalization 你的意思是 sklearn.preprocessing.Normalizer

因此,主要区别在于 sklearn.preprocessing.Normalizer 样本 缩放为单位范数(向量长度),而 sklearn.preprocessing.StandardScaler 缩放 特征减去均值后的单位方差。 因此,前者在上工作,而后者在.

上工作

特别是,

  1. sklearn.preprocessing.normalize"scales input vectors individually to unit norm (vector length).'。它可以应用于行(通过将参数 axis 设置为 1)和 features/columns(通过将参数 axis 设置为 0)。它使用以下范数之一:l1l2max 来归一化每个非零样本(或者如果轴为 0,则每个非零特征)。 注:这里的范数指的是数学定义。有关详细信息,请参阅 here and here

  2. sklearn.preprocessing.Normalizer"normalizes samples individually to unit norm."。当 axis=1 时,它的行为与 sklearn.preprocessing.normalize 完全相同。与 normalize 不同,Normalizer 使用 Transformer API 执行规范化(例如作为预处理的一部分 sklearn.pipeline.Pipeline)。

  3. 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. ]]