调整 ARIMA 进行预测:Python 中的一种简单方法

news2024/11/18 9:46:31

一、说明

        ARIMA 时间序列预测模型非常适合具有趋势和季节性的序列。它是一种被广泛采用的经典模型,通常作为现代深度学习方法基准测试的基准。然而,估计其准确的参数具有挑战性。研究人员和开发人员通常使用包括视觉绘图在内的试错方法。

二、什么是ARIMA模型?

        ARIMA 模型是“自动回归移动平均线”的缩写,是一类使用过去值来估计未来预测的模型。ARIMA 模型由三个参数定义:p、d 和 q。

        ARIMA模型在文献中研究了不同的变体。在这篇文章中,我们将使用 statsmodels 库中的实现。

        整个笔记本显示了此处提供的简单实现。您可以为数据集修改此实现。根据需要创建单独的训练-测试拆分。我简单概述了重要的调整步骤。

三、完整代码:使用 Mango 自动调优

import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/AileenNielsen/TimeSeriesAnalysisWithPython/master/data/AirPassengers.csv')

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
from mango import scheduler, Tuner

def arima_objective_function(args_list):
    global data_values
    
    params_evaluated = []
    results = []
    
    for params in args_list:
        try:
            p,d,q = params['p'],params['d'], params['q']
            trend = params['trend']
            
            model = ARIMA(data_values, order=(p,d,q), trend = trend)
            predictions = model.fit()
            mse = mean_squared_error(data_values, predictions.fittedvalues)   
            params_evaluated.append(params)
            results.append(mse)
        except:
            #print(f"Exception raised for {params}")
            #pass 
            params_evaluated.append(params)
            results.append(1e5)
        
        #print(params_evaluated, mse)
    return params_evaluated, results

param_space = dict(p= range(0, 30),
                   d= range(0, 30),
                   q =range(0, 30),
                   trend = ['n', 'c', 't', 'ct']
                  )

conf_Dict = dict()
conf_Dict['num_iteration'] = 200
data_values = list(df['#Passengers'])
tuner = Tuner(param_space, arima_objective_function, conf_Dict)
results = tuner.minimize()
print('best parameters:', results['best_params'])
print('best loss:', results['best_objective'])
best parameters: {'d': 0, 'p': 17, 'q': 23, 'trend': 'ct'}
best loss: 112.06886739549542

四、调整步骤

数据集:我们将使用一个简单的航空通行证数据集来记录航空公司乘客的数量。

import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/AileenNielsen/TimeSeriesAnalysisWithPython/master/data/AirPassengers.csv')
df.head()

绘制序列以查看趋势和季节性

from matplotlib import pyplot as plt
f = plt.figure()
f.set_figwidth(15)
f.set_figheight(6)
plt.plot(df['#Passengers'], linewidth = 4, label = "original Series")
plt.legend(fontsize=25)
plt.xlabel('Months', fontsize = 25)
plt.ylabel('Count', fontsize = 25)
plt.show()

该数据集呈上升趋势,季节性为 12 个月。

传统上,一种方法是使用领域知识从原始序列中删除趋势和季节性,然后使用残差序列来预测未来。但是,我们将研究一种更直接的自动化方法。

五、如何自动调整参数?

我们将使用一个名为 Mango 的最先进的优化库来为我们的数据集找到最佳参数。让我们首先定义参数的范围。在这种优化方法中,我们定义了可能的参数范围。这个范围可以非常大,不需要精确。这些参数是从 statsmodels 库中定义的。

param_space = dict(p= range(0, 30),
                   d= range(0, 30),
                   q =range(0, 30),
                   trend = ['n', 'c', 't', 'ct']
                  )

参数空间是使用 python 构造定义的:range 和 list。参数的总可能组合集为 30*30*30*4 = 108,000。因此,详尽的网格搜索非常耗时。我们将使用贝叶斯搜索优化器方法在 ~100 次迭代内自动执行搜索。注意:根据您的数据集,范围的大小及其搜索空间可能会有所不同。定义一个大的搜索空间是可以的;让优化器为您完成艰巨的工作。

六、训练 ARIMA 模型

要使用 Mango,我们必须定义一个目标函数,该函数返回给定参数集的 ARIMA 模型误差。

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
from mango import scheduler, Tuner

def arima_objective_function(args_list):
    global data_values
    
    params_evaluated = []
    results = []
    
    for params in args_list:
        try:
            p,d,q = params['p'],params['d'], params['q']
            trend = params['trend']
            
            model = ARIMA(data_values, order=(p,d,q), trend = trend)
            predictions = model.fit()

            mse = mean_squared_error(data_values, predictions.fittedvalues)   
            params_evaluated.append(params)
            results.append(mse)
        except:
            #print(f"Exception raised for {params}")
            #pass 
            params_evaluated.append(params)
            results.append(1e5)
        
        #print(params_evaluated, mse)
    return params_evaluated, results

我们从 Mango 库中获取参数,并返回参数及其结果。结果包括经过训练的 ARIMA 模型的误差。在这种情况下,错误是mean_squared_error。 我们还包括 try-catch 语句,因为 ARIMA 模型可能不会收敛于每个参数组合/选择。我们只返回模型工作的参数集。Mango 在内部以最佳方式使用这些参数,以在很少的迭代(本例中为 100 次)内找到最佳模型。我们的目标是找到最小化误差函数的参数。

Mango 的控制迭代:Config 参数。

from mango import scheduler, Tuner

conf_Dict = dict()
conf_Dict['num_iteration'] = 200

tuner = Tuner(param_space, arima_objective_function, conf_Dict)

