【问题标题】:Python for loop prediction tuple error - LSTM modelPython for 循环预测元组错误 - LSTM 模型
【发布时间】:2020-06-18 21:48:17
【问题描述】:

我已经构建了一个 1 层 LSTM 模型,该模型可以预测未来 1 小时内的未来叫车需求。

为了测试稳健性,我想多次重复预测并平均 RSME 分数。在这个example之后,我想用一个for循环来实现这个。

这段代码包括一个适合 LSTM 模型的函数和一个进行预测的函数:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from statsmodels.tools.eval_measures import rmse
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from math import sqrt

def fit_lstm(x_train_scaled, y_train_scaled, batch, ep, neurons_lstm, neuron_dense):
    model = Sequential()
    model.add(LSTM(units=neurons_lstm, input_shape=(x_train_scaled.shape[1], x_train_scaled.shape[2])))
    model.add(Dropout(rate=0.2))
    model.add(Dense(units=neuron_dense))
    model.compile(loss="mean_squared_error", 
                  optimizer="adam",
                 )

    history = model.fit(x_train_scaled, 
                    y_train_scaled, 
                    epochs=ep, 
                    batch_size=batch, 
                    validation_split=0.1, 
                    verbose=2, 
                    shuffle=False)
    return model, history

def predictions_lstm(x_test_scaled, y_test):
    # get predictions
    test_pred = model.predict(x_test_scaled)

    # reverse transform predictions
    test_pred_inv = y_scaler.inverse_transform(test_pred)

    # reverse differencing predictions
    inverted_pred = list()
    for i in range(len(test_pred_inv)):
        value = inverse_difference(df_lstm.iloc[:,0], test_pred_inv[i], len(test_pred_inv)-i)
        inverted_pred.append(value)
    inverted_pred = pd.DataFrame(inverted_pred)

    # reverse differencing y_test
    inverted_ytest = list()
    for i in range(len(y_test)):
        value = inverse_difference(df_lstm.iloc[:,0], y_test[i], len(y_test)+1-i)
        inverted_ytest.append(value)
    inverted_ytest = pd.DataFrame(inverted_ytest)

    # create single dataframe with predictions (1) and expected values (2)
    predictions = np.concatenate((inverted_pred, inverted_ytest), axis=1)
    predictions = pd.DataFrame(predictions)

    return test_pred, test_pred_inv, predictions

这是导致元组错误的函数。如您所见,我使用上面的预测函数创建了一个 for 循环。

repeats = 30
error_scores = list()

def repeat_pred_lstm(repeats):
    for i in range(repeats):
        # fit the model
        model= fit_lstm(x_train_scaled, 
                    y_train_scaled, 
                    batch=100, ep=10, 
                    neurons_lstm=5, 
                    neuron_dense=1)
        # make predictions
        predictions = predictions_lstm(x_test_scaled, y_test)
        # report performance
        rmse = sqrt(mean_squared_error(predictions[0], predictions[1]))
        mse_error = rmse**2
        error_scores.append(rmse)

    # summarize the results
    results = pd.DataFrame()
    results["rmse"] = error_scores
    print(results.head())
    print(results.describe())
    results.boxplot()

    return results

results = repeat_pred_lstm(repeats)

但是,for 循环给了我以下错误,我不明白,因为据我了解,预测函数中没有元组对象。据我了解,对 LSTM 模型进行预测的输入总是必须是一个 numpy 数组而不是元组。:

    AttributeError                            Traceback (most recent call last)
<ipython-input-44-8c61191ae4b3> in <module>
     27     return results
     28 
---> 29 results = repeat_pred_lstm(repeats)

<ipython-input-44-8c61191ae4b3> in repeat_pred_lstm(repeats)
     11                         neuron_dense=1)
     12         # make predictions
---> 13         predictions = predictions_lstm(x_test_scaled, y_test)
     14         # report performance
     15         rmse = sqrt(mean_squared_error(predictions[0], predictions[1]))

<ipython-input-39-5b4f5fdbedd3> in predictions_lstm(x_test_scaled, y_test)
      1 def predictions_lstm(x_test_scaled, y_test):
      2     # get predictions
----> 3     test_pred = model.predict(x_test_scaled)
      4 
      5     # reverse transform predictions

AttributeError: 'tuple' object has no attribute 'predict'

当我使用“predictions_lstm(x_test_scaled, y_test) 函数”进行一次预测时,我能够获得 RMSE 分数,但是当我使用 for 循环时,“predictions_lsmt(x_test_scaled, y_test) 函数”给出错误.

谁能告诉我我错过了什么?

感谢您的帮助!

【问题讨论】:

    标签: python keras lstm


    【解决方案1】:

    fit_ltsm 返回一个元组:return model, history。 但是,您不处理历史片段,这意味着您将模型设置为整个元组,而不是实际模型:

     model= fit_lstm(x_train_scaled, 
                        y_train_scaled, 
                        batch=100, ep=10, 
                        neurons_lstm=5, 
                        neuron_dense=1)
    

    您可以通过将返回分成两个变量来解决此问题,例如:

      model, history = fit_ltsm(. . .)
    

    【讨论】:

      【解决方案2】:

      错误在于fit_lstm 函数。它返回一个元组,并且您已将元组作为单个变量捕获model,更改

              model= fit_lstm(x_train_scaled, 
                          y_train_scaled, 
                          batch=100, ep=10, 
                          neurons_lstm=5, 
                          neuron_dense=1)
      

              model,history= fit_lstm(x_train_scaled, 
                          y_train_scaled, 
                          batch=100, ep=10, 
                          neurons_lstm=5, 
                          neuron_dense=1)
      

      【讨论】:

      • 请将其作为问题发布并提供必要的详细信息
      • 罗欣,没关系。我让它工作。再次感谢您的快速回复。
      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 2019-12-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多