LSTM time series forecasting clipping issue in prediction

28 Views Asked by At

I'm encountering issues with my univariate time series forecasting LSTM model. It seems to be experiencing clipping problems. The model takes 120 timesteps (which is equivalent to 10 days, each day comprising 12 hours) as input to predict the next timestep, which is the next hour. I utilized a hyperparameter tuner to conduct a random search for optimal values for layers, batch size, and dropout rates. Any insights on what might be causing this issue would be greatly appreciated. Thank you !

def create_trainable_dataset(dataframe, n_inputs, n_outputs):
    X, Y = list(), list()
    for i in range(len(dataframe) - n_inputs - n_outputs + 1):
        X.append(dataframe.iloc[i:(i + n_inputs)].values)
        Y.append(dataframe.iloc[i + n_inputs:i + n_inputs + n_outputs, 0].values)
    return np.array(X), np.array(Y)

def scale_data(train_data, test_data):
    scaler = MinMaxScaler(feature_range=(0, 1))

    train_data_copy = train_data.copy()
    test_data_copy = test_data.copy()

    scaler.fit(train_data_copy[['Global Horizontal Irradiance']])

    train_data_copy['Global Horizontal Irradiance'] = scaler.transform(train_data_copy[['Global Horizontal Irradiance']])
    test_data_copy['Global Horizontal Irradiance'] = scaler.transform(test_data_copy[['Global Horizontal Irradiance']])

    return scaler, train_data_copy, test_data_copy

n_input=120 #10 day 12x10=120 hours
n_output=1 #1 day 12x1=12 hours
trained_data = train
tested_data = test

s_scaler,s_train_data,s_test_data=scale_data(trained_data,tested_data)
X_train,Y_train=create_trainable_dataset(s_train_data,n_input,n_output)
X_test,Y_test=create_trainable_dataset(s_test_data,n_input,n_output)

def build_model(hp):
    model = Sequential()
    model.add(LSTM(hp.Int('input_unit',min_value=32,max_value=512,step=32),return_sequences=True, input_shape=(X_train.shape[1],X_train.shape[2])))
    for i in range(hp.Int('n_layers', 1, 4)):
        model.add(LSTM(hp.Int(f'lstm_{i}_units',min_value=32,max_value=512,step=32),return_sequences=True))
    model.add(LSTM(hp.Int('layer_2_neurons',min_value=32,max_value=512,step=32)))
    model.add(Dropout(hp.Float('Dropout_rate',min_value=0,max_value=0.5,step=0.1)))
    model.add(Dense(Y_train.shape[1], activation=hp.Choice('dense_activation',values=['relu', 'sigmoid'],default='relu')))
    model.compile(loss='mean_squared_error', optimizer='adam',metrics = ['mse'])
    return model

tuner= RandomSearch(
        build_model,
        objective='mse',
        max_trials=2,
        executions_per_trial=1
        )

tuner.search(
        x=X_train,
        y=Y_train,
        epochs=20,
        batch_size=128,
        validation_data=(X_test,Y_test),
)

ss_train = s_train_data.values

test_predictions = []
first_eval_batch = ss_train[-n_input:]
current_batch = first_eval_batch.reshape((1,n_input,n_features))

for i in range(len(test)):
  current_pred = best_model.predict(current_batch)[0]
  test_predictions.append(current_pred)
  current_batch =np.append(current_batch[:,1:,:],[[current_pred]],axis=1)

true_predictions = s_scaler.inverse_transform(test_predictions)
test['Predictions'] = true_predictions
test.plot(figsize = (12,6))

Model Summary

Model Summary

Prediction Plot Prediction Plot

0

There are 0 best solutions below