七、可视化最佳模型预测

总体而言,我们看到参数的可能组合总数非常大(108,000)。

def plot_arima(data_values, order = (1,1,1), trend = 'c'):
    print('final model:', order, trend)
    model = ARIMA(data_values, order=order, trend = trend)
    results = model.fit()
    
    error = mean_squared_error(data_values, results.fittedvalues)   
    print('MSE error is:', error)
    
    from matplotlib import pyplot as plt
    f = plt.figure()
    f.set_figwidth(15)
    f.set_figheight(6)
    plt.plot(data_values, label = "original Series", linewidth = 4)
    plt.plot(results.fittedvalues, color='red', label = "Predictions", linestyle='dashed', linewidth = 3)
    plt.legend(fontsize = 25)
    plt.xlabel('Months', fontsize = 25)
    plt.ylabel('Count', fontsize = 25)
    plt.show()

print(results['best_params'])

order = (results['best_params']['p'], results['best_params']['d'], results['best_params']['q'])
plot_arima(data_values, order=order, trend = results['best_params']['trend'])

        如上所述,预测与基本事实完全吻合。有兴趣了解有关 Mango checkout 的更多信息,其 GitHub 存储库包含一组不同的示例。Sandeep Singh Sandha博士

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Python的turtle模块绘制彩色螺旋线

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。在本博客中,我们将使用turtle模块来绘制一个彩色的螺旋线。通过调用各种命令,我们可以引导turtle绘制出指定…

RevCol实战:使用RevCol实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 可逆柱状结构(RevCol)是一种网络结构,它受到GLOM(Global Columnar Memory)的启发。RevCol由N个子网络(或称为…

常见树种(贵州省):018栎灌、油茶、火棘、铁仔、小檗、勾儿茶、马桑、车桑子、山苍子、楮

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、茅栗 …

萨科微举办工作交流和业务分享会

萨科微(www.slkoric.com)举办工作交流和业务分享会,狠抓人才培养团队的基本功建设。萨科微总经理宋仕强先生认为,当下市场经济形势复杂多变,给公司经营带来巨大压力,同时考验着企业自身的发展韧性。萨科微公…

认识Linux操作系统

什么是操作系统? 操作系统是一款软硬件资源管理的软件Linux是一款具体的操作系统的品类(Linux内核是用C语言写的)centos7是一款具体的Linux操作系统 为什么要有操作系统? Linux操作系统 Linux是一种自由和开放源代码的类UNIX操…

php获取当前域名方法

使用$_SERVER[HTTP_HOST]变量只获取到域名: $domain $_SERVER[HTTP_HOST]; echo $domain; 获取包含协议和域名的完整URL $protocol isset($_SERVER[HTTPS]) && $_SERVER[HTTPS] on ? https:// : http://; $domain $_SERVER[HTTP_HOST]; $current_url…

Ceph分布式存储系统的介绍及详细安装部署过程:详细实战版(保姆级)

Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。 在经过了数年的发展之后,目前…

基于Python的面向对象分类实例Ⅱ

接上一部分继续介绍~ 一、地类矢量转栅格 这一步是为了能让地类值和影像的对象落在同一区域,从而将影像中的分割对象同化为实际地物类别。 train_fn r".\train_data1.shp" train_ds ogr.Open(train_fn) lyr train_ds.GetLayer() driver gdal.GetDrive…

【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流

文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆,成功带火了AIGC,让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…

【Mybatis-Plus篇】Mybatis-Plus基本使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_…

一个正整数转为2进制和8进制,1的个数相同的第23个数是什么?

package cn.com;import java.lang.*;//默认加载public class C2 {//10进制转8进制static int HtoO(int n){int cnt 0;while(n!0){cntn%8;n/8;}return cnt;}//10进制转2进制static int HtoB(int n){int cnt 0;while(n!0){cntn%2;n/2;}return cnt;}public static void main(Str…

Linux常用命令——bind命令

在线Linux命令查询工具 bind 显示或设置键盘按键与其相关的功能 补充说明 bind命令用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合…

NX二次开发UF_CURVE_ask_curve_fit_data 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_fit_data Defined in: uf_curve.h int UF_CURVE_ask_curve_fit_data(tag_t curve_feature, UF_CURVE_curve_fit_data * curve_fit_data ) overview 概述 Ask c…

windows c++ open3D release版本下载与使用

文章目录 open3d库下载路径下载库的使用 Open3D的下载与成功调用,咱们不使用vs来编译。 我开始时候吧,想做个vs编译,后来就是在vs中反复进坑。编译来来去去都是报错。 咱们使用新方法,仅仅修改一两句代码,简单cmd编译即…

记录华为云服务器(Linux 可视化 宝塔面板)-- 安全组篇

文章目录 前言安全组说明安全组的特性安全组的应用场景 进入安全组添加基本规则添加自定义规则如有启发,可点赞收藏哟~ 前言 和windows防火墙类似,安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,可以对进出云服务器的流量…

laravel8安装多应用多模块(笔记三)

先安装laravel8 Laravel 安装(笔记一)-CSDN博客 一、进入项目根目录安装 laravel-modules composer require nwidart/laravel-modules 二、 大于laravel5需配置provider,自动生成配置文件 php artisan vendor:publish --provider"Nwid…

RevCol实战:使用RevCol实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

NX二次开发UF_CURVE_add_faces_ocf_data 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_add_faces_ocf_data Defined in: uf_curve.h int UF_CURVE_add_faces_ocf_data(tag_t face_tag, UF_CURVE_ocf_data_p_t uf_offset_data ) overview 概述 Add a face col…

系列九、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式,Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来…