Обратное разнесение данных прогнозирования LSTM

#python #pandas #numpy #tensorflow #lstm

#python #панды #numpy #тензорный поток #lstm

Вопрос:

Я делаю прогнозирование временных рядов с помощью LSTM. При предварительной обработке данных я выполнил лог-преобразование, затем разнесся на период 1, а затем использовал MinMaxScaler между 0 и 1.

 dataset = np.log(dataset).diff()
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
  

При обратном преобразовании я выполняю scaler.inverse_transform , затем я помещаю первое значение исходного набора данных и np.cumsum и np.exp, и все работает нормально. Однако я не знаю, как очистить мой массив прогнозов, потому что я не знаю, какой первый элемент выполняет накопительную сумму, и просто выполнение np.cumsum, по-видимому, не работает.

 dataset = scaler.inverse_transform(dataset) 
dataset[0] = np.log(dataset_1.iloc[0])
dataset = np.exp(dataset.cumsum()) #Obtained unscaled untransformed original dataset
  

Вот мой код, вся заслуга принадлежит

https://towardsdatascience.com/5-machine-learning-techniques-for-sales-forecasting-598e4984b109
https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/

 dataset = pd.read_csv('airline-passengers.csv', usecols=[1], engine='python')
dataset = np.log(dataset).diff()
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]

look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=50, batch_size=1, verbose=0)
# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
  

Здесь я попытался сделать

 trainPredictPlot = np.empty_like(dataset)
trainPredictPlot[:, :] = np.nan
trainPredictPlot[look_back:len(trainPredict) look_back] = np.reshape(np.exp(np.cumsum(trainPredict)), (len(trainPredict), 1))
testPredictPlot = np.empty_like(dataset)
testPredictPlot[:, :] = np.nan
testPredictPlot[len(trainPredict) (look_back*2) 1:len(dataset)-1] = np.reshape(np.exp(np.cumsum(testPredict)), (len(testPredict), 1))
  

Но, по-видимому, cumsum не является полной инверсией diff без сдвига, если я не удаляю исходные данные, прогноз выглядит хорошо, и я поражен тем, что модель работает так хорошо. Этот тест здесь проводится с тестовым набором данных, но с исходными данными у меня R_2 оценка 0,8 и ниже RMSE для обучающих прогнозов, чем для тестирования прогнозов, что кажется подходящим.

Любая помощь приветствуется. График немасштабированных исходных данных и «немасштабированных» прогнозируемых данных