微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MinMaxScaler的奇怪输出

如何解决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)。

我所期望的示例:

[[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

这将按预期返回:

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

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

StandardScaler的使用方法与MinMaxScaler相同,但是它将缩放您的值,因此它们的平均值等于0,标准偏差等于1。由于将基于序列中的所有值找到这些值,因此更能抵御离群值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。