MinMaxScaler 的 ValueError inverse_transform

ValueError with MinMaxScaler inverse_transform

我正在尝试将 LSTM 网络拟合到数据集。

我有以下数据集:

0      17.6  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
1      38.2  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
2      39.4  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
3      38.7  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
4      39.7  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
...     ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...   
17539  56.9  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
17540  51.1  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
17541  46.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
17542  44.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  0.0  0.0  0.0   
17543  40.2  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ...  1.0  0.0  0.0   

        27   28   29   30   31   32   33  
0      0.0  0.0  1.0  0.0  0.0  1.0  0.0  
1      0.0  0.0  1.0  0.0  0.0  1.0  0.0  
2      0.0  0.0  1.0  0.0  0.0  1.0  0.0  
3      0.0  0.0  1.0  0.0  0.0  1.0  0.0  
4      0.0  0.0  1.0  0.0  0.0  1.0  0.0  
...    ...  ...  ...  ...  ...  ...  ...  
17539  0.0  0.0  0.0  0.0  1.0  0.0  1.0  
17540  0.0  0.0  0.0  0.0  1.0  0.0  1.0  
17541  0.0  0.0  0.0  0.0  1.0  0.0  1.0  
17542  0.0  0.0  0.0  0.0  1.0  0.0  1.0  
17543  0.0  0.0  0.0  0.0  1.0  0.0  1.0

形状:

[17544 rows x 34 columns]

然后我用 MinMaxScaler 缩放它如下:

scaler = MinMaxScaler(feature_range=(0,1))
data = scaler.fit_transform(data)

然后我使用一个函数来创建我的火车,测试数据集的形状:

X_train :  (12232, 24, 34)
Y_train :  (12232, 24)

X_test :  (1708, 24, 34)
Y_test :  (1708, 24)

拟合模型并预测测试集的值后,我需要缩小到原始值并执行以下操作:

test_predict  = model.predict(X_test)
test_predict  = scaler.inverse_transform(test_predict)
Y_test = scaler.inverse_transform(Y_test)

但我收到以下错误:

ValueError: operands could not be broadcast together with shapes (1708,24) (34,) (1708,24) 

我该如何解决?

逆变换要求数据与变换后生成的数据具有相同的形状,即具有 34 列。这不是你的 test_predict 的情况,也不是你的 y_test.

的情况

此外,虽然与您的错误无关,但您犯了先缩放然后拆分到 train/test 的错误,这不是正确的方法,因为它会导致数据泄漏。

以下是解决此问题的必要步骤:

  1. 首先拆分训练和测试集
  2. 使用 两个 不同的缩放器分别对特征和输出转换 X_trainy_train,如我在 中所示;你应该在这里使用.fit_transform
  3. 用转换后的 X_trainy_train 拟合您的模型(旁注:最好为不同版本的数据使用不同的名称,而不是覆盖现有的名称)。
  4. 要使用测试数据 X_testy_test 评估您的模型,首先使用步骤 #2 中的相应缩放器对它们进行转换;你应该在这里使用.transform不是.fit_transform)。
  5. 为了让您的 预测 y_pred 恢复到原始 y_test 的规模,您应该使用各自的 .inverse_transform缩放器在他们身上。当然不需要对转换后的 X_testy_test 进行逆变换 - 您已经有了这些值!