zoukankan      html  css  js  c++  java
  • 拓端tecdat:R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据

    原文链接:http://tecdat.cn/?p=24148

    原文出处:拓端数据部落公众号

    特别是在经济学/计量经济学中,建模者不相信他们的模型能反映现实。比如:收益率曲线并不遵循三因素的Nelson-Siegel模型,股票与其相关因素之间的关系并不是线性的,波动率也不遵循Garch(1,1)过程,或者Garch(?,?)。我们只是试图为我们看到的现象找到一个合适的描述。

    模型的发展往往不是由我们的理解决定的,而是由新的数据的到来决定的,这些数据并不适合现有的看法。有些人甚至可以说,现实没有基本的模型(或数据生成过程)。正如汉森在《计量经济学模型选择的挑战》中写道。

    “模型应该被视为近似值,计量经济学理论应该认真对待这一点”

    所有的理论都自然而然地遵循 "如果这是一个过程,那么我们就显示出对真实参数的收敛性 "的思路。收敛性很重要,但这是一个很大的假设。无论是否存在这样的过程,这样的真实模型,我们都不知道它是什么。同样,特别是在社会科学领域,即使有一个真正的GDP,你可以认为它是可变的。

    这种讨论引起了模型的组合,或者预测未来的组合。如果我们不知道潜在的真相,结合不同的选择,或不同的建模方法可能会产生更好的结果。


     

    模型平均

    让我们使用 3 种不同的模型对时间序列数据进行预测。简单回归 (OLS)、提升树和随机森林。一旦获得了三个预测,我们就可以对它们进行平均。

    1.  
      # 加载代码运行所需的软件包。如果你缺少任何软件包,先安装。
    2.  
       
    3.  
      tem <- lappy(c("randomoest", "gb", "quanteg"), librry, charter.oly=T)
    4.  
       
    5.  
       
    6.  
      # 回归模型。
    7.  
       
    8.  
       
    9.  
       
    10.  
       
    11.  
       
    12.  
      moelm <- lm(y~x1+x2, data=f)
    13.  
       
    14.  
       
    15.  
      molrf <- ranmFrst(y~x1+x2, dta=df)
    16.  
       
    17.  
      mogm <- gb(ata=df, g.x=1:2, b.y=4
    18.  
      faiy = "gssian", tre.comle = 5, eain.rate = 0.01, bg.fratn = 0.5)
    19.  
       
    20.  
       
    21.  
       
    22.  
      # 现在我们对样本外的预测。
    23.  
       
    24.  
      #-------------------------------
    25.  
       
    26.  
      Tt_ofsamp <- 500
    27.  
       
    28.  
       
    29.  
      boosf <- pbot(df_new$x1, df_new$x2)
    30.  
       
    31.  
      rfft <- pf(df_new$x1, df_new$x2)
    32.  
       
    33.  
      lmt <- pm(df_new$x1, df_new$x2)
    34.  
       
    35.  
      # 绑定预测
    36.  
       
    37.  
      mtfht <- cbind(bo_hat, f_fat, lm_at)
    38.  
       
    39.  
      # 命名这些列
    40.  
       
    41.  
      c("Boosting", "Random Forest", "OLS")
    42.  
       
    43.  
      # 定义一个预测组合方案。
    44.  
       
    45.  
       
    46.  
      # 为结果留出空间。
    47.  
       
    48.  
      resls <- st()
    49.  
       
    50.  
      # 最初的30个观测值作为初始窗口
    51.  
       
    52.  
      # 重新估计新的观测值到达
    53.  
       
    54.  
      it_inw = 30
    55.  
       
    56.  
      for(i in 1:leth(A_shes)){
    57.  
      A_nw$y, mt_fht,Aeng_hee= A_scmes[i, n_wiow = intwdow )
    58.  
       
    59.  
       
    60.  
       
    61.  
      }
    62.  
       
    63.  
      # 该函数输出每个预测平均方案的MSE。
    64.  
       
    65.  
       
    66.  
      # 让我们检查一下各个方法的MSE是多少。
    67.  
       
    68.  
      atr <- apy(ma_ht, 2, fucon(x) (df_wy - x)^2 )
    69.  
       
    70.  
      apy(ma_er[nitnow:Tou_o_saple, ], 2, fncon(x) 100*( man(x) ) )
    71.  
       
    72.  
       

    在这种情况下,最准确的方法是提升。但是,在其他一些情况下,根据情况,随机森林会比提升更好。如果我们使用约束最小二乘法,我们可以获得几乎最准确的结果,但这不需要事先选择 Boosting 、Random Forest 方法。继续介绍性讨论,我们只是不知道哪种模型会提供最佳结果以及何时会这样做。

    加权平均模型融合预测

     y_t 是你的预测变量, \widehat{y}_{i,t} 是时间预测 吨 ,从方法 一世, 和 我 = 1 例如OLS, 我=2 提升树和 我 = 4 是随机森林。您可以只取预测的平均值:

      \[\frac{\sum^3_{i=1} \widehat{y}_{i,t} }{3}.\]

    通常,这个简单的平均值表现非常好。

    在 OLS 平均中,我们简单地将预测投影到目标上,所得系数用作权重:

      \[\widehat{y}^{combined}_t = \widehat{w}_{0t} + \sum_{i = 1}^3 \widehat{w}_{i,t} \widehat{y}_{它}。\]

    这是相当不稳定的。所有预测都有相同的目标,因此它们很可能是相关的,这使得估计系数变得困难。稳定系数的一个不错的方法是使用约束优化,即您解决最小二乘问题,但在以下约束下:

      \[w_{0t} = 0 \quad \text{and} \quad \sum_{i = 1}^3 w_{it} = 1, \qquad \forall t.\]

    另一种方法是根据预测的准确程度对预测进行平均化,直到基于一些指标如根MSE。我们反转权重,使更准确的(低RMSE)获得更多权重。

      \[w_{it} = \frac{\left(\frac{RMSE_{i,t} }{\sum_{i = 1}^3 RMSE_{i,t}}\right)^{-1}}{ \sum_{i = 1}^3 \left(\frac{RMSE_{i,t} }{\sum_{i = 1}^3 RMSE_{i,t}}\right)^{-1} } = \ frac{\frac{1}{RMSE_{i,t}}}{\sum_{i=1}^3\frac{1}{RMSE_{i,t}}}.\]

    您可以绘制各个方法的权重:

    这是预测平均方法。

    1.  
       
    2.  
       
    3.  
      ## 需要的子程序。
    4.  
       
    5.  
      er <- funcion(os, red){ man( (os - ped)^2 ) }
    6.  
       
    7.  
       
    8.  
       
    9.  
      ## 不同的预测平均方案
    10.  
       
    11.  
      ##简单
    12.  
       
    13.  
       
    14.  
        rd <- aply(a_at, 1, an)
    15.  
       
    16.  
        wehs <- trx( 1/p, now = TT, ncl = p)
    17.  
       
    18.  
        ## OLS权重
    19.  
       
    20.  
       
    21.  
         wgs <- marx( nol=(p+1)T)  
    22.  
       
    23.  
      for (i in in_wnow:TT) {
    24.  
       
    25.  
        wghs[i,] <- lm $oef
    26.  
       
    27.  
      pd <- t(eigs[i,])%*%c(1, aht[i,] )
    28.  
       
    29.  
      ## 稳健的权重
    30.  
       
    31.  
       
    32.  
       
    33.  
         for (i in iitnow:T) {
    34.  
       
    35.  
          whs[i,] <- q(bs[1:(i-1)]~ aft[1:(i-1),] )$cef
    36.  
       
    37.  
         prd[i] <- t(wihs[i,] )*c(1, atfha[i,])
    38.  
       
    39.  
         ##基于误差的方差。MSE的倒数
    40.  
       
    41.  
       
    42.  
        for (i in n_no:TT) {
    43.  
       
    44.  
         mp =aply(aerr[1:(i-1),]^2,2,ean)/um(aply(mter[1:(i-1),]^2,2,man))
    45.  
       
    46.  
        wigs[i,] <- (1/tmp)/sum(1/tep)
    47.  
       
    48.  
        ped[i] <- t(wits[i,] )%*%c(maat[i,] )
    49.  
       
    50.  
        ##使用约束最小二乘法
    51.  
       
    52.  
       
    53.  
       
    54.  
      for (i in itd:wTT) {
    55.  
       
    56.  
        weht[i,] <- s1(bs[1:(i-1)], a_fat[1:(i-1),] )$wigts
    57.  
       
    58.  
        red[i] <- t(wehs[i,])%*%c(aht[i,] )
    59.  
       
    60.  
        ##根据损失的平方函数,挑选出迄今为止表现最好的模型
    61.  
       
    62.  
       
    63.  
          tmp <- apy(mt_fat[-c(1:iit_wdow),], 2, ser, obs= obs[-c(1:ntwiow)] )
    64.  
       
    65.  
          for (i in it_idw:TT) {
    66.  
       
    67.  
          wghs[i,] <- rp(0,p)
    68.  
       
    69.  
          wihts[i, min(tep)] <- 1
    70.  
       
    71.  
          ped[i] <- t(wiht[i,] )*c(mht[i,] )
    72.  
       
    73.  
          } }
    74.  
       
    75.  
      MSE <- sr(obs= os[-c(1:intiow)], red= red[-c(1:itwiow)])
    76.  
       
    77.  
       
    78.  
       
    79.  
       

    最受欢迎的见解

    1.在python中使用lstm和pytorch进行时间序列预测

    2.python中利用长短期记忆模型lstm进行时间序列预测分析

    3.使用r语言进行时间序列(arima,指数平滑)分析

    4.r语言多元copula-garch-模型时间序列预测

    5.r语言copulas和金融时间序列案例

    6.使用r语言随机波动模型sv处理时间序列中的随机波动

    7.r语言时间序列tar阈值自回归模型

    8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

    9.python3用arima模型进行时间序列预测

  • 相关阅读:
    A Simple PlugIn Library For .NET
    (转).NET 一次查询多表,填充DataSet并指定表名(DataSet指定DataTable名称的技巧)
    Database Schema Create
    C++中关于指针入门的最好的文章
    oleDbCommand访问Excel
    the best simple c++
    c++连接数据库
    plugin framework 1
    c# invoke c++
    摩根士丹利赐与新浪增持评级
  • 原文地址:https://www.cnblogs.com/tecdat/p/15586368.html
Copyright © 2011-2022 走看看