参考自: https://www.statworx.com/at/blog/time-series-forecasting-with-random-forest/

https://www.r-bloggers.com/tuning-random-forest-on-time-series-data/

知识点:

  1. 时间序列
  2. 随机森林
  3. log变换
  4. 差分
  5. Time delay embedding
  6. 评价指标

引言

With a few tricks, we can do time series forecasting with random forests. All it takes is a little pre- and (post-)processing. This blog post will show you how you can harness random forests for forecasting!

数据与数据处理

数据来源:German Statistical Office on the German wage and income tax revenue from 1999 - 2018(after tax redistribution). download link: here

数据预处理:

  • Statistical transformations (Box-Cox transform, log transform, etc.)
  • Detrending (differencing, STL, SEATS, etc.)
  • Time Delay Embedding (more on this below)
  • Feature engineering (lags, rolling statistics, Fourier terms, time dummies, etc.)

为了在随机森林上使用时间序列数据,我们做TDE,也就是:transform、difference and embed。

以下为R语言代码:

首先安装几个包:

install.packages("tidyverse")install.packages("tsibble")install.packages("randomForest")install.packages("forecast")

然后就是导入数据,并转换数据的格式

# load the packagessuppressPackageStartupMessages(require(tidyverse))suppressPackageStartupMessages(require(tsibble))suppressPackageStartupMessages(require(randomForest))suppressPackageStartupMessages(require(forecast))# specify the csv file (your path here)file %   select(-Type) %>%   gather(Date, Value, -Year) %>%   unite("Date", c(Date, Year), sep = " ") %>%   mutate(    Date = Date %>%       lubridate::parse_date_time("m y") %>%       yearmonth()  ) %>%   drop_na() %>%   as_tsibble(index = "Date") %>%   filter(Date <= "2018-12-01")# convert to ts formattax_ts 

得到转换之后的数据,需要做进一步处理,检查数据中的显性和隐性的缺失:

# implicit missingshas_gaps(tax_tbl)# explicit missingscolSums(is.na(tax_tbl[, "Value"]))

得到的结果大概是这样子

> # implicit missings> has_gaps(tax_tbl)# A tibble: 1 x 1  .gaps  1 FALSE> # explicit missings> colSums(is.na(tax_tbl[, "Value"]))Value     0

上述结果说明,数据中没有显性和隐形的缺失。

现在来看一下我们的数据是什么样子的:

# visualizeplot_org %   ggplot(aes(Date, Value / 1000)) + # to get the axis on a more manageable scale  geom_line() +  theme_minimal() +  labs(title = "German Wage and Income Taxes 1999 - 2018", x = "Year", y = "Euros")plot_org

接下来就是重要的部分了,差分!

如果你之前做过经典的时间序列模型,你可能对差分的概念有所疑惑。因为经典的时间序列模型需要数据具有稳定性。

稳定性意味着时间序列的均值和方差是有限的,而且不随时间的变化而变化。这就意味着时间序列的静态特性。然而就像我们在上面这个图中看到的,我们的时间序列并不具有稳定性,而是随着时间的递增,呈现出一种上升的趋势。

那么,差分和稳定性是怎么关联起来的呢,你可能知道,或者猜到,差分会使非稳定时间序列变为稳定的时间序列。很好,但是我们这边更关心的是差分能够改变序列的水平以及趋势(原文:differencing removes changes in the level of a series and, with it, the trend.)。这就是我们在随机森林中需要的!

那么怎么做呢?先来做一下差分,一阶差分

,还可以做这样的差分:

,比如说今年11月份数据和去年11月份数据做差分这样子。

我们知道差分会使时间序列的均值趋于稳定,Box-Cox或者log transformation会使方差趋于稳定。下面使Box-Cox变换的式子:

当lambda = 0 时,Box-Cox和log转换一样。我们使用上述式子对我们直接得到的值进行逆转换。赶紧行动起来吧,你可以通过实验去探究一个最好的lambda参数。(可使用forescast包)

