数据设置

from mlforecast.utils import generate_daily_series
series = generate_daily_series(10)
series.head()
unique_iddsy
0id_02000-01-010.322947
1id_02000-01-021.218794
2id_02000-01-032.445887
3id_02000-01-043.481831
4id_02000-01-054.191721

训练

假设您想使用星期几和 lag1 作为特征来训练一个线性回归模型。

from sklearn.linear_model import LinearRegression

from mlforecast import MLForecast
fcst = MLForecast(
    freq='D',
    models={'lr': LinearRegression()},
    lags=[1],
    date_features=['dayofweek'],
)
fcst.fit(series)
MLForecast(models=[lr], freq=<Day>, lag_features=['lag1'], date_features=['dayofweek'], num_threads=1)

MLForecast.fit 的作用是保存预测步骤所需的数据,并训练模型(在本例中是线性回归)。训练好的模型可以在 MLForecast.models_ 属性中找到,这是一个字典,其中键是模型名称,值是模型本身。

fcst.models_
{'lr': LinearRegression()}

检查参数

我们可以通过以下方式访问线性回归系数

fcst.models_['lr'].intercept_, fcst.models_['lr'].coef_
(3.2476337167384415, array([ 0.19896416, -0.21441331]))

SHAP

import shap

训练集

如果您需要生成训练数据,可以使用 MLForecast.preprocess

prep = fcst.preprocess(series)
prep.head()
unique_iddsylag1dayofweek
1id_02000-01-021.2187940.3229476
2id_02000-01-032.4458871.2187940
3id_02000-01-043.4818312.4458871
4id_02000-01-054.1917213.4818312
5id_02000-01-065.3958634.1917213

我们提取 X,这包括删除信息列 (id + 时间) 和目标

X = prep.drop(columns=['unique_id', 'ds', 'y'])
X.head()
lag1dayofweek
10.3229476
21.2187940
32.4458871
43.4818312
54.1917213

我们现在可以计算 SHAP 值

X100 = shap.utils.sample(X, 100)
explainer = shap.Explainer(fcst.models_['lr'].predict, X100)
shap_values = explainer(X)

并对其进行可视化

shap.plots.beeswarm(shap_values)

预测

有时您想确定模型给出特定预测的原因。为此,您需要输入特征,这些特征默认情况下不会返回,但您可以使用回调来检索它们。

from mlforecast.callbacks import SaveFeatures
save_feats = SaveFeatures()
preds = fcst.predict(1, before_predict_callback=save_feats)
preds.head()
unique_iddslr
0id_02000-08-103.468643
1id_12000-04-073.016877
2id_22000-06-162.815249
3id_32000-08-304.048894
4id_42001-01-083.524532

您现在可以使用 SaveFeatures.get_features 来检索特征

features = save_feats.get_features()
features.head()
lag1dayofweek
04.3437443
13.1507994
22.1374124
36.1824562
41.3916980

并使用这些特征来计算 SHAP 值。

shap_values_predictions = explainer(features)

我们现在可以分析哪些因素影响了 'id_4' 的预测。

round(preds.loc[4, 'lr'], 3)
3.525
shap.plots.waterfall(shap_values_predictions[4])