【问题标题】:Why do I have values ​outside the normalization range in my test set?为什么我的测试集中有超出标准化范围的值?
【发布时间】:2020-12-20 20:25:54
【问题描述】:

我得到的 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 图

为什么会这样?

【问题讨论】:

    标签: python scikit-learn neural-network conv-neural-network biological-neural-network


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      让我们看看官方的docs 让您了解发生了什么,唯一的区别是我们使用 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
      

      where max and min in the feature range

      所以我们得到的范围是 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-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多