Python MinMaxScaler的奇怪输出

Python MinMaxScaler的奇怪输出,python,scikit-learn,data-science,normalizing,Python,Scikit Learn,Data Science,Normalizing,在学习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.

在学习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.        ]]
[[0.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
给出输出:

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.        ]]
[[0.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
第一个数组
[1,2]
被转换成
[0,0]
,在我看来这意味着:

  • 数字之间的比率消失了
  • 无值具有任何重要性(不再),因为它们都被设置为最小值(0)
我所期望的示例:

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.        ]]
[[0.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
这将保存比率并将数字置于0到1的范围内


我对
MinMaxScaler
有什么错误或误解?因为考虑到时间序列上的训练,将价格或温度等重要数字转换为上面所述的零碎数据是没有意义的?

MinMaxScaler根据给定的范围,使用下面的公式根据时间序列查找并转换特征。所以你的问题是关于使用的公式

公式:

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.        ]]
[[0.1, 0.2]
 [0.3, 0.4]
 [0.4, 0.5]]
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。由于这些值将基于序列中的所有值找到,因此它对异常值更为稳健