【问题标题】:Difference between standardscaler and Normalizer in sklearn.preprocessingsklearn.preprocessing中standardscaler和Normalizer之间的区别
【发布时间】:2016-12-31 10:46:52
【问题描述】:

sklearn.preprocessing 模块中的standardscaler和normalizer有什么区别? 两者不做同样的事情吗?即使用偏差去除均值和尺度?

【问题讨论】:

    标签: machine-learning statistics scikit-learn


    【解决方案1】:

    来自Normalizer 文档:

    具有至少一个非零分量的每个样本(即数据矩阵的每一行)独立于其他样本重新缩放,使其范数(l1 或 l2)等于 1。

    还有StandardScaler

    通过去除均值和缩放到单位方差来标准化特征

    换句话说,Normalizer 作用于 row-wise 和 StandardScaler column-wise。归一化器不会通过偏差去除均值和比例,而是将整行缩放到单位范数。

    【讨论】:

    • 我是数据科学的新手。如果列多于行,则在不确定用例是否正确的地方阅读,然后使用 StandardScaler 其他明智的规范化器
    【解决方案2】:

    Ben 的 visualizationarticle 非常有助于说明这个想法。

    StandardScaler 假定您的数据通常分布在每个特征中。通过“去除均值并缩放到单位方差”,您现在可以在图片中看到它们具有相同的“比例”,而不管其原始比例如何。

    【讨论】:

      【解决方案3】:

      除了@vincentlcy 极好的建议查看this 文章,现在Scikit-Learn 文档here 中有一个示例。一个重要的区别是Normalizer() 应用于每个样本(即行)而不是列。这可能仅适用于符合其假设每列中的数据类型相似的某些数据集。

      【讨论】:

        【解决方案4】:

        StandardScaler() 通过去除均值并缩放到单位方差来标准化特征(例如人物数据的特征,即身高、体重)。

        (单位方差:单位方差意味着样本的标准差以及方差会随着样本量趋于无穷大而趋于1。)

        Normalizer() 重新调整每个样本。例如,独立地重新调整每家公司的股票价格。

        有些股票比其他股票贵。为了解决这个问题,我们将其标准化。 Normalizer 将分别将每家公司的股票价格转换为相对规模。

        【讨论】:

          【解决方案5】:

          主要区别在于标准标量应用于列,而规范化器应用于行,因此请确保在规范化之前重塑数据。

          【讨论】:

          • 我认为规范化器有一个轴参数,因此可以应用于行列...
          【解决方案6】:

          StandardScaler 通过去除均值和缩放到单位方差来标准化特征,Normalizer 重新缩放每个样本。

          【讨论】:

            【解决方案7】:

            也许是一个有用的例子:

            使用 Normalizer,默认操作似乎是将一行中的每个数据点除以该行的 范数。

            例如,给定一行[4,1,2,2], 范数为:。

            那么规范化的行是:

            [4/5, 1/5, 2/5, 2/5]= [0.8, 0.2, 0.4, 0.4]
            

            这是 SKLearn 文档中示例的第一行。

            【讨论】:

              【解决方案8】:

              根据@TerrenceJ 的答案,这里是手动计算来自第一个SKLearn documentation 示例的Normalizer 转换结果的代码(请注意,这反映了默认的“l2”归一化)。

              # create the original example
              X = [[4, 1, 2, 2],
                   [1, 3, 9, 3],
                   [5, 7, 5, 1]]
              
              
              
              # Manual Method:
              
              # get the square root of the sum of squares for each record ("row")
              import numpy as np
              div = [np.sqrt(np.sum(np.power(X[i], 2))) for i in range(len(X))]
              
              # divide each value by its record's respective square root of the sum of squares
              np.array([X[k] / div[k] for k in range(len(X))])
              
              # array([[0.8, 0.2, 0.4, 0.4],
              #        [0.1, 0.3, 0.9, 0.3],
              #        [0.5, 0.7, 0.5, 0.1]])
              
              
              
              # SKLearn API Method:
              
              from sklearn.preprocessing import Normalizer
              Normalizer().fit_transform(X)
              
              # array([[0.8, 0.2, 0.4, 0.4],
              #        [0.1, 0.3, 0.9, 0.3],
              #        [0.5, 0.7, 0.5, 0.1]])
              
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-12-12
                • 2019-06-01
                • 2019-06-04
                • 2021-08-08
                • 1970-01-01
                • 2021-12-25
                • 2020-05-10
                • 2014-09-20
                相关资源
                最近更新 更多