这边只用log转换:

首先预估数据的差分阶数。

然后对数据进行log变换,然后再对其进行差分处理。

# pretend we're in December 2017 and have to forecast the next twelve monthstax_ts_org %   log() %>%   diff(n_diffs)# check out the difference! (pun)plot_trf %   autoplot() +  xlab("Year") +  ylab("Euros") +  ggtitle("German Wage and Income Taxes 1999 - 2018") +  theme_minimal()gridExtra::grid.arrange(plot_org, plot_trf)

可以得到下图,上面是原始的数据,下图是log变换+差分之后的数据。

我们来总结以下上面我们对数据做了什么,当然是log变换+差分处理,看似简单的两个操作却让我们的数据从非稳定变为稳定。

接下来要怎么做呢,接下来我们要使用这个处理完的数据来训练我们的随机森林然后使用它进行预测。当我们得到预测值之后,我们就可以通过反变换得到原始数据了。

在这之前我们还需要做的一个步骤是,modeling部分。我们要怎样reshape数据,使得一个机器学习算法可以处理?

为了将转换之后的数据放到随机森林中。我们需要将向量数据转换为矩阵数据。(vector -> matrix)。在此,我们用一个概念,time delay embedding。

Time delay embedding 表示在欧几里得空间中嵌入维度为K的时间序列,在R语言中,使用embed()函数就可以了。R语言代码如下:

lag_order 

在RStudio中,tax_ts_mbd object是一个矩阵。

Time delay embedding让我们可以在时间序列上使用任何线性、非线性回归模型,比如说随机森林,gradient boosting,支持向量机等等。这边选择6个月的滞后性,当然这个不是固定的。与此同时,我们这边预测的范围是12个月。我们这边要预测2018年的tax revenue。

在这个博客中,采用直接预测的策略。(还有一种递归策略)

数据分割:

y_train 

训练

forecasts_rf 

将得到的预测数据通过转换回来

# calculate the exp termexp_term %   mutate(Forecast = c(rep(NA, length(tax_ts_org)), y_pred))# visualize the forecastsplot_fc %   ggplot(aes(x = Date)) +  geom_line(aes(y = Value / 1000)) +  geom_line(aes(y = Forecast / 1000), color = "blue") +  theme_minimal() +  labs(    title = "Forecast of the German Wage and Income Tax for the Year 2018",    x = "Year",    y = "Euros"  )accuracy(y_pred, y_test)

得到下图:

可见,这个预测结果相当好的,MAPE达到了2.6%,不过只有这个标准还是不够的,还要计算一下简单的benchmark,季节性的模型。

可见这边的error指标很好,我们可以很安全地说,我们的随机森林表现得非常好。

思考

  1. 其实在上述模型中,或许还可以通过调整模型超参数来提高预测的效果。
  2. 或许随机森林莫i选哪个表现得相当好了,但是可能不是最好的,可以尝试其他的模型。

