Как объединить 2 функции в 1 для прогнозирования модели?
Есть функция предсказания значений модели
def xgb_predict_model(data):
data_new = data.copy()
data_new = make_features(data_new, 8, 4)
y = data_new.dropna().events
X = data_new.dropna().drop(['events'], axis=1)
# reserve 10% of data for testing
X_train, X_test, y_train, y_test = timeseries_train_test_split(X, y, test_size=0.1)
reg = xgb.XGBRegressor(n_estimators=1000,
nthread=4,
min_child_weight=6,
learning_rate=0.1,
subsample=0.7,
max_depth=11,
colsample_bytree=0.7,
)
reg.fit(X_train, y_train,
eval_set=[(X_train, y_train), (X_test, y_test)],
early_stopping_rounds=20,
eval_metric='mae',
verbose=False)
X_test_pred = reg.predict(X_test)
xgg_rmse = mean_absolute_error(y_test, X_test_pred)
return reg, xgg_rmse, X_test_pred
и функция прогноза значений на будущие периоды
def forecasting(model, data_, start_date):
# Cоздаем временный датафрейм для добавлении 1-ой прогнозируемой даты
df = pd.DataFrame({"date": [start_date]}).set_index('date')
# Добавляем новую дату в имеющийся датасет
new = pd.concat([data_, df])
# Создаем признаки для предсказания
new = make_features(new, 8, 4)
# Обученной моделью предсказываем значения для 1го дня
X_forecast = new.drop(['events'], axis=1).iloc[[-1]]
y_forecast = model.predict(X_forecast)
# Добавляем полученной значение в первоначальный датасет
new.loc[new.index[-1], 'events'] = y_forecast[0]
d = new.iloc[[-1]][['events']]
data_ = pd.concat([data, d])
return data_
Задача состоит в том, чтобы изначально обучить модель (1функция). Затем во второй функции создать новые даты для предсказания (их может быть 1, 3, 5 и тд.). В этой же модели добавить новые признаки отдельной функцией (make_feature) и обученной моделью на 1 этапе предсказать значение. После того как значение предсказано, оно добавляется в исходный датасет и модель снова обучается.
Вот пример как это должно выглядеть: Есть данные
date | events
2019-06-12 7.0
2019-06-13 4.0
2019-06-14 4.0
2019-06-15 20.0
2019-06-16 5.0
Хочу спрогнозировать на 2019-06-17. Для этого обучаю модель первой функцией. Делаю прогноз второй моделью, получаю что-то подобное 2019-06-17 7.0. Добавляю это в исходный датасет. И снова обучаю модель. Затем предсказываю уже на 2019-06-18 с учетом всех предыдущих данных.
Как это можно реализовать, если периодов может быть множество?
Ответы (1 шт):
Теоретически так делать можно, но надеюсь вы понимаете, что у вас с каждым циклом точность дальнейших прогнозов только уменьшается?
Если вы делаете предсказание на один день, то цикл примерно таков "обучение"-"предсказание" - дождались следующего дня - переобучили модель с учетом данных последнего дня - сделали предсказание на следующий день.
Аналогичным образом можно поступать и при одномоментном прогнозе на несколько тиков вперед. Т.е. построили прогноз на N следующих тиков - дождались следующего значения - переобучили модель - сделали прогноз на следующие N тиков (по сути для первых N-1 тиков из этого нового прогноза это будет "перепрогноз"). Примерно так работает прогноз погоды, если что.