自动 ARIMA 超参数搜索

一、介绍

        

        这种用于自动超参数搜索进行预测的开发方法可能会花费大量时间,但它可以带来回报,因为当您找到预测模型的最佳参数时,它将节省时间并提高预测的精度。此外,手动尝试可能会花费您最多的时间,但这种方法在某些情况下可能会有所帮助,请记住,理解为什么我们应该在预测模型中使用精确的参数对于更好地理解业务问题至关重要。尽管如此,这种方法可以缩短您的探索时间并帮助您更好地理解您的问题。

        在这篇博客中,我将介绍自动搜索 (S)ARIMA 预测模型关键参数的方法。我们将在 (S)ARIMA 预测模型中调整的超参数是季节性参数 (S)、自回归参数 (AR)、差分参数 (I) 和移动平均值 (MA)。如果需要,您可以在我之前的博客中阅读有关此参数的更多信息(此处)。

二、CO2 数据示例

        我们将检查并绘制过去 50 年二氧化碳排放时间序列的趋势和季节性,由于冬季供暖期,我们看到了增加的趋势和清晰的季节性模式(完整代码和数据可在此处获取)。

import pandas as pd
import numpy as np
from statsmodels.tsa.seasonal import STL
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
import statsmodels.api as sm
plt.rc('figure',figsize=(10,6))
plt.rc('font',size=13)
stl = STL(co2, seasonal=7)
res = stl.fit()
fig = res.plot()

CO2数据分解

在使用创建的函数绘制差分时间序列的滚动平均值(12 个数据点)和标准差后,我们应该检查多年来二氧化碳排放量的平稳性。

def test_stationarity(timeseries, rolling=12):
    
    #Determing rolling statistics
    rolmean = timeseries.rolling(rolling).mean()
    rolstd = timeseries.rolling(rolling).std()

    #Plot rolling statistics:
    plt.figure(figsize=(10, 5))
    orig = plt.plot(timeseries, color='blue',label='Original')
    mean = plt.plot(rolmean, color='red', label='Rolling Mean')
    std = plt.plot(rolstd, color='black', label = 'Rolling Std')
    plt.title('Power consumption Old data')
    plt.xlabel('Time - periods(30s)')
    plt.ylabel('Power consumption in Watts')
    plt.legend(loc='best')
    plt.title('Rolling Mean & Standard Deviation')
    plt.show()

    
    #Perform Dickey-Fuller test:
    print ('Results of Dickey-Fuller Test:') 
    dftest = adfuller(timeseries, autolag='AIC')
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    print (dfoutput)
    if dfoutput['p-value'] < 0.05:
        print('The time series is stationary at 95% level of confidence')
    else:
        print('The time series is not stationary at 95% level of confidence')
co2_diff = co2 - co2.shift(1)
co2_diff = co2_diff.dropna()
test_stationarity(co2_diff, rolling=12)

差分 C02 数据是平稳的。

在进行自动 arima 搜索之前,我们将检查 40 个时间点的相关图,以了解数据如何跨滞后相关,由此我们可以确认高 AR 参数以及强季节性模式(偏相关,捕获所有其他变量回归后的残差)。

fig, axes = plt.subplots(1, 2, figsize=(15,4))

fig = sm.graphics.tsa.plot_acf(co2, 
                               lags=40, 
                               ax=axes[0])
fig = sm.graphics.tsa.plot_pacf(co2, 
                                lags=40, 
                                ax=axes[1])

C02 数据的相关图。

三、自动调节

        在代码的下一部分中,我们创建了 p (AR)、d(I) 和 q(MA) 参数的几种组合。为了放宽搜索范围,我们将季节性 (s) 参数定义为 12,因为我们确信存在年度模式。为了评估模型的优点,我们使用 Akaike 信息标准 (aic)。该标准对于某些数据的统计模型至关重要,通过计算 k(模型中估计参数的数量)与 L(模型似然函数的最大值)之间的差异。这意味着具有最佳 AIC 的模型将具有最佳似然值和尽可能最少的参数数量,从而使模型简单高效(简约),从而实现最佳性能。模型的AIC值如下:

AIC=2k−2ln(L)

