MinMaxScaling没有返回正确的值

时间:2018-10-02 23:28:11

标签: python scikit-learn

我有一个大数组(形状为(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。

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

一个可能的原因可能是每个要素列中的最小值与其他值之间是否存在巨大差异(如评论中提到的@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 documentation开始,其计算方式如下:

  

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

     

X_scaled = X_std *(max-min)+ min

答案 1 :(得分:0)

作为一个小练习,我们可以从OP中提供的数据中invert the transformation,从而推断出所显示列的最小值:

import numpy as np

x_before = np.array([124, 77, 10743, 28, 56, 1])
x_after = np.array([0.99988379, 0.99997088, 0.99958496, 0.99999933, 0.99996154, 0.99999913])
max_vals = np.array([249706, 62620, 902419, 1475, 82652, 1879])
min_vals = (x_before - x_after*max_vals) / (1 - x_after)
print(min_vals)

哪个输出:

[-2.14743122e+09 -2.14770524e+09 -2.14750737e+09 -2.15970002e+09
 -2.14749925e+09 -2.15861881e+09]

反过来表明@student's answer在上面。