0

我的 X_test 值超出了我在规范化函数中指定的范围,为什么我会得到这些值,我该如何解决?(在 X_train 和 X_test 中设置此范围 [:,14:] 是因为在我的数据集中,数值从该列开始)

  from sklearn.preprocessing import MinMaxScaler
  scalar = MinMaxScaler(feature_range=(-1,1))
  X_train[:,14:]=scalar.fit_transform(X_train[:,14:])
  X_test[:,14:]=scalar.transform(X_test[:,14:])  

通过绘制 X_train 和 X_test,我们可以看出 X_train 中的值在范围内,而在 X_test 中有一些值超出了该范围。

这是 X_train 图

在此处输入图像描述

这是 X_test 图

在此处输入图像描述

为什么会这样?

4

2 回答 2

2

您正在训练集fit上使用,应该这样做。

这意味着在公式 (X - X_min) / (X_max - X_min) 中,X_min 和 X_max 分别指的是训练集中的最小值和最大值,而不是测试集。

因此,如果您的测试集中的值超出了训练集中的最小值和最大值,则测试集中的这些值将通过简单的算术映射到您提供的值之外。feature_range

在您的情况下不必担心,测试集缩放值非常接近feature_range您提供的值。

只需确保测试中的值与训练集中的值没有完全不同。您可以考虑删除测试集中的异常值来解决问题。

于 2020-09-01T17:24:39.180 回答
1

你做的一切都是正确的,这是正常的行为。

让我们看一下官方文档,让您了解发生了什么,唯一的区别是我们使用 feature_range=(0, 1) 而不是 (-1,1)。

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

>>> scaler = MinMaxScaler()
>>> print(scaler.fit_transform(data))
[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]

这里发生了什么?训练数据通过以下方式转换:

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

其中 max 和 min 在特征范围内

所以我们在 0 - 1 的范围内

现在我们正在为新的测试集运行它,我们不再适合缩放器,就像您在您的情况下所做的那样:

>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]

如您所见,输出也在范围之外。发生这种情况是因为对于第一个值,公式是:

X_std = (2 - -1) / (1 - -1) = 3/2
X_scaled = 3/2* (1+0) +0  = 1.5
于 2020-09-03T05:26:37.503 回答