【问题标题】:Weird output of MinMaxScalerMinMaxScaler 的奇怪输出
【发布时间】:2021-02-08 00:11:31
【问题描述】:

在学习 ML 的过程中,我对 sklearn 提供的 MinMaxScaler 感到困惑。目标是将数值数据标准化为[0, 1]的范围。

示例代码:

from sklearn.preprocessing import MinMaxScaler

data = [[1, 2], [3, 4], [4, 5]]
scaler = MinMaxScaler(feature_range=(0, 1))
scaledData = scaler.fit_transform(data)

提供输出:

[[0.         0.        ]
 [0.66666667 0.66666667]
 [1.         1.        ]]

第一个数组[1, 2] 被转换为[0, 0] 在我看来意味着:

  • 数字之间的比例消失了
  • 没有任何值具有任何重要性(不再),因为它们都被设置为最小值 (0)。

我所期望的示例:

[[0.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]

这将保存比率并将数字放入0到1的范围内。

我在这里对MinMaxScaler 做错了什么或误解了什么?因为考虑诸如时间序列训练之类的事情,将价格或温度等重要数字转换为上述破碎的东西是没有意义的?

【问题讨论】:

    标签: python scikit-learn data-science normalizing


    【解决方案1】:

    MinMaxScaler 根据documentation 使用以下公式根据给定范围查找和转换特征。所以你的问题是关于使用的公式。

    公式:

    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    X_scaled = X_std * (max - min) + min
    

    让我们尝试看看当您在数据上使用它时会发生什么。 您需要为此使用 numpy。

    from sklearn.preprocessing import MinMaxScaler
    import numpy as np
    
    scaler = MinMaxScaler()
    
    data = [[1, 2], [3, 4], [4, 5]]
    
    # min to max range is given from the feature range you specify
    min = 0
    max = 1
    
    X_std = (data - np.min(data, axis=0)) / (np.max(data, axis=0) - np.min(data, axis=0))
    
    X_scaled = X_std * (max - min) + min
    

    这会按预期返回:

    array([[0.        , 0.        ],
           [0.66666667, 0.66666667],
           [1.        , 1.        ]])
    

    至于您对使用 MinMaxScaler 的疑问,如果您的异常值与大多数值完全不同,但仍然是有效数据,您可以使用 StandardScaler。

    StandardScaler 的使用方式与 MinMaxScaler 相同,但它会缩放您的值,使它们的平均值等于 0,标准差等于 1。由于这些值将根据系列中的所有值来找到,所以它很多对异常值更稳健。

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 2021-12-03
      • 2015-02-18
      • 2011-06-14
      • 2013-06-04
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多