Как объединить 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 шт):

Автор решения: passant

Теоретически так делать можно, но надеюсь вы понимаете, что у вас с каждым циклом точность дальнейших прогнозов только уменьшается?

Если вы делаете предсказание на один день, то цикл примерно таков "обучение"-"предсказание" - дождались следующего дня - переобучили модель с учетом данных последнего дня - сделали предсказание на следующий день.

Аналогичным образом можно поступать и при одномоментном прогнозе на несколько тиков вперед. Т.е. построили прогноз на N следующих тиков - дождались следующего значения - переобучили модель - сделали прогноз на следующие N тиков (по сути для первых N-1 тиков из этого нового прогноза это будет "перепрогноз"). Примерно так работает прогноз погоды, если что.

→ Ссылка