mlforecast 将 scikit-learn 评估器作为模型,这意味着您可以提供 scikit-learn 的 pipelines 作为模型,以便在将数据传递给模型之前对其应用进一步的转换。

数据设置

from mlforecast.utils import generate_daily_series
series = generate_daily_series(5)
series.head()
unique_iddsy
0id_02000-01-010.428973
1id_02000-01-021.423626
2id_02000-01-032.311782
3id_02000-01-043.192191
4id_02000-01-054.148767

Pipelines 定义

假设您想使用一个线性回归模型,其中以 lag1 和星期几作为特征。mlforecast 将星期几作为一个单列返回,然而,这对于线性回归模型来说不是最优格式,因为它从为每个星期几设置指示符列中获益更多(删除一个以避免共线性)。我们可以通过使用 scikit-learn 的 OneHotEncoder 来实现这一点,然后拟合我们的线性回归模型,我们可以通过以下方式完成

from mlforecast import MLForecast
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import OneHotEncoder
fcst = MLForecast(
    models=[],
    freq='D',
    lags=[1],
    date_features=['dayofweek']
)
X, y = fcst.preprocess(series, return_X_y=True)
X.head()
lag1dayofweek
10.4289736
21.4236260
32.3117821
43.1921912
54.1487673

这就是将传递给我们的模型的数据,因此我们想获取 dayofweek 列并执行独热编码,同时保持 lag1 列不变。我们可以通过以下方式实现这一点

ohe = ColumnTransformer(
    transformers=[
        ('encoder', OneHotEncoder(drop='first'), ['dayofweek'])
    ],
    remainder='passthrough',
)
X_transformed = ohe.fit_transform(X)
X_transformed.shape
(1096, 7)

我们可以看到我们的数据现在有 7 列,1 列用于 lag,加上 6 列用于星期几(我们丢弃了第一个)。

ohe.get_feature_names_out()
array(['encoder__dayofweek_1', 'encoder__dayofweek_2',
       'encoder__dayofweek_3', 'encoder__dayofweek_4',
       'encoder__dayofweek_5', 'encoder__dayofweek_6', 'remainder__lag1'],
      dtype=object)

训练

现在我们可以构建一个执行此操作并将数据传递给我们的线性回归模型的管道。

model = make_pipeline(ohe, LinearRegression())

并将其作为模型提供给 mlforecast

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

预测

最后,我们计算预测结果。

fcst.predict(1)
unique_iddsohe_lr
0id_02000-08-104.312748
1id_12000-04-074.537019
2id_22000-06-164.160505
3id_32000-08-303.777040
4id_42001-01-082.676933

总结

您可以将复杂的 scikit-learn pipelines 作为模型提供给 mlforecast,这使得您可以根据模型执行不同的转换,并使用任何 scikit-learn 兼容的评估器。