【问题标题】:Normalization vs Scaling for not normal distribution in Scikit-learnScikit-learn 中非正态分布的归一化与缩放
【发布时间】:2020-07-02 05:41:04
【问题描述】:

在我的大学项目中,我得到的数据具有不同范围的值,也不是正态分布。我已经阅读了sklearn normalization 的函数文档,它说规范化是一个将单个样本缩放为具有单位规范的过程。同样在 sklearn 中有 NormalizationStandardScaler 它们似乎具有相同的功能,即缩放数据。但是后来我读到this article 告诉了缩放和标准化之间的区别,通过说 标准化是您达到正态分布的方式缩放是您划分范围的方式数据

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

【问题讨论】:

    标签: python scikit-learn scale normalize


    【解决方案1】:

    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)和特征/列(通过将参数 axis 设置为 0)。它使用以下规范之一:l1l2max 对每个非零样本(或如果轴为 0 时的每个非零特征)进行归一化。 注意:这里的术语规范是指数学定义。有关详细信息,请参阅 herehere

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

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2014-10-24
      • 2017-09-11
      • 2016-12-27
      • 2012-10-30
      • 1970-01-01
      • 2018-09-07
      • 2019-01-10
      • 2021-06-06
      相关资源
      最近更新 更多