MinMaxScaler 的奇怪输出

Weird output of MinMaxScaler

在学习 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.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]

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

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

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

这 returns 符合预期:

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

至于您对使用 MinMaxScaler 的疑虑,如果您的离群值与大多数值有很大不同,但仍然是有效数据,则可以使用 StandardScaler。

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