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

问题描述 投票:0回答:2

在我的大学项目中,我得到的数据具有各种值范围,而且不服从正态分布。我已经阅读了sklearn归一化函数的文档,它说归一化是缩放单个样本以获得单位范数的过程。另外,在 sklearn 中还有

Normalization
StandardScaler
它们似乎具有相同的功能,即缩放数据。但后来我读到了这篇文章,通过说标准化是达到正态分布的方式,而缩放是对数据进行范围化的方式,讲述了缩放和归一化之间的区别。

  1. 为什么 sklearn Normalization 函数与 StandardScaler 具有相同的功能,如果两者都应该对数据做不同的事情?
  2. 这是否意味着通过缩放我们可以达到正态分布,而缩放实际上是分布标准化的方法之一?
  3. 对于我的情况,如果我有各种范围的值并且不是正态分布,如果标准化和缩放是不同的事情那么这意味着我必须缩放来标准化我的数据?
python scikit-learn scale normalize
2个回答
4
投票

标准化根据上下文有不同的含义,有时该术语会产生误导。 我认为 sklearn 可以互换使用这些术语,意思是“将不同尺度上测量的值调整为名义上的通用尺度”(例如,0 到 1 之间),而不是更改数据以使它们遵循正态分布(除了 StandardScaler,这样做)。 根据我的理解,在 sklearn 中,它们的不同之处在于它们处理的输入以及它们的使用方式和用途。

我认为

Normalization

你的意思是

sklearn.preprocessing.Normalizer

因此,主要区别在于,在减去平均值后,

sklearn.preprocessing.Normalizer

samples
缩放到单位范数(向量长度),而sklearn.preprocessing.StandardScaler
features
缩放到单位方差。 因此,前者作用于,而后者作用于 特别是,

  1. sklearn.preprocessing.normalize

    “将输入向量单独缩放到单位范数(向量长度)。'
    。它可以应用于行(通过将参数 axis 设置为 1)和特征/列(通过设置参数
    axis
    到 0)。它使用以下范数之一:
    l1
    l2
    max
    来标准化每个非零样本(或每个非零特征,如果轴为 0)。
    注意:
    这里的术语范数指的是数学定义。请参阅此处此处了解更多信息。

  2. sklearn.preprocessing.Normalizer

    “将样本单独归一化为单位范数。”
    。当 sklearn.preprocessing.normalize 时,它的行为与
    axis=1
    完全相同。与
    normalize
    不同,
    Normalizer
    使用 Transformer API 执行标准化(例如,作为预处理 sklearn.pipeline.Pipeline 的一部分)。
    
    

  3. sklearn.preprocessing.StandardScaler

    “通过删除均值并缩放至单位方差来标准化特征”
    。它不使用向量的范数,而是计算每个特征的 z 分数。

  4. 这篇有趣的
文章

更多地探讨了它们之间的差异。 为了方便起见,让我们使用

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



0
投票

这不是真的 - 标准缩放器只是通过减去平均值并除以标准差来缩放数据。它不会以某种方式改变数据分布的形状。

© www.soinside.com 2019 - 2024. All rights reserved.