import pandas as pd
from utilsforecast.plotting import plot_series快速开始(本地)
MLForecast 的最小示例
主要概念
mlforecast 的主要组件是 MLForecast 类,它抽象了以下内容:
- 通过
MLForecast.fit进行特征工程和模型训练 - 通过
MLForecast.predict进行特征更新和多步预测
数据格式
数据应该是长格式的 pandas dataframe,也就是说,每一行代表在某个时间点对单个系列的一次观察,至少包含三列:
id_col: 标识每个系列的列。target_col: 各时间戳下系列值的列。time_col: 包含观察到系列值的时间的列。这些通常是时间戳,也可以是连续的整数。
这里我们使用经典的 Box & Jenkins 航空公司数据作为示例,该数据测量了从1949年到1960年的国际航空乘客每月总数。 来源:Box, G. E. P., Jenkins, G. M. 和 Reinsel, G. C. (1976)《时间序列分析、预测与控制》,第三版,Holden-Day出版。系列G.
df = pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/air-passengers.csv', parse_dates=['ds'])
df.head()| unique_id | ds | y | |
|---|---|---|---|
| 0 | AirPassengers | 1949-01-01 | 112 |
| 1 | AirPassengers | 1949-02-01 | 118 |
| 2 | AirPassengers | 1949-03-01 | 132 |
| 3 | AirPassengers | 1949-04-01 | 129 |
| 4 | AirPassengers | 1949-05-01 | 121 |
df['unique_id'].value_counts()AirPassengers 144
Name: unique_id, dtype: int64
在这里,unique_id 列在所有行中都具有相同的值,因为这是一个单一的时间序列。您可以通过将多个时间序列堆叠在一起并拥有一个区分它们的列来获取多个时间序列。
我们还有 ds 列,包含时间戳,在这种情况下具有按月的频率,以及 y 列,包含每个时间戳的序列值。
建模
fig = plot_series(df)fig.savefig('../../figs/quick_start_local__eda.png', bbox_inches='tight')
我们可以看到该系列有一个明确的趋势,因此我们可以取第一个差分,即对每个值减去前一个月的值。这可以通过将 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 LinearRegressionfcst = MLForecast(
models=LinearRegression(),
freq='MS', # 我们的系列数据是按月频率发布的。
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_id | ds | LinearRegression | |
|---|---|---|---|
| 0 | AirPassengers | 1961-01-01 | 444.656555 |
| 1 | AirPassengers | 1961-02-01 | 417.470734 |
| 2 | AirPassengers | 1961-03-01 | 446.903046 |
| 3 | AirPassengers | 1961-04-01 | 491.014130 |
| 4 | AirPassengers | 1961-05-01 | 502.622223 |
| 5 | AirPassengers | 1961-06-01 | 568.751465 |
| 6 | AirPassengers | 1961-07-01 | 660.044312 |
| 7 | AirPassengers | 1961-08-01 | 643.343323 |
| 8 | AirPassengers | 1961-09-01 | 540.666687 |
| 9 | AirPassengers | 1961-10-01 | 491.462708 |
| 10 | AirPassengers | 1961-11-01 | 417.095154 |
| 11 | AirPassengers | 1961-12-01 | 461.206238 |
可视化结果
我们可以可视化我们的预测结果。
fig = plot_series(df, preds)fig.savefig('../../figs/quick_start_local__predictions.png', bbox_inches='tight')
就是这样!您已经训练了一个线性回归模型来预测1961年的航空乘客数量。
Give us a ⭐ on Github