将两个预测模型的优势结合起来。
文章目录
- 1、简介
- 2、组件和残差
- 3、混合预测与残差
-
-
- 3.1设计混合模型
-
- 4、示例 - 美国零售销售
1、简介
线性回归擅长推断趋势,但不能学习交互。XGBoost擅长学习交互,但不能推断趋势。在这个课程中,我们将学习如何创建"混合"预测器,这些预测器结合了互补的学习算法,让一个算法的优点弥补另一个算法的缺点。
2、组件和残差
为了我们能设计有效的混合模型,我们需要更好地理解时间序列是如何构建的。到目前为止,我们已经研究了三种依赖模式:趋势、季节性和周期性。许多时间序列可以通过仅包含这三个组件加上一些基本不可预测的、完全随机的误差的加法模型来紧密描述:
序列 = 趋势 + 季节性 + 周期性 + 误差
在这个模型中,我们将每一项称为时间序列的组件。
模型的残差是模型训练的目标和模型做出的预测之间的差异——换句话说,就是实际曲线和拟合曲线之间的差异。将残差与特征进行绘图,你会得到目标的"剩余"部分,或者说模型从该特征中未能学习到的目标部分。
目标序列和预测(蓝色)之间的差异给出了残差序列。
上图左侧是Tunnel Traffic序列的一部分和第3课的趋势-季节曲线。减去拟合曲线后,右侧留下的是残差。残差包含了趋势-季节模型没有从Tunnel Traffic中学习到的所有内容。
我们可以想象学习时间序列的组件是一个迭代过程:首先学习趋势并从序列中减去它,然后从去趋势的残差中学习季节性并减去季节性,然后学习周期性并减去周期性,最后只剩下不可预测的误差。
将我们学习到的所有组件加在一起,我们就得到了完整的模型。如果你在一套完整的特征上训练线性回归,这些特征模拟了趋势、季节性和周期性,那么这基本上就是线性回归会做的事情。
将学习到的组件相加以获得完整的模型。
3、混合预测与残差
在之前的课程中,我们使用一个算法(线性回归)一次性学习所有的组件。但是,也可以使用一个算法来学习一部分组件,然后使用另一个算法来学习剩余的组件。这样我们可以始终为每个组件选择最好的算法。为此,我们使用一个算法来拟合原始序列,然后使用第二个算法来拟合残差序列。
具体过程如下:
# 1. 使用第一个模型进行训练和预测
model_1.fit(X_train_1, y_train)
y_pred_1 = model_1.predict(X_train)
# 2. 在残差上使用第二个模型进行训练和预测
model_2.fit(X_train_2, y_train - y_pred_1)
y_pred_2 = model_2.predict(X_train_2)
# 3. 相加得到总体预测
y_pred = y_pred_1 + y_pred_2
我们通常会根据我们希望每个模型学习什么来使用不同的特征集(上述的X_train_1
和X_train_2
)。例如,如果我们使用第一个模型来学习趋势,我们通常不需要为第二个模型提供趋势特征。
虽然可以使用超过两个模型,但在实践中,这似乎并不特别有帮助。事实上,构建混合模型的最常见策略就是我们刚刚描述的:一个简单(通常是线性)的学习算法,后面跟着一个复杂的、非线性的学习器,如GBDT或深度神经网络,简单的模型通常被设计为后面强大算法的"助手"。
3.1设计混合模型
除了我们在这节课中概述的方式,还有许多其他方式可以组合机器学习模型。然而,成功地组合模型需要我们深入了解这些算法是如何运作的。
回归算法通常有两种方式可以进行预测:要么通过转换特征,要么通过转换目标。特征转换算法学习一些数学函数,该函数将特征作为输入,然后将它们组合和转换,以产生一个与训练集中的目标值匹配的输出。线性回归和神经网络属于这种类型。
目标转换算法使用特征将训练集中的目标值分组,并通过平均一个组中的值来进行预测;一组特征只是指示哪个组进行平均。决策树和最近邻属于这种类型。
重要的是:特征转换器通常可以在给定适当的特征输入的情况下,将目标值外推到训练集之外,但目标转换器的预测总是会被限制在训练集的范围内。如果时间虚拟变量继续计算时间步长,线性回归继续绘制趋势线。给定相同的时间虚拟变量,决策树将永远预测训练数据的最后一步所指示的趋势。决策树不能外推趋势。 随机森林和梯度提升决策树(如XGBoost)是决策树的集成,所以它们也不能外推趋势。
决策树无法超越训练集外推趋势。
这种差异是本课程中混合设计的动机:使用线性回归来外推趋势,转换目标以去除趋势,并将XGBoost应用于去趋势的残差。要混合神经网络(一个特征转换器),你可以将另一个模型的预测作为特征包含进来,神经网络然后将其作为自己的预测的一部分。拟合残差的方法实际上是梯度提升算法使用的相同方法,所以我们将这些称为增强混合;使用预测作为特征的方法被称为"堆叠",所以我们将这些称为堆叠混合。
在竞赛中获胜的混合模型
以下是一些过去竞赛中得分最高的解决方案,供你参考:
- STL与指数平滑的增强 - 沃尔玛招聘 - 商店销售预测
- ARIMA和指数平滑与GBDT的增强 - Rossmann商店销售
- 堆叠和增强混合的集成 - 网络流量时间序列预测
- 指数平滑与LSTM神经网络的堆叠 - M4(非Kaggle)
4、示例 - 美国零售销售
美国零售销售数据集包含了1992年至2019年各零售行业的月销售数据,这些数据由美国人口普查局收集。我们的目标将是预测2016年至2019年的销售额,给定早些年份的销售额。除了创建线性回归+XGBoost混合模型,我们还将看到如何为XGBoost使用设置时间序列数据集。
In [1]:
from pathlib import Path
from warnings import simplefilter
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from statsmodels.tsa.deterministic import CalendarFourier, DeterministicProcess
from</