Я построил однослойную модель 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)» выдает ошибку.
Может ли кто-нибудь сказать мне, кто я отсутствует?
Спасибо за помощь!