主要概念

mlforecast 的主要组件是 MLForecast 类,它抽象了

数据格式

数据应为 pandas long format 的 DataFrame,即每一行表示单个序列在给定时间的观测值,至少包含三列

  • id_col: 标识每个序列的列。
  • target_col: 包含每个时间戳序列值的列。
  • time_col: 包含观测到序列值的时间的列。这些通常是时间戳,但也可以是连续整数。

这里我们展示一个使用经典 Box & Jenkins 航空数据的示例,该数据测量了 1949 年至 1960 年国际航空乘客的月度总数。来源:Box, G. E. P., Jenkins, G. M. and Reinsel, G. C. (1976) Time Series Analysis, Forecasting and Control. Third Edition. Holden-Day. Series G。

import pandas as pd
from utilsforecast.plotting import plot_series
df = pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/air-passengers.csv', parse_dates=['ds'])
df.head()
unique_iddsy
0AirPassengers1949-01-01112
1AirPassengers1949-02-01118
2AirPassengers1949-03-01132
3AirPassengers1949-04-01129
4AirPassengers1949-05-01121
df['unique_id'].value_counts()
AirPassengers    144
Name: unique_id, dtype: int64

在这里,unique_id 列的所有行都具有相同的值,因为这是一个单一时间序列;你可以通过将多个时间序列堆叠在一起并设置一列来区分它们。

我们还有包含时间戳的 ds 列,在这种情况下是月度频率,以及包含每个时间戳序列值的 y 列。

建模

fig = plot_series(df)

我们可以看到该序列有明显的趋势,因此我们可以进行一阶差分,即用每个值减去上一个月的值。这可以通过将 mlforecast.target_transforms.Differences([1]) 实例传递给 target_transforms 来实现。

然后我们可以使用上一年同一月份的值(滞后 12)作为特征来训练一个线性回归模型,这可以通过传递 lags=[12] 来实现。

from mlforecast import MLForecast
from mlforecast.target_transforms import Differences
from sklearn.linear_model import LinearRegression
fcst = MLForecast(
    models=LinearRegression(),
    freq='MS',  # our serie has a monthly frequency
    lags=[12],
    target_transforms=[Differences([1])],
)
fcst.fit(df)
MLForecast(models=[LinearRegression], freq=MS, lag_features=['lag12'], date_features=[], num_threads=1)

上一行计算了特征并训练了模型,所以现在我们可以计算预测值了。

预测

计算未来 12 个月的预测值

preds = fcst.predict(12)
preds
unique_iddsLinearRegression
0AirPassengers1961-01-01444.656555
1AirPassengers1961-02-01417.470734
2AirPassengers1961-03-01446.903046
3AirPassengers1961-04-01491.014130
4AirPassengers1961-05-01502.622223
5AirPassengers1961-06-01568.751465
6AirPassengers1961-07-01660.044312
7AirPassengers1961-08-01643.343323
8AirPassengers1961-09-01540.666687
9AirPassengers1961-10-01491.462708
10AirPassengers1961-11-01417.095154
11AirPassengers1961-12-01461.206238

可视化结果

我们可以可视化我们的预测结果。

fig = plot_series(df, preds)

就这样!你已经训练了一个线性回归模型来预测 1961 年的航空乘客数量。