机器学习 🤖 预测

用于时间序列预测的可伸缩机器学习

mlforecast 是一个使用机器学习模型进行时间序列预测的框架,可以选择使用远程集群扩展到海量数据。

安装

PyPI

pip install mlforecast

conda-forge

conda install -c conda-forge mlforecast

有关更详细的说明,请参阅安装页面

快速入门

通过此快速指南入门。

遵循此端到端演练以了解最佳实践。

视频

示例 Notebook

为什么?

当前的 Python 机器学习模型替代方案速度慢、精度低且伸缩性差。因此,我们创建了一个可在生产环境中用于预测的库。MLForecast 包含高效的特征工程,可训练任何机器学习模型(使用 sklearn 等具有 fitpredict 方法的模型)以拟合数百万时间序列。

特性

  • Python 中时间序列预测特征工程的最快实现。
  • 开箱即用地兼容 pandas、polars、spark、dask 和 ray。
  • 使用一致性预测进行概率预测。
  • 支持外部变量和静态协变量。
  • 熟悉的 sklearn 语法:.fit.predict

缺少什么?请提出问题或在联系我们

示例和指南

📚 端到端演练:对多个时间序列进行模型训练、评估和选择。

🔎 概率预测:使用一致性预测生成预测区间。

👩‍🔬 交叉验证:稳健的模型性能评估。

🔌 预测需求峰值:电力负荷预测,用于检测每日峰值并降低电费。

📈 迁移学习:使用一组时间序列预训练模型,然后使用该预训练模型预测另一个时间序列。

🌡️ 分布式训练:使用 Dask、Ray 或 Spark 集群大规模训练模型。

如何使用

以下提供了一个非常基础的概述,有关更详细的说明,请参阅文档

数据设置

将您的时间序列存储在长格式的 pandas DataFrame 中,即每一行代表特定序列和时间戳的一个观测值。

from mlforecast.utils import generate_daily_series

series = generate_daily_series(
    n_series=20,
    max_length=100,
    n_static_features=1,
    static_as_categorical=False,
    with_trend=True
)
series.head()
unique_iddsystatic_0
0id_002000-01-0117.51916772
1id_002000-01-0287.79969572
2id_002000-01-03177.44297572
3id_002000-01-04232.70411072
4id_002000-01-05317.51047472

注意:unique_id 用作数据集中每个不同时间序列的标识符。如果您只使用数据集中的单个时间序列,请将此列设置为一个常数值。

模型

接下来定义您的模型,每个模型都将在所有序列上进行训练。这些可以是遵循 scikit-learn API 的任何回归器。

import lightgbm as lgb
from sklearn.linear_model import LinearRegression
models = [
    lgb.LGBMRegressor(random_state=0, verbosity=-1),
    LinearRegression(),
]

Forecast 对象

现在实例化一个MLForecast 对象,包含您想要使用的模型和特征。特征可以是滞后项、滞后项上的变换和日期特征。您还可以定义在拟合之前应用于目标变量的变换,这些变换将在预测时恢复。

from mlforecast import MLForecast
from mlforecast.lag_transforms import ExpandingMean, RollingMean
from mlforecast.target_transforms import Differences
fcst = MLForecast(
    models=models,
    freq='D',
    lags=[7, 14],
    lag_transforms={
        1: [ExpandingMean()],
        7: [RollingMean(window_size=28)]
    },
    date_features=['dayofweek'],
    target_transforms=[Differences([1])],
)

训练

要计算特征并训练模型,请在您的 Forecast 对象上调用 fit

fcst.fit(series)
MLForecast(models=[LGBMRegressor, LinearRegression], freq=D, lag_features=['lag7', 'lag14', 'expanding_mean_lag1', 'rolling_mean_lag7_window_size28'], date_features=['dayofweek'], num_threads=1)

预测

要获取未来 n 天的预测结果,请在 forecast 对象上调用 predict(n)。这将使用递归策略自动处理特征所需的更新。

predictions = fcst.predict(14)
predictions
unique_iddsLGBMRegressorLinearRegression
0id_002000-04-04299.923771311.432371
1id_002000-04-05365.424147379.466214
2id_002000-04-06432.562441460.234028
3id_002000-04-07495.628000524.278924
4id_002000-04-0860.78622379.828767
275id_192000-03-2336.26678028.333215
276id_192000-03-2444.37098433.368228
277id_192000-03-2550.74622238.613001
278id_192000-03-2658.90652443.447398
279id_192000-03-2763.07394948.666783

可视化结果

from utilsforecast.plotting import plot_series
fig = plot_series(series, predictions, max_ids=4, plot_random=False)

如何贡献

参阅CONTRIBUTING.md