首页 > 解决方案 > MinMaxScaling 没有返回正确的值

问题描述

我有一个大数组(形状为 (125501, 34000)),我正在尝试使用 MinMaxScaling,但输出的缩放数组完全错误:

from sklearn.preprocessing import MinMaxScaler 

print dataset
[[  124    77 10743 ...    28    56     1]
 [    0     0   189 ...     0     0     0]
 [    0     0  1518 ...     0     0     0]
 ...
 [    1     0     0 ...     0     0     0]
 [   35     5     2 ...     0     0     0]
 [   29     8     1 ...     2     1     0]]

mx = MinMaxScaler(feature_range=(0,1))
scaled = mx.fit_transform(dataset)

print scaled
[[0.99988379 0.99997088 0.99958496 ... 0.99999933 0.99996154 0.99999913]
 [0.99988374 0.99997084 0.99958004 ... 0.99999931 0.99996151 0.99999913]
 [0.99988374 0.99997084 0.99958066 ... 0.99999931 0.99996151 0.99999913]
 ...
 [0.99988374 0.99997084 0.99957995 ... 0.99999931 0.99996151 0.99999913]
 [0.99988375 0.99997084 0.99957996 ... 0.99999931 0.99996151 0.99999913]
 [0.99988375 0.99997084 0.99957996 ... 0.99999931 0.99996151 0.99999913]]

所有的输出值似乎都介于 0.996 和 0.999 之间,尽管显然情况并非如此。例如,每个特征的最大值是:

print mx.data_max_
[249706.  62620. 902419. ...   1475.  82652.   1879.]

与最大值 (249706) 相比,第一列有一些非常小的值(例如 124、0、35 等),但输出仍然是 ~0.999。

有谁知道为什么会这样?

标签: pythonscikit-learn

解决方案


一个可能的原因可能是每个特征列中的最小值和所有其他值之间是否存在巨大差异(正如评论中提到的@Kevin Fang)。您可以尝试使用如下示例数据集:

import numpy as np
from sklearn.preprocessing import MinMaxScaler 

dataset = [[150, -1000], [125, 775], [175, 700], [-1000, 725]]
print(np.array(dataset))

输入数据集:

[[  150 -1000]
 [  125   775]
 [  175   700]
 [-1000   725]]

因为数据集中每列的最小值和每列中的每个其他数字都存在差异。

mx = MinMaxScaler(feature_range=(0,1))
scaled = mx.fit_transform(dataset)
print(scaled)

输出:

[[ 0.9787234   0.        ]
 [ 0.95744681  1.        ]
 [ 1.          0.95774648]
 [ 0.          0.97183099]]

除了每列的最小值(0)之外,所有其他值都很高。因此,您可能必须在处理前处理异常值(最少)。

sklearn 文档中关于它的计算方式如下:

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

X_scaled = X_std * (max - min) + min


推荐阅读