mlforecast 抽象了大部分训练细节,这有助于快速迭代。然而,有时您可能希望更好地控制拟合参数、输入模型的数据等。本指南将展示如何以特定方式训练模型,然后将其返回给 mlforecast 以便生成预测。

数据设置

from mlforecast.utils import generate_daily_series
series = generate_daily_series(5)

创建预测对象

import lightgbm as lgb
import numpy as np
from sklearn.linear_model import LinearRegression

from mlforecast import MLForecast

假设我们想用默认设置训练一个线性回归模型。

fcst = MLForecast(
    models={'lr': LinearRegression()},
    freq='D',
    lags=[1],
    date_features=['dayofweek'],
)

生成训练集

使用 MLForecast.preprocess 生成训练数据。

prep = fcst.preprocess(series)
prep.head()
unique_iddsylag1dayofweek
1id_02000-01-021.4236260.4289736
2id_02000-01-032.3117821.4236260
3id_02000-01-043.1921912.3117821
4id_02000-01-054.1487673.1921912
5id_02000-01-065.0283564.1487673
X = prep.drop(columns=['unique_id', 'ds', 'y'])
y = prep['y']

常规训练

由于我们不想在线性回归的训练过程中做任何特殊处理,我们可以直接调用 MLForecast.fit_models

fcst.fit_models(X, y)
MLForecast(models=[lr], freq=D, lag_features=['lag1'], date_features=['dayofweek'], num_threads=1)

这已经训练了线性回归模型,现在可以通过 MLForecast.models_ 属性访问。

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

自定义训练

现在假设您还想在相同数据上训练一个 LightGBM 模型,但将星期几视为分类特征并记录训练损失。

model = lgb.LGBMRegressor(n_estimators=100, verbosity=-1)
model.fit(
    X,
    y,
    eval_set=[(X, y)],
    categorical_feature=['dayofweek'],
    callbacks=[lgb.log_evaluation(20)],
);
[20]    training's l2: 0.0823528
[40]    training's l2: 0.0230292
[60]    training's l2: 0.0207829
[80]    training's l2: 0.019675
[100]   training's l2: 0.018778

计算预测

现在我们将这个模型分配给 MLForecast.models_ 字典。请注意,您可以分配任意数量的模型。

fcst.models_['lgbm'] = model
fcst.models_
{'lr': LinearRegression(), 'lgbm': LGBMRegressor(verbosity=-1)}

现在,当调用 MLForecast.predict 时,mlforecast 将使用这些模型计算预测。

fcst.predict(1)
unique_iddslrlgbm
0id_02000-08-103.5491245.166797
1id_12000-04-073.1542854.252490
2id_22000-06-162.8809333.224506
3id_32000-08-304.0618010.245443
4id_42001-01-082.9048722.225106