Почему я получаю запаздывающие результаты на моей модели LSTM - PullRequest
3 голосов
/ 05 августа 2020

Я новичок в машинном обучении и выполняю многомерный прогноз временных рядов с использованием LSTM в Keras. У меня есть ежемесячный набор данных временного ряда с 4 входными переменными (температура, осадки, роса и ветер_спред) и 1 выходной переменной (загрязнение). Используя эти данные, я сформулировал задачу прогнозирования, в которой, учитывая погодные условия и уровень загрязнения за предыдущие месяцы, я прогнозирую загрязнение в следующем месяце. Ниже мой код

X = df[['Temperature', 'Precipitation', 'Dew', 'Wind_speed' ,'Pollution (t_1)']].values
y = df['Pollution (t)'].values
y = y.reshape(-1,1)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(X)

#dataset has 359 samples in total
train_X, train_y = X[:278], y[:278]
test_X, test_y = X[278:], y[278:]
# reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
print(train_X.shape, train_y.shape, test_X.shape, test_y.shape) 


model = Sequential()
model.add(LSTM(100, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dropout(0.2))
#    model.add(LSTM(70))
#    model.add(Dropout(0.3))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

history = model.fit(train_X, train_y, epochs=700, batch_size=70, validation_data=(test_X, test_y), verbose=2, shuffle=False)

# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right')
plt.show()

Чтобы делать прогнозы, я использую следующий код

from sklearn.metrics import mean_squared_error,r2_score
yhat = model.predict(test_X)
mse  = mean_squared_error(test_y, yhat)
rmse = np.sqrt(mse)
r2   = r2_score(test_y, yhat)

print("test set performance")
print("--------------------")
print("MSE:",mse)
print("RMSE:",rmse)
print("R^2: ",r2)

fig, ax = plt.subplots(figsize=(10,5))
ax.plot(range(len(test_y)), test_y, '-b',label='Actual')
ax.plot(range(len(yhat)), yhat, 'r', label='Predicted')
plt.legend()
plt.show()

Выполняя этот код, я столкнулся со следующими проблемами:

  1. По какой-то причине я получаю запаздывающий результат для своего тестового набора, которого нет в моих тренировочных данных, как показано на изображении ниже. Я не понимаю, почему у меня такие запаздывающие результаты (имеет ли это какое-то отношение к включению «загрязнения (t_1)» в мои входные данные)?

Результаты на графике:

enter image description here

  1. Добавляя «загрязнение (t_1)», которое представляет собой сдвиг на 1 задержку переменной загрязнения как часть моих входных данных, эта переменная теперь, кажется, доминирует в прогнозе, поскольку удаление других варибалов, похоже, не имеет влияние на мои результаты (r-квадрат и rmse), что странно, поскольку все эти переменные помогают в прогнозировании загрязнения.

Есть ли что-то, что я делаю не так в моем коде, что является причиной этих проблем ? Я новичок в python, поэтому я буду очень благодарен за любую помощь в ответах на два вышеуказанных вопроса.

1 Ответ

2 голосов
/ 07 августа 2020

Прежде всего, я считаю неуместным вводить «1» в качестве значения Timesteps, потому что модель LSTM обрабатывает временные ряды или данные последовательности. Думаю, следующий скрипт интеллектуального анализа данных подойдет

def lstm_data(df,timestamps):
    array_data=df.values
    sc=MinMaxScaler()
    array_data_=sc.fit_transform(array_data)

    array=np.empty((0,array_data_.shape[1]))
    range_=array_data_.shape[0]-(timestamps-1)
    for t in range(range_):
        array_data_p=array_data_[t:t+sequenth_length,:]
        array=np.vstack((array,array_data_p))

    array_=array.reshape(-1,timestamps, array.shape[1])
    return array_

#timestamps depend on your objection, but not '1'
x_data=lstm_data(x, timestamps=4) 
y_data=lstm_data(y, timestamps=4)
y_data=y_data.reshape(-1,1)

#Divide each data into train and test
#Input the divided data into your LSTM model
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...