r语言随机森林_随机森林+时间序列(R语言版)相关推荐

  1. 在envi做随机森林_随机森林原理介绍与适用情况(综述篇)

    一句话介绍 随机森林是一种集成算法(Ensemble Learning),它属于Bagging类型,通过组合多个弱分类器,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确度和泛化性能.其可以 ...

  2. 在r中弄方差分析表_医学统计与R语言: qvalue

    微信公众号:医学统计与R语言如果你觉得对你有帮助,欢迎转发 (FalseDiscoveryRate(FDR)=Expected(FalsePositive/(FalsePositive+TruePos ...

  3. r语言平均值显著性检验_最全的R语言统计检验方法_数据挖掘中R语言的运用

    最全的R语言统计检验方法_数据挖掘中R语言的运用 统计检验是将抽样结果和抽样分布相对照而作出判断的工作.主要分5个步骤:建立假设 求抽样分布 选择显著性水平和否定域 计算检验统计量 判定 假设检验(h ...

  4. c语言是非结构化程序设计语言,第章_结构化程序设计基础和C语言的控制结构(fb).ppt...

    第章_结构化程序设计基础和C语言的控制结构(fb).ppt 2.4.2 continue语句 例2-24 编程序实现功能:检测从键盘上输入的以换行符结束的字符流,统计非字母字符的个数. 分析:通过循环 ...

  5. java语言程序设计考点_计算机二级考试Java语言程序设计考点:关键字

    大家回忆一下我们在学习汉语的时候,开始学的是什么?肯定是先学一些单个的字,只有认识了单个的字,然后才能组成词,然后才能慢慢的到句子,然后到文章.学习同计算机交流跟这个过程是一样的,首先我们得学习一些计 ...

  6. 半径为r的均匀带电球体_一半径为R的均匀带电球体,其电荷的体密度为ρ.求(1)球外任一点的电势;(2)球表面上的电势;(3...

    解:先用高斯定理求出球体内外的场强分布,再根据电势与场强之间的关系求电势分布www.mh456.com防采集. 根据高斯通量定2113理:沿闭合曲面5261的电场通量=包围之电荷量/介电常数:选取闭合 ...

  7. java 语言 写字板_一个简单的java语言写字板.docx

    一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...

  8. r与python做随机森林_随机森林算法入门(python)

    昨天收到yhat推送了一篇介绍随机森林算法的邮件,感觉作为介绍和入门不错,就顺手把它翻译一下. 目录 1 什么是随机森林 1.1 集成学习 1.2 随机决策树 1.3 随机森林 1.4 投票 2 为什 ...

  9. python预测随机数据_随机森林预测

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当涉及到预测数据(时间序列或其他类型的序列)时,人们会关注基本回归.ARIMA.ARMA.GARCH,甚至 ...

最新文章

  1. hdfs user 连接_通过API访问HDFS
  2. 对口升学计算机组装与维护,对口升学信息技术(计算机)类2017年专业课考试大纲...
  3. Ubuntu中Qt5.7.0无法输入中文
  4. matlab凸优化工具箱——cvx简介
  5. 第一章、银行会计的基本原理和基本核算方法
  6. 马斯克:让我成功的其实是工程思维
  7. intellij idea weblogic 下面 怎么远程断点
  8. 数据分析处理库——Pandas
  9. 服务器主板电源适配器维修,联想电源适配器坏了怎么办 联想电源适配器维修方法...
  10. 华硕笔记本学计算机,买平板电脑学习办公?也许平板、笔记本二合一的产品才更适合你...
  11. 无人驾驶常用传感器及其作用概述
  12. ecshop不同文章分类 不同文章详情页模板
  13. 庖丁解牛TLD(五)——井底之蛙啦~
  14. SAP ABAP常用增强记录文档(不定期完善更新)
  15. 电子招标采购系统源码 + 二次开发+定制化服务
  16. HelloWorld的几种百变形态,程序员真会玩
  17. 智选模式 VS HI模式,问界与阿维塔谁更胜一筹?
  18. 深入理解java虚拟机JVM(下)
  19. 学生使用计算机的管理制度,学生计算机室管理制度
  20. Bamboo项目自动化构建

热门文章

  1. android 软键盘的从属关系,Android控件属性大全
  2. 微信iOS7.0.9更新!除了朋友圈可以评论表情包,还有这些你可能不知道的功能!
  3. openjudge 1.5.22 津津的储蓄计划
  4. python中的数据类型和控制流
  5. HashMap的key为Integer时为什么有序
  6. LuceneElasticSeachKafka
  7. Vue动态权限路由addRoutes执行初次白屏解决方法
  8. 如何用break跳出多重循环
  9. 联通“格物”,做好设备管理这篇大文章
  10. IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY(TCSVT) 投稿经验