0

0

集成时间序列模型提高预测精度

PHPz

PHPz

发布时间:2023-05-11 09:10:05

|

1002人浏览过

|

来源于51CTO.COM

转载

使用Catboost从RNN、ARIMA和Prophet模型中提取信号进行预测。

集成各种弱学习器可以提高预测精度,但是如果我们的模型已经很强大了,集成学习往往也能够起到锦上添花的作用。流行的机器学习库scikit-learn提供了一个StackingRegressor,可以用于时间序列任务。但是StackingRegressor有一个局限性;它只接受其他scikit-learn模型类和api。所以像ARIMA这样在scikit-learn中不可用的模型,或者来自深度神经网络的模型都无法使用。在这篇文章中,我将展示如何堆叠我们能见到的模型的预测。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

集成时间序列模型提高预测精度

我们将用到下面的包:

pip install --upgrade scalecast
 conda install tensorflow
 conda install shap
 conda install -c conda-forge cmdstanpy
 pip install prophet

数据集

数据集每小时一次,分为训练集(700个观测值)和测试集(48个观测值)。下面代码是读取数据并将其存储在Forecaster对象中:

import pandas as pd
 import numpy as np
 from scalecast.Forecaster import Forecaster
 from scalecast.util import metrics
 import matplotlib.pyplot as plt
 import seaborn as sns
 
 def read_data(idx = 'H1', cis = True, metrics = ['smape']):
 info = pd.read_csv(
 'M4-info.csv',
 index_col=0,
 parse_dates=['StartingDate'],
 dayfirst=True,
)
 train = pd.read_csv(
 f'Hourly-train.csv',
 index_col=0,
).loc[idx]
 test = pd.read_csv(
 f'Hourly-test.csv',
 index_col=0,
).loc[idx]
 y = train.values
 sd = info.loc[idx,'StartingDate']
 fcst_horizon = info.loc[idx,'Horizon']
 cd = pd.date_range(
 start = sd,
 freq = 'H',
 periods = len(y),
)
 f = Forecaster(
 y = y, # observed values
 current_dates = cd, # current dates
 future_dates = fcst_horizon, # forecast length
 test_length = fcst_horizon, # test-set length
 cis = cis, # whether to evaluate intervals for each model
 metrics = metrics, # what metrics to evaluate
)
 
 return f, test.values
 
 f, test_set = read_data()
 f # display the Forecaster object

结果是这样的:

集成时间序列模型提高预测精度

模型

在我们开始构建模型之前,我们需要从中生成最简单的预测,naive方法就是向前传播最近24个观测值。

f.set_estimator('naive')
 f.manual_forecast(seasonal=True)

然后使用ARIMA、LSTM和Prophet作为基准。

ARIMA

Autoregressive Integrated Moving Average 是一种流行而简单的时间序列技术,它利用序列的滞后和误差以线性方式预测其未来。通过EDA,我们确定这个系列是高度季节性的。所以最终选择了应用order (5,1,4) x(1,1,1,24)的季节性ARIMA模型。

f.set_estimator('arima')
 f.manual_forecast(
order = (5,1,4),
seasonal_order = (1,1,1,24),
call_me = 'manual_arima',
 )

LSTM

如果说ARIMA是时间序列模型中比较简单的一种,那么LSTM就是比较先进的方法之一。它是一种具有许多参数的深度学习技术,其中包括一种在顺序数据中发现长期和短期模式的机制,这在理论上使其成为时间序列的理想选择。这里使用tensorflow建立这个模型

f.set_estimator('rnn')
 f.manual_forecast(
 lags = 48,
 layers_struct=[
('LSTM',{'units':100,'activation':'tanh'}),
('LSTM',{'units':100,'activation':'tanh'}),
('LSTM',{'units':100,'activation':'tanh'}),
],
 optimizer = 'Adam',
 epochs = 15,
 plot_loss = True,
 validation_split=0.2,
 call_me = 'rnn_tanh_activation',
 )
 
 f.manual_forecast(
 lags = 48,
 layers_struct=[
('LSTM',{'units':100,'activation':'relu'}),
('LSTM',{'units':100,'activation':'relu'}),
('LSTM',{'units':100,'activation':'relu'}),
],
 optimizer = 'Adam',
 epochs = 15,
 plot_loss = True,
 validation_split=0.2,
 call_me = 'rnn_relu_activation',
 )

Prophet

尽管它非常受欢迎,但有人声称它的准确性并不令人印象深刻,主要是因为它对趋势的推断有时候很不切实际,而且它没有通过自回归建模来考虑局部模式。但是它也有自己的特点。1,它会自动将节日效果应用到模型身上,并且还考虑了几种类型的季节性。可以以用户所需的最低需求来完成这一切,所以我喜欢把它用作信号,而不是最终的预测结果。

f.set_estimator('prophet')
 f.manual_forecast()

比较结果

现在我们已经为每个模型生成了预测,让我们看看它们在验证集上的表现如何,验证集是我们训练集中的最后48个观察结果。

results = f.export(determine_best_by='TestSetSMAPE')
 ms = results['model_summaries']
 ms[
[
 'ModelNickname',
 'TestSetLength',
 'TestSetSMAPE',
 'InSampleSMAPE',
]
 ]

集成时间序列模型提高预测精度

每个模型的表现都优于naive方法。ARIMA模型表现最好,百分比误差为4.7%,其次是Prophet模型。让我们看看所有的预测与验证集的关系:

