教 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!
附:我们可以应用线性模型(或助推器)。然后,不需要差分预处理。尽管如此,在对时间序列进行建模时,消除趋势也有助于线性模型。
文章出处登录后可见!