import itertools
import warnings
warnings.filterwarnings('ignore')
# Grid Search
p = d = q = range(0,3) # p, d, and q can be either 0, 1, or 2
pdq = list(itertools.product(p,d,q)) # gets all possible combinations of p, d, and q 
p2 = d2 = q2 = range(0, 2) # second set of p's, d's, and q's for seasonal parameters
pdq2 = list(itertools.product(p2,d2,q2)) # similar to code above but for seasonal parameters
s = 12 # here I use twelve but the number here is representative of the periodicity of the seasonal cycle
pdqs2 = [(c[0], c[1], c[2], s) for c in pdq2]
combs = {}
aics = []
# Grid Search Continued
for combination in pdq:
    for seasonal_combination in pdqs2:
        try:
            model = sm.tsa.statespace.SARIMAX(co2, order=combination, seasonal_order=seasonal_combination,
                                             enforce_stationarity=True,
                                             enforce_invertibility=True)
            model = model.fit(disp=False)
            combs.update({model.aic : [combination, seasonal_combination]})
            aics.append(model.aic)
            
        except:
            continue
            
best_aic = min(aics)

        现在我们可以看到哪些预测超参数可以提供最佳预测。

print('best aic is: ', round(best_aic, 3))
print(40*'==')
print ('ARIMA parameters: ', '\n', 'AR: ', combs[best_aic][0][0], '\n', 'I: ',combs[best_aic][0][1], '\n', 'MA: ',combs[best_aic][0][2])
print('Seasonal parameters:', combs[best_aic][1])

        自动选择的参数由最佳AI​​C值决定。

        恭喜!有了这个超参数,我们可以进行训练测试分割并对测试集进行预测,然后比较预测和测试结果。

四、使用选定的超参数进行预测

        创建train-test split函数后,我们进行实际预测:

def train_test_split(timeseries, lags_for_prediction=12):
    split=len(timeseries)-lags_for_prediction
    train=timeseries[:split]
    test=timeseries[split:]
    return train, test
train_series, test_series = train_test_split(co2, 12)

        检查模型优良性的好方法是绘制预测数据与测试数据的图。在实际应用中,真正的预测将更多地涉及未来,但这一步确保我们拥有一个好的模型。

def forecasting (p,d,q, season, lags_for_forecast, train_series):

    model = sm.tsa.statespace.SARIMAX(train_series, order=(p,d,q), seasonal_order=(p,d,q,season),
                                             simple_differencing=0, #if True  time series provided as endog is literally differenced and an ARMA model is fit to the resulting new time series
                                             enforce_stationarity=True,
                                             enforce_invertibility=False)
    fitted = model.fit(disp=-1)  

    # Forecast
    forecast = fitted.forecast(lags_for_forecast)

    # Plot
    plt.figure(figsize=(12,5), dpi=100)
    plt.plot(train_series, color='blue', label='train')
    plt.plot(test_series, color='green', label='test', alpha=0.6)
    plt.plot(forecast, color='red', label='forecast')
    plt.title('Forecast vs Actuals')
    plt.legend(loc='upper left', fontsize=8)
    plt.show()
    RSS=np.sqrt(sum(forecast.values-test_series.values.reshape(-1))**2)/lags_for_forecast
    print("\n", '\033[1m' +'Root Squared Error (RSS) of SARIMAX model(p,d,q)(p,d,q,s)' + '\033[0m',(p,d,q),season,':', round(RSS, 3),"\n")
    print(fitted.summary())
forecasting (2,1,1, 12, 12, train_series)

预测数据与测试数据。

        正如我们所看到的,自动调整效果非常好。statsmodels 的摘要选项使我们能够更深入地了解参数的统计显着性。非常小的均方根误差 (0.313) 为我们提供了额外的保证,即我们拥有可靠且良好的模型。就这样了。在某些情况下,旧的传统 ARIMA 可以击败复杂的 LSTM :)

维托米尔·约万诺维奇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拼图小游戏

运行出的游戏界面如下&#xff1a; User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password;public User() {}public User(String username, String password) {this.user…

