В настоящее время я работаю с набором данных временных рядов из 46 строк о метеорологических измерениях примерно каждые 3 часа в день в течение одной недели. Мои объясняющие переменные (X) состоят из 26 переменных, и некоторые переменные имеют разные единицы измерения (градусы, миниметры, г/м3 и т. д.). Моя переменная для объяснения (y) состоит только из одной переменной температуры.
Моя цель - предсказать температуру (y) на слоте 12-24 часа с помощью ансамбля переменных (X)
Для этого я использовал Keras Tensorflow и Python с моделью регрессора MLP:
X = df_forcast_cap.loc[:, ~df_forcast_cap.columns.str.startswith('l')]
X = X.drop(['temperature_Y'],axis=1)
y = df_forcast_cap['temperature_Y']
y = pd.DataFrame(data=y)
# normalize the dataset X
scaler = MinMaxScaler(feature_range=(0, 1))
scaler.fit_transform(X)
normalized = scaler.transform(X)
# normalize the dataset y
scaler = MinMaxScaler(feature_range=(0, 1))
scaler.fit_transform(y)
normalized = scaler.transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# define base model
def norm_model():
# create model
model = Sequential()
model.add(Dense(26, input_dim=26, kernel_initializer='normal', activation='relu'))# 30 is then number of neurons
#model.add(Dense(6, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# evaluate model with standardized dataset
estimator = KerasRegressor(build_fn=norm_model, epochs=(100), batch_size=5, verbose=1)
kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X, y, cv=kfold)
print(results)
[-0.00454741 -0.00323181 -0.00345096 -0.00847261 -0.00390925 -0.00334816
-0.00239754 -0.00681044 -0.02098541 -0.00140129]
# invert predictions
X_train = scaler.inverse_transform(X_train)
y_train = scaler.inverse_transform(y_train)
X_test = scaler.inverse_transform(X_test)
y_test = scaler.inverse_transform(y_test)
results = scaler.inverse_transform(results)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))
Results: -0.01 (0.01) MSE
(1) Я читал, что перекрестная проверка не адаптирована для прогнозирования временных рядов. Итак, мне интересно, какие еще методы существуют и какие из них более адаптированы к временным рядам.
(2) Во-вторых, я решил нормализовать свои данные, потому что мой набор данных X состоит из разных показателей (градусы, миниметры, г/м3 и т. д.), а моя переменная для объяснения y находится в градусах. Таким образом, я знаю, что мне придется иметь дело с более сложной интерпретацией MSE, потому что ее результат не будет в той же единице, что и моя переменная y. Но для следующего шага моего исследования мне нужно сохранить результат предсказания y (сделанный моделью MLP), и мне нужно, чтобы эти значения были в степени. Итак, я попытался инвертировать нормализацию, но безуспешно, когда я печатаю свои результаты, прогнозируемые значения все еще находятся в нормализованном формате (см. Мой код выше). Кто-нибудь видит мою ошибку?