Python для l oop ошибка кортежа предсказания - модель LSTM - PullRequest
0 голосов
/ 18 июня 2020

Я построил однослойную модель LSTM, которая прогнозирует будущий спрос на услуги такси на 1 час вперед.

Чтобы проверить надежность, я хочу повторить прогнозы несколько раз и усреднить оценку RSME. Следуя этому примеру , я хочу использовать a для l oop, чтобы достичь этого.

Этот фрагмент кода включает функцию, которая соответствует модели 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

Это функция, вызывающая ошибку кортежа. Как видите, я создал для l oop с функцией прогнозирования, приведенной выше.

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 l oop дает мне следующую ошибку, которую я не понимаю, потому что насколько я понимаю, в функции прогнозирования нет объекта кортежа. Насколько я понимаю, входные данные для прогнозирования модели 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'

Я могу получить оценку RMSE, если просто сделаю прогноз один раз с функцией «predictions_lstm (x_test_scaled, y_test)», но когда я использую для l oop, функция «predictions_lsmt (x_test_scaled, y_test)» выдает ошибку.

Может ли кто-нибудь сказать мне, кто я отсутствует?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Ошибка связана с функцией 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)
1 голос
/ 18 июня 2020

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(. . .)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...