关于人工智能:3种时间序列混合建模方法的效果对比和代码实现

6次阅读

共计 4313 个字符,预计需要花费 11 分钟才能阅读完成。

本文中将探讨如何建设一个无效的混合预测器,并对常见混合形式进行比照和剖析

基于树的算法在机器学习生态系统中是家喻户晓的,它们以主导表格的监督工作而闻名。在学习过程中,树的决裂规范只关注相干特色和有用值的范畴,所以给定一组表格特色和要预测的指标,无需太多配置和特定的预处理就能够失去令人满意的后果。

然而基于树和梯度晋升模型在工夫序列预测畛域的体现并不好,很多人更偏向于深度学习的办法。这并不奇怪,因为基于树的模型的弱点在于:在技术上无奈推断出比训练数据中更高 / 更低的特征值。他们简直不可能预测所见区间之外的值。相同,经典的线性回归可能较少受到数据动静行为的影响。既然线性回归善于推断趋势,而梯度晋升善于学习交互,是否能够将它们联合起来呢?本文指标是创立“混合”预测器,联合互补的学习算法,让一个的劣势补救另一个的弱点。

在应用深度学习时,更容易想到“混合模型”,因为神经网络的有限架构组合和个性化训练过程在定制方面提供了微小的益处。应用树模型开发定制的混合是比拟麻烦的。linear-tree,这个 python 包是一个不错的抉择,它提供混合模型架构,混合了基于树的模型和线性模型的学习能力。不仅如此,LGBM 或 XGBoost 也引入了用树叶中的线性近似拟合梯度晋升的能力。

在这篇文章中,我尝试从头开始构建一个混合预测器。上面须要做的就是依照两步的办法来学习零碎模式。

基础知识

为了设计无效的混合,咱们须要对工夫序列的构建形式有一个大抵的理解。工夫序列个别能够通过将三个组成部分(趋势、节令和周期)加上一个实质上不可预测的项(误差)加在一起来准确形容。

series = trend + seasons + cycles + error

学习工夫序列组件能够看作是一个迭代过程:

  • 首先,学习趋势并将其从原始序列中减去,失去残差序列;
  • 其次,从去趋势的残差中学习季节性并减去节令;
  • 最初,学习周期并减去周期。

换句话说,咱们应用一种算法来拟合特定的组件序列,而后应用另一种算法来拟合残差序列。最终的预测是各种模型组件的预测相加。

为了尝试构建混合模型,咱们开始生成一些具备双季节性模式和趋势重量的工夫序列数据。

np.random.seed(1234)
seas1 = gen_sinusoidal(timesteps=timesteps, amp=10, freq=24, noise=4)
seas2 = gen_sinusoidal(timesteps=timesteps, amp=10, freq=24*7, noise=4)

rw = gen_randomwalk(timesteps=timesteps, noise=1)
X = np.linspace(0,10, timesteps).reshape(-1,1)
X = np.power(X, [1,2,3])
m = LinearRegression()
trend = m.fit(X, rw).predict(X)

plt.figure(figsize=(16,4))
plt.subplot(121)
plt.plot(seas1 + seas2, c='red'); plt.title('Seasonalities')
plt.subplot(122)
plt.plot(rw, c='black'); plt.plot(trend, c='red'); plt.title('Trend')

plt.figure(figsize=(16,4))
plt.plot(seas1 + seas2 + trend, c='red'); plt.title('Seasonalities + Trend')

在随机游走序列上拟合三次多项式能够取得未知趋势。后果是一条平滑的趋势线,它被增加到季节性重量中以取得最终的工夫序列。能够通过以这种形式生成多个工夫序列,并尝试预测它们对各种解决方案进行基准测试。

df.plot(legend=False, figsize=(16,6))

试验办法

本文中尝试了四种不同的办法:

  • 拟合一个简略的线性模型;
  • differencing:应用差分变换,使指标变得稳固;
  • hybrid additive:拟合具备最优的线性模型推断趋势。而后用梯度晋升对去趋势序列进行建模;
  • hybrid inclusive.:拟合梯度晋升,包含外推趋势(取得拟合具备最优线性模型拟合的趋势)作为特色。

除了最根本的解决方案,下面的所有办法都应用一些样条变换作为特色。这些特色能够很好地捕获了季节性模式。通过在训练数据上搜寻最佳线性模型来计算最佳趋势。应用工夫穿插验证策略搜寻一些最佳参数配置。

后果

对于能够应用的每个系列,都尝试了下面所有提到的办法,并将后果存储在测试数据上。

### 训练过程略,请查看最初的残缺源代码 ###

scores = pd.DataFrame({f'{score_naive}': mse_naive,
    f'{score_diff}': mse_diff,
    f'{score_hybrid_add}': mse_hybrid_add,
    f'{score_hybrid_incl}': mse_hybrid_incl
})

scores.plot.box(figsize=(11,6), title='MSEs on Test', ylabel='MSE')

hybrid inclusive 取得最低的均匀测试误差,其次是差分法。hybrid additive 的体现低于咱们的预期,因为它的谬误简直是差分办法的三倍。一般来说,在对动静零碎(例如本文的试验中提出的零碎)进行建模时,对目标值进行差分操作是一个很好的抉择。混合办法之间的微小性能差别也体现出了一些问题。让咱们检查一下下后果,看看会产生什么。

c = 'ts_11' 

df.plot(figsize=(16,6), label='true', alpha=0.3, c='black')

df_diff.plot(figsize=(16,6), label='differencing pred', c='magenta')
df_hybrid_add.plot(figsize=(16,6), label='hybrid addictive pred', c='red')
df_hybrid_incl.plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')
df_naive.plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)

plt.xlim(0, timesteps)
plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')
plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')
plt.legend()

预测比拟 1

c = 'ts_33' 

df.plot(figsize=(16,6), label='true', alpha=0.3, c='black')

df_diff.plot(figsize=(16,6), label='differencing pred', c='magenta')
df_hybrid_add.plot(figsize=(16,6), label='hybrid addictive pred', c='red')
df_hybrid_incl.plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')
df_naive.plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)

plt.xlim(0, timesteps)
plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')
plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')
plt.legend()

预测比拟 2

c = 'ts_73' 

df.plot(figsize=(16,6), label='true', alpha=0.3, c='black')

df_diff.plot(figsize=(16,6), label='differencing pred', c='magenta')
df_hybrid_add.plot(figsize=(16,6), label='hybrid addictive pred', c='red')
df_hybrid_incl.plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')
df_naive.plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)

plt.xlim(0, timesteps)
plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')
plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')
plt.legend()

预测比拟 3

从下面的一堆图像中,能够更好地了解 additive 办法的“失败”。它的体现与之前趋势拟合的好坏密切相关。如果趋势预计不精确,那么最终预测将更不精确。但这种行为通过 hybrid inclusive 办法失去缓解,因为趋势作为特色蕴含在模型中。因而梯度晋升能够纠正 / 加重最终的预测误差。

总结

在这篇文章中,介绍了建设工夫序列混合预测模型的不同办法。须要强调的重要一点是,除了这里展现的办法外,还有许多办法能够组合机器学习模型。如果咱们能分明了解规范算法是如何工作的,便可能更轻松地调试或了解混合发明的可能缺点或缺点。

最初,本文的残缺代码在这里:

https://www.overfit.cn/post/266402dd48eb4a8884aa0f7c359da2cb

作者:Marco Cerliani

正文完
 0