如果您想在预测前对输入进行某些操作,或者在输出用于更新目标(以及依赖于滞后的后续特征)之前对输出进行某些操作,您可以传递一个函数在这些时刻运行。

这里有几个示例

import copy

import lightgbm as lgb
import numpy as np
from IPython.display import display

from mlforecast import MLForecast
from mlforecast.utils import generate_daily_series
series = generate_daily_series(1)

预测前

检查输入

我们可以定义一个函数,在预测前显示我们的输入 dataframe。

def inspect_input(new_x):
    """Displays the model inputs to inspect them"""
    display(new_x)
    return new_x

现在我们可以将此函数传递给 MLForecast.predictbefore_predict_callback 参数。

fcst = MLForecast(lgb.LGBMRegressor(verbosity=-1), freq='D', lags=[1, 2])
fcst.fit(series, static_features=['unique_id'])
preds = fcst.predict(2, before_predict_callback=inspect_input)
preds
unique_idlag1lag2
0id_04.155933.000028
unique_idlag1lag2
0id_05.2502054.15593
unique_iddsLGBMRegressor
0id_02000-08-105.250205
1id_02000-08-116.241739

保存输入特征

将每个时间戳作为输入发送给模型的特征保存起来会很有帮助,例如用于估计 SHAP 值。这可以通过 SaveFeatures 回调轻松实现。

from mlforecast.callbacks import SaveFeatures
fcst = MLForecast(lgb.LGBMRegressor(verbosity=-1), freq='D', lags=[1])
fcst.fit(series, static_features=['unique_id'])
save_features_cbk = SaveFeatures()
fcst.predict(2, before_predict_callback=save_features_cbk);

调用 predict 后,我们就可以获取特征了。

save_features_cbk.get_features()
unique_idlag1
0id_04.155930
1id_05.281643

预测后

使用递归策略(默认)进行预测时,每个时间戳的预测结果用于更新目标并重新计算特征。如果您想在此之前对这些预测结果进行某些操作,您可以使用 MLForecast.predictafter_predict_callback 参数。

增加预测值

假设我们知道我们的模型总是低估,我们想通过将预测值提高 10% 来防止这种情况发生。我们可以通过以下方式实现这一点

def increase_predictions(predictions):
    """Increases all predictions by 10%"""
    return 1.1 * predictions
fcst = MLForecast(
    {'model': lgb.LGBMRegressor(verbosity=-1)},
    freq='D',
    date_features=['dayofweek'],
)
fcst.fit(series)
original_preds = fcst.predict(2)
scaled_preds = fcst.predict(2, after_predict_callback=increase_predictions)
np.testing.assert_array_less(
    original_preds['model'].values,
    scaled_preds['model'].values,
)