f.plot(order_by="TestSetSMAPE",ci=True)
 plt.show()

集成时间序列模型提高预测精度

易通cmseasy免费的企业建站程序2.0 UTF-8 build 201000510 中文版
易通cmseasy免费的企业建站程序2.0 UTF-8 build 201000510 中文版

易通(企业网站管理系统)是一款小巧,高效,人性化的企业建站程序.易通企业网站程序是国内首款免费提供模板的企业网站系统.§ 简约的界面及小巧的体积:后台菜单完全可以修改成自己最需要最高效的形式;大部分操作都集中在下拉列表框中,以节省更多版面来显示更有价值的数据;数据的显示以Javascript数组类型来输出,减少数据的传输量,加快传输速度。 § 灵活的模板标签及模

下载

所有这些模型在这个时间序列上的表现都很合理,它们之间没有很大的偏差。下面让我们把它们堆起来!

堆叠模型

每个堆叠模型都需要一个最终估计器,它将过滤其他模型的各种估计,创建一组新的预测。我们将把之前结果与Catboost估计器叠加在一起。Catboost是一个强大的程序,希望它能从每个已经应用的模型中充实出最好的信号。

f.add_signals(
 f.history.keys(), # add signals from all previously evaluated models
 )
 f.add_ar_terms(48)
 f.set_estimator('catboost')

上面的代码将来自每个评估模型的预测添加到Forecaster对象中。它称这些预测为“信号”。 它们的处理方式与存储在同一对象中的任何其他协变量相同。 这里还添加了最后 48 个系列的滞后作为 Catboost 模型可以用来进行预测的附加回归变量。 现在让我们调用三种 Catboost 模型:一种使用所有可用信号和滞后,一种仅使用信号,一种仅使用滞后。

f.manual_forecast(
 Xvars='all',
 call_me='catboost_all_reg',
 verbose = False,
 )
 f.manual_forecast(
 Xvars=[x for x in f.get_regressor_names() if x.startswith('AR')],
 call_me = 'catboost_lags_only',
 verbose = False,
 )
 f.manual_forecast(
 Xvars=[x for x in f.get_regressor_names() if not x.startswith('AR')],
 call_me = 'catboost_signals_only',
 verbose = False,
 )

下面可以比较所有模型的结果。我们将研究两个度量:SMAPE和平均绝对比例误差(MASE)。这是实际M4比赛中使用的两个指标。

test_results = pd.DataFrame(index = f.history.keys(),columns = ['smape','mase'])
 for k, v in f.history.items():
 test_results.loc[k,['smape','mase']] = [
 metrics.smape(test_set,v['Forecast']),
 metrics.mase(test_set,v['Forecast'],m=24,obs=f.y),
]
 
 test_results.sort_values('smape')

集成时间序列模型提高预测精度

可以看到,通过组合来自不同类型模型的信号生成了两个优于其他估计器的估计器:使用所有信号训练的Catboost模型和只使用信号的Catboost模型。这两种方法的样本误差都在2.8%左右。下面是对比图:

fig, ax = plt.subplots(figsize=(12,6))
 f.plot(
 models = ['catboost_all_reg','catboost_signals_only'],
 ci=True,
 ax = ax
 )
 sns.lineplot(
 x = f.future_dates,
 y = test_set,
 ax = ax,
 label = 'held out actuals',
 color = 'darkblue',
 alpha = .75,
 )
 plt.show()

集成时间序列模型提高预测精度

哪些信号最重要?

为了完善分析,我们可以使用shapley评分来确定哪些信号是最重要的。Shapley评分被认为是确定给定机器学习模型中输入的预测能力的最先进的方法之一。得分越高,意味着输入在特定模型中越重要。

f.export_feature_importance('catboost_all_reg')

集成时间序列模型提高预测精度

上面的图只显示了前几个最重要的预测因子,但我们可以从中看出,ARIMA信号是最重要的,其次是序列的第一个滞后,然后是Prophet。RNN模型的得分也高于许多滞后模型。如果我们想在未来训练一个更轻量的模型,这可能是一个很好的起点。

总结

在这篇文章中,我展示了在时间序列上下文中集成模型的力量,以及如何使用不同的模型在时间序列上获得更高的精度。这里我们使用scalecast包,这个包的功能还是很强大的,如果你喜欢,可以去它的主页看看:https://github.com/mikekeith52/scalecast

本文的数据集是M4的时序竞赛:https://github.com/Mcompetitions/M4-methods

使用代码在这里:https://scalecast-examples.readthedocs.io/en/latest/misc/stacking/custom_stacking.html

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

1100

2026.01.21

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

24

2025.12.22

Python 深度学习框架与TensorFlow入门
Python 深度学习框架与TensorFlow入门

本专题深入讲解 Python 在深度学习与人工智能领域的应用,包括使用 TensorFlow 搭建神经网络模型、卷积神经网络(CNN)、循环神经网络(RNN)、数据预处理、模型优化与训练技巧。通过实战项目(如图像识别与文本生成),帮助学习者掌握 如何使用 TensorFlow 开发高效的深度学习模型,并将其应用于实际的 AI 问题中。

56

2026.01.07

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2140

2024.08.16

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

43

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

56

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.9万人学习

CSS3 教程
CSS3 教程

共18课时 | 5万人学习

Rust 教程
Rust 教程

共28课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号