使用随机森林进行时间序列预测

2025年03月17日 | 阅读 9 分钟

随机森林是一种受欢迎且有效的集成机器学习方法。

该算法经常用于通过分类和回归进行预测建模,处理有序(表格)数据集,例如电子表格或关系数据库表中的数据。

在使用随机森林算法进行时间序列预测之前,必须先将时间序列数据转换为可用于训练监督学习算法的格式。此外,它还需要采用一种称为前向验证的专用评估方法,因为 k 折交叉验证方法会产生可能存在偏差的结果。

在本教程中,您将学习如何使用随机森林学习算法进行时间序列预测。

随机森林集成

决策树模型的集合称为随机森林模型。

它是使用基于决策树的自举聚合(称为 bagging)开发的,适用于分类和回归建模。

在 bagging 过程中构建多个决策树,并且每棵树都基于主训练数据的单独自举样本构建。一个实例可能出现在自举训练数据集的多个样本中,称为自举样本。自举也被称为“有放回抽样”。

由于每棵决策树都拟合到较小的自举训练数据集,因此会产生一些不同的结果,因此 bagging 是一种成功的集成方法。与标准的决策树算法(如流行的分类和回归树模型,也称为 CART)不同,随机森林集合中的树是未剪枝的,CART 会过度拟合初始训练数据集。这反而更好,因为它使每棵树更具独特性,并产生相关性或错误率较低的预测。

当聚合所有集成决策树的预测时,模型的性能会优于仅考虑单棵树的预测。

集成决策树的平均预测是回归线上的估计值。分类问题估计是得到集成决策树最多支持的类标签。

  • 回归:估计值是所有决策树的平均预测。
  • 分类:预测值是集成中所有决策树获得多数票的类标签。

与 bagging 类似,随机森林模型涉及使用主训练数据集的自举样本构建多个决策树。

与 bagging 不同的是,随机森林模型在每次树分割时还涉及选择一组输入特征。为了选择一个分割点,在构建决策树时通常会评估每个输入属性的值。它通过压缩可以在每个分割点考虑的随机数据组的特征,促使集成中的每棵树更加不同。

结果是,集成的每棵决策树产生的预测彼此更加不同或相关性较低,这会导致预测错误。当聚合这些相关性较低的决策树的预测来生成预测时,它通常会产生比 bagge 决策树更高的准确性。

导入所需模块

时间序列数据准备

我们可以将时间序列数据转换为监督学习数据。

如果给定按时间顺序排列的数据序列,即时间序列数据,我们可以将其转换为监督学习问题。这可以通过将输出属性用作下一个数据点,将输入属性用作先前的时间步长来完成。

我们可以通过利用最晚时间步长的数据点来预测下一个时间步长的数据,从而将给定的时间序列数据重建为监督机器学习问题。我们可以将给定的时间序列数据重建为监督机器学习问题。

这种格式称为滑动窗口,因为它允许通过在时间上移动输入变量和预测输出的窗口来为监督机器学习模型创建新的“样本”。

给定输入和输出时间序列数据的正确维度,我们可以使用 Pandas 的 shift() 方法自动为时间序列问题生成新帧。

这将是一个有用的工具,因为它将使我们能够使用机器学习方法来检查时间序列数据的不同帧,以确定哪些帧将提供性能更好的模型。

该函数将采用表示为具有一列或多列的数组时间序列的时间序列,并根据提供的输入和输出实例数将其转换为监督机器学习问题。

代码

稍后我们将使用此函数将时间序列数据转换为应用随机森林模型。

创建数据集后,我们需要小心地拟合和评估模型。

例如,用明天的模型拟合数据集并让它预测过去的事情,这并不被认为是有效的。模型必须学会利用历史数据来预测未来。

因此,不能使用像 kfold 交叉验证那样随机化给定数据集进行评估的技术。我们倾向于采用一种称为前向交叉验证的方法。

通过选择一个阈值点,数据集首先被划分为训练集和测试集。例如,在 12 个月前的所有数据都用于训练模型,而最近的 12 个月则用于测试该模型,这在前向交叉验证中是常见的。

如果我们想创建单步预测,例如一个月,我们可以通过在排除的测试数据上训练模型并生成第一步预测来评估模型。为了更新模型并让它预测测试数据集的第二步数据,然后我们可以将我们测试数据集的实际值添加到我们的训练数据集中。

通过重复此过程,可以获得整个测试数据集的单步预测,从而可以计算出误差度量来判断模型的性能。

需要完整的监督学习数据集,以及将用作测试数据集的总行数。

然后它会遍历测试集,调用 random_forest_forecast() 函数进行单步预测。会计算出一个误差度量,并将详细信息返回以供分析。

代码

我们将定义 train_test_split() 函数来分割训练集和测试集。该函数定义如下。

代码

我们将定义 random_forest_forecast() 函数,它将使用 sklearn 库的随机森林模型,将其拟合到提供的训练数据,并返回给定测试数据集的预测值。

代码

我们已经创建了建模和预测所需的所有函数。下一步是加载我们将用于实现我们方法的数据集。

随机森林用于时间序列

在最后一部分,我们将了解如何实现随机森林回归来预测时间序列数据值。

我们将使用常见的单变量时间序列数据来关注模型的运行。此外,我们仅为单变量数据准备了方法。

为了测试模型,我们将使用标准的单变量时间序列数据集来进行预测。

我们使用的代码可用于理解使用随机森林模型进行时间序列预测的过程。我们可以扩展此功能来实现这些方法来处理多变量数据以进行多变量预测,但我们需要对方法进行一些修改。

我们将使用每日女性出生人数的时间序列数据集,该数据集包含每月出生的女性人数。数据记录了三年。

可以通过以下链接下载该数据集

让我们看一下数据集。这些是原始值。

首先,让我们将此数据集加载到当前工作区并绘制它。

下面是加载和绘制它的代码。

代码

输出

Random Forest for Time Series Forecasting

这是时间序列数据的折线图。我们看不到数据中明显的趋势或季节性。

现在将所有内容整合在一起并运行模型。

代码

输出

expected values = 42.0, predicted values = 45.583
expected values = 53.0, predicted values = 43.804
expected values = 39.0, predicted values = 41.545
expected values = 40.0, predicted values = 38.352
expected values = 38.0, predicted values = 42.782
expected values = 44.0, predicted values = 48.077
expected values = 34.0, predicted values = 42.743
expected values = 37.0, predicted values = 36.669
expected values = 52.0, predicted values = 37.75
expected values = 48.0, predicted values = 41.899
expected values = 55.0, predicted values = 43.849
expected values = 50.0, predicted values = 44.999
The MAE score is: 5.950666666666668

Random Forest for Time Series Forecasting