教 LightGBM 如何数到 10

它能有多难? — LightGBM 是一种强大的机器学习算法。但它可以数到 10 吗? LightGBM 可以说是用于表格数据的最佳算法。这是一种聪明的方法,也是许多机器学习竞赛获胜解决方案的支柱。 LightGBM 还提供时间序列数据。 …

教 LightGBM 如何数到 10

它能有多难?

LightGBM 是一种强大的机器学习算法。但它可以数到 10 吗?

LightGBM 可以说是用于表格数据的最佳算法。这是一种聪明的方法,也是许多机器学习竞赛获胜解决方案的支柱。 LightGBM 还提供时间序列数据。 M 次预测竞赛 (M5) 的最新迭代的获胜者使用 LightGBM 作为学习算法。[0]

在玩弄它的过程中,我决定使用 LightGBM 来解决以下问题:预测序列 1、2、…、9 的下一个值。即数字 10。这个任务几乎没有不确定性,它只需要求和1 到上一个值。如此复杂的算法有多难?

这是我第一次尝试的代码,我在下面解释。

import lightgbm
import pandas as pd

# creating the sequence [1, 2, ..., 9] as a pd.Series
sequence = pd.Series(range(1, 10))

# transforming the series into a trainable format using 3 lags
sequence_df = pd.concat([sequence.shift(i) for i in range(3, -1, -1)], axis=1)
sequence_df.columns = ['t-' + str(i) for i in list(reversed(range(3)))] + ['t+1']
sequence_df = sequence_df.dropna().reset_index(drop=True)

# creating the predictors and target variables
X = sequence_df.drop('t+1', axis=1)
y = sequence_df['t+1']

# training the model
model = lightgbm.LGBMRegressor()
model.fit(X, y)

prediction = model.predict([[7, 8, 9]])
# prediction = 6.5

我们首先创建一个可训练的数据集,我们称之为 sequence_df(第 1-10 行)。这是它的样子:

   t-2,  t-1,  t,  t+1
    1 ,   2 , 3  ,  4
    2 ,   3 , 4  ,  5
    3 ,   4 , 5  ,  6
    4 ,   5 , 6  ,  7
    5 ,   6 , 7  ,  8
    6 ,   7 , 8  ,  9

以第一行为例,4为目标值,[1,2,3]为解释变量向量。因此,这遵循一个自回归模型——使用过去的观察作为当前观察的解释变量。

在构建数据集之后,我们用它来拟合 ​​LightGBM(第 11-18 行)。通常,您应该优化模型的超参数。在这里,为了简单起见,我将只使用默认配置。

最后,我们得到输入向量 [7, 8, 9] 的预测。

And we get 6.5.

为什么我们得到 6.5? LightGBM 是使用基于树的方法构建的。这些不能外推到观察(训练)范围之外。因此,LightGBM 也无法做到这一点。 6.5 值是训练目标变量的平均值。

我们可以通过引入去除序列趋势的差分预处理步骤来解决这个问题。正如我在上一篇文章中所描述的,差分是对时间序列的连续观察结果进行差分的过程。其目的是去除趋势并稳定数据均值。这是修改后的片段:[0]

import lightgbm
import pandas as pd

# creating the sequence [1, 2, ..., 9] as a pd.Series
sequence = pd.Series(range(1, 10))

# applying the differencing operation
sequence = sequence.diff()

# transforming the series into a trainable format using 3 lags
sequence_df = pd.concat([sequence.shift(i) for i in range(3, -1, -1)], axis=1)
sequence_df.columns = ['t-' + str(i) for i in list(reversed(range(3)))] + ['t+1']
sequence_df = sequence_df.dropna().reset_index(drop=True)

X = sequence_df.drop('t+1', axis=1)
y = sequence_df['t+1']

# training the model
model = lightgbm.LGBMRegressor()
model.fit(X, y)

# getting the raw prediction (i.e. for differenced data)
prediction_raw = model.predict([[7, 8, 9]])
# reverting the differencing operation - adding the last known value
prediction_final = prediction_raw + 9
## prediction_final = 10

因此,第 8 行中的差分步骤将序列 [1, 2, …, 9] 转换为 1 的恒定序列。除预测阶段外,其余过程与之前相同。

首先,我们得到差分数据的预测(prediction_raw)。然后,我们通过添加最后一个已知观测值(即 9)来恢复差分操作。

瞧,我们得到了 10 个。

这个故事是关于 LightGBM 行为的轶事,但也是一个警示故事。 LightGBM 是一种强大的算法。但是预处理时间序列对于预测系统的开发至关重要。因此,请注意这种趋势!

Thanks for reading!

附:我们可以应用线性模型(或助推器)。然后,不需要差分预处理。尽管如此,在对时间序列进行建模时,消除趋势也有助于线性模型。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月11日
下一篇 2022年5月11日

相关推荐