热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

时间序列模型ARMA/ARIMA(二)

文章目录时序特点时序模型的前提时序模型的自相关图和偏自相关图时列模型训练&检验&预测模型评价时序特点一系列相同时间间隔的数据点只有一列数据,没有变量与变量之间的关系线


文章目录

      • 时序特点
      • 时序模型的前提
      • 时序模型的自相关图和偏自相关图
      • 时列模型训练&检验&预测
      • 模型评价


时序特点


  • 一系列相同时间间隔的数据点

  • 只有一列数据,没有变量与变量之间的关系

    线性回归中,有自变量和因变量

  • 数据在时间上有相关性,即前后相关

    线性回归中,数据点间相互独立

  • 用历史数据预测未来数据


时序模型的前提


  • 平稳性

    • 数学上,时序的期望和方差基本上不随时间变动。

    • 时序图上,数据点围绕一个常数上下波动。

    • 统计学上,p-value 是否小于显著水平,比如 0.01。

      # ts:时序
      from statsmodels.tsa.stattools import adfuller
      adf = adfuller( ts )
      print(adf)
      #返回的第一个数据是单位根统计量,第二个是p-value
      # 若 p-value<0.01&#xff0c;则拒绝原假设&#xff0c;i.e. 原时序平稳
      # 原假设&#xff1a;时序存在单位根&#xff0c;i.e. 时序不平稳

    • 若原时序不平稳&#xff0c;要作一阶差分或更高阶差分去除原时序的趋势。

      # 一阶差分
      ts_diff &#61; ts.diff(1)[1:] #作差分的同时去掉第一个NaN值

  • 白噪声检验

    • &#xff08;只有&#xff09;在时序平稳后&#xff0c;检验时序是否在时间上相关。

      from statsmodels.stats.diagnostic import acorr_ljungbox
      noise &#61; acorr_ljungbox( ts, lags&#61;1 )
      # lags&#xff0c;设置时序滞后的阶数
      # 设置多少阶&#xff0c;结果会显示多少阶对应的统计量和p-value
      print( noise )
      # 返回的元组里的第一个数据是统计量&#xff0c;第二个是p-value
      # 若 p-value<0.01&#xff0c;则拒绝原假设&#xff0c;i.e. 原时序在时间上相关
      # 原假设&#xff1a;时序是随机序列


时序模型的自相关图和偏自相关图


  • 用来估计模型的阶数 p,q

    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    fig &#61; plt.figure(figsize&#61;(20,5))
    ax1 &#61; fig.add_subplot(211)
    plot_acf( ts, lags&#61;30, ax&#61;ax1 )
    ax2 &#61; fig.add_subplot(212)
    plot_pacf( ts, lags&#61;30, ax&#61;ax2 )
    # 以上lags可以自行选择


时列模型训练&检验&预测


  • 若原时序平稳&#xff0c;则直接使用 ARMA(p,q) 模型
  • 若原时序不平稳&#xff0c;而通过作差分后平稳&#xff0c;则使用 ARIMA(p,d,q)模型

  1. 寻找模型的最佳阶数(p,q)&#xff1a;

    最佳的 p,q&#xff1a;模型的 aic or bic 最小时。

    # 以原时序平稳且非白噪声为例&#xff0c;直接用 ARMA
    from statsmodels.tsa.arima_model import ARMA, ARIMA
    ts_train &#61; ts[ ts.index<&#61;&#39;2020-04-30&#39; ]
    # 根据自相关图和偏自相关图设置最大的 p,q
    pmax, qmax &#61; 5, 5
    Mid &#61; []
    arma_pq &#61; None
    # 迭代寻找最佳 p,q
    for i in range(pmax&#43;1):for j in range(qmax&#43;1):arma_pq &#61; ARMA(ts_train, (i,j)).fit()Mid[&#39;({},{})&#39;.format(i,j)] &#61; [arma_pq.aic, arma_pq.bic]
    # 根据 aic,bic 同时最小找到最佳 p,q
    p,q &#61; eval(sorted(Mid.items(), key &#61; lambda i:i[1])[0][0])

  2. 训练模型

    # 使用上述找到的最佳 p,q
    arma &#61; ARMA(ts_train, (p,q)).fit()

  3. 模型检验

    # 检验模型是否很好的捕捉了原时序的趋势
    resid &#61; arma.resid # 获取残差
    # 方法一&#xff1a;画残差的相关图&#xff0c;观察是否基本上都处于置信区间内
    plot_acf(resid,lags&#61;40)
    # 方法二&#xff1a;使用 DW 检验残差是否自相关&#xff08;DW接近2&#xff0c;则不存在相关性&#xff09;
    from statsmodels.stats.stattools import durbin_watson
    durbin_watson(resid.values)
    # 方法三&#xff1a;使用 ljungbox 检验残差是否是白噪声&#xff08;残差无自相关性&#xff09;
    acorr_ljungbox( resid, lags&#61;1 )

  4. 模型预测

    # 当模型很好的捕捉了原时序的趋势时# 1、样本内预测&#xff1a;start/end&#xff0c;都是训练集里出现过的日期
    pred_in &#61; arma.predict(start&#61;&#39;20200101&#39;, end&#61;&#39;20200430&#39;)
    ts_test_in &#61; ts[ (ts.index >&#61; &#39;2020-01-01&#39;)&(ts.index <&#61; &#39;2020-04-30&#39;) ] fig &#61; plt.figure(figsize&#61;(20,7))
    ax1 &#61; fig.add_subplot(211)
    ax1.plot(ts_test_in, label&#61;&#39;in-sample test&#39;)
    ax1.plot(pred_in, label&#61;&#39;in-sample prediction&#39;)
    plt.title(&#39;in-sample comparison&#39;)
    plt.legend()# 2、样本外预测&#xff1a;start/end&#xff0c;int&#xff0c;须一部分在训练集内&#xff0c;一部分不在
    pred_out &#61; arma.predict(start&#61;len(ts_train)-30, end&#61;len(ts_train)&#43;30)
    ts_test_out &#61; np.append( np.array(ts_train)[-30:], np.array(ts[ts.index>&#39;2020-04-30&#39;])[:30] )ax2 &#61; fig.add_subplot(212)
    ax2.plot(ts_test_out, label&#61;&#39;out-sample test&#39;)
    ax2.plot(pred_out, label&#61;&#39;out-sample prediction&#39;)
    plt.title(&#39;out-sample comparison&#39;)
    plt.legend()plt.show()


模型评价

1、模型在样本内的预测可以达到一个不错的效果。

2、但是&#xff0c;模型在样本外的预测是一个周期性的 sin 波形&#xff08;试了几种数据都一样&#xff0c;不知道怎么回事&#xff09;。

3、欢迎来评论&#xff01;


推荐阅读
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
缅追逐暗夜的流星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有