java--贪吃蛇

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random;public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {int slong 2;//蛇当前长度//蛇坐标int[] Snakex new int[100];int[] Snakey new…

存储过程与触发器

一、存储过程 1.1 概念 把需要重复执行的内容放在存储过程中&#xff0c;实现代码的复用。 create procedure 创建存储过程的关键字 my_proc1:存储过程的名字。 执行下例代码就是创建了一个存储过程 执行存储过程&#xff0c;就是把上图的插入语句重复执行&#xff0c;现…

100张照片带你了解真实的日本人

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 今年三个月内去了两次日本旅行&#xff0c;到了东京、横滨、大阪、京都、奈良、富士山、神户、富士山等城市&#xff0c;途中一共拍下了10000张照片。 最近整理照片的过程中&#xff0c;发现也拍了许多有意思的人像照&…

记录基于scapy构造ClientHello报文的尝试

最近有个需求就是用scapy构造https的client hello报文&#xff0c;由用户指定servername构造对应的报文。网上对于此的资料甚少&#xff0c;有的也是怎么去解析https报文&#xff0c;但是对于如果构造基本上没有找到相关的资料。 一直觉得最好的老师就是Python的help功能和dir功…

go学习之简单项目

项目 文章目录 项目1.项目开发流程图2.家庭收支记账软件项目2&#xff09;项目代码实现3&#xff09;具体功能实现 3.客户信息管理系统1&#xff09;项目需求说明2&#xff09;界面设计3&#xff09;项目框架图4&#xff09;流程5&#xff09;完成显示客户列表的功能6&#xff…

变频器干扰PLC,我们是这么解决的……

PLC是变频器的上位机&#xff0c;但是&#xff0c;在很多工程现场中&#xff0c;经常也会出现这样的问题&#xff0c;就是变频器开始运行后&#xff0c;PLC就开始罢工了&#xff0c;有的时候死机&#xff0c;有的时候指令传达不畅&#xff0c;有的时候会出现通讯时断时续等等&a…

物联网AI MicroPython学习之语法 TIMER硬件定时器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; TIMER 介绍 模块功能: 硬件定时器模块 接口说明 Timer - 构建Timer对象 函数原型&#xff1a;Timer(id)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明idintY硬件定时器外设模块id&#xff1a…

chromium通信系统-mojo系统(一)-ipcz系统基本概念

ipcz 是chromium的跨进程通信系统。z可能是代表zero&#xff0c;表示0拷贝通信。 chromium的文档是非常丰富的&#xff0c;关于ipcz最重要的一篇官方文档是IPCZ。 关于ipcz本篇文章主要的目的是通过源代码去分析它的实现。再进入分析前我们先对官方文档做一个总结&#xff0c;…

【C语言基础】分享近期学习到的volatile关键字、__NOP__()函数以及# #if 1 #endif

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

IIC 实验

IIC 简介 IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线&#xff0c;用于连接微 控制器以及其外围设备。它是由数据线 SDA 和时钟线 SCL 构成的串行总线&#xff0c;可发送和接收数 据&#xff0c;在 CPU 与被控 IC 之间、IC 与 IC 之间进行双…

02.接口隔离原则(Interface Segregation Principle)

一言 客户端不应该依赖它不需要的接口&#xff0c;即一个类对另一个类的依赖应该建立在最小的接口上。 为什么要有接口隔离原则 反例设计 反例代码 public class Segregation1 { }interface Interface1 {void operation1();void operation2();void operation3();void opera…

VUE(一)

1.vue简介 英文官网: Vue.js - The Progressive JavaScript Framework | Vue.js 中文官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 2.Vue的特点 3.初识VUE 在官网下载VUE.js,有两个版本&#xff0c;一个开发一个生产 <!DOCTYPE html> <html lang"en"…

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

算法之冒泡排序

算法之冒泡排序 冒泡排序Bubble Sort 交换排序相邻元素两两比较大小&#xff0c;有必要则交换。元素越小或越大&#xff0c;就会在数列中慢慢的交换并“浮”向顶端&#xff0c;如同水泡咕嘟咕嘟往上冒。 核心算法 排序算法&#xff0c;一般都实现为就地排序&#xff0c;输出…

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景&#xff0c;因为集成模式不能在备库配置&#xff0c;所以场景都是基于主库端: 1 主备发生switchover切换&#xff0c;主库…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

图像处理01 小波变换

一.为什么需要离散小波变换 连续小波分解&#xff0c;通过改变分析窗口大小&#xff0c;在时域上移动窗口和基信号相乘&#xff0c;最后在全时域上整合。通过离散化连续小波分解可以得到伪离散小波分解&#xff0c; 这种离散化带有大量冗余信息且计算成本较高。 小波变换的公…