精华内容
下载资源
问答
  • 参考自: https://www.statworx.com/at/blog/time-series-forecasting-with-random-forest/https://www.r-bloggers.com/tuning-random-forest-on-time-series-data/知识点:时间序列随机森林log变换差分Time delay ...

    参考自: 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
    ef9c17f98b0aa820b5db164b2664fd3e.png

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

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

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

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

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

    aa8e3f3424a3ad01641c1c3b3389b6f9.png

    ,还可以做这样的差分:

    c2c625603873aa87822e50edb8063582.png

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

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

    d629667216acab4276df5b8be6e610f7.png

    当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变换+差分之后的数据。

    7169faf039068b0b831382c0c20ebb4f.png

    我们来总结以下上面我们对数据做了什么,当然是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)

    得到下图:

    57afaf7fd63fbd2f7243dcb5500abcce.png
    d996ebc744733ac00e1f463d7d3f0f36.png

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

    69b1a0a4741da2a60604c36f4d2e93d0.png

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

    思考

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

    千次阅读 2021-04-05 15:26:19
    R语言随机抽样及分层抽样问题1、计算层次个2、固定随机提取3、随机抽样 问题 > dim(ml_data) [1] 201253 11 场景:20万行数据中,抽取每个月中的任意一天的数据,即,2019-9-6/2019-9-7/2019-9-8… 1、计算...

    问题

    > dim(ml_data)
    [1] 201253     11
    
    • 场景:20万行数据中,抽取每个月中的任意一天的数据,即,2019-9-6/2019-9-7/2019-9-8…
      在这里插入图片描述

    1、计算层次个数

    • dplyr包中count函数计算出每天的数据量,然后dim查看数据列346行,346个层次,346天。
    > bb <- count(ml_data,date)
    > > head(bb)
          date    n
    1 20190906  568
    2 20190907 1130
    3 20190908  514
    4 20190909  529
    5 20190910  568
    6 20190911  114
    > dim(bb)
    [1] 346   2
    

    2、固定随机提取

    • set.seed(1)固定随机取数
    • sampling包中strata函数
    • 合并日期date向量下抽取,时间缩短
    strata(data,stratanames=NULL,size,
           method=c("srswor","srswr","poisson","systematic"),
           pik,description=FALS)
    #stratanames: 进行分层所依据的变量名称。
    #size: 各层中要抽出的观测样本数。
    #method: 选择4中抽样方法,分别为无放回、有放回、泊松、系统抽样,默认为srswor。
    
    > set.seed(1)
    > #注意size,每层抽取1个数,如果两个或者三个。。。
    > sample_day <- strata(ml_data,stratanames = c("year","month","day"),size = rep(1,346),method="srswor")
    > head(sample_day)
         year month day ID_unit         Prob Stratum
    129  2019    09  06     129 0.0017605634       1
    1498 2019    09  07    1498 0.0008849558       2
    2207 2019    09  08    2207 0.0019455253       3
    2683 2019    09  09    2683 0.0018903592       4
    3040 2019    09  10    3040 0.0017605634       5
    3323 2019    09  11    3323 0.0087719298       6
    
    • 两个相同
    > set.seed(1)
    > sample_day <- strata(ml_data,stratanames = "date",size = rep(1,346),method="srswor")
    > head(sample_day)
             date ID_unit         Prob Stratum
    129  20190906     129 0.0017605634       1
    1498 20190907    1498 0.0008849558       2
    2207 20190908    2207 0.0019455253       3
    2683 20190909    2683 0.0018903592       4
    3040 20190910    3040 0.0017605634       5
    3323 20190911    3323 0.0087719298       6
    

    3、随机抽样

    sample(x, size, replace = FALSE, prob = NULL)
    x:为向量
    size:为样本容量
    replace:表示是否为有放回的抽样,是一个逻辑值,默认为FALSE,即默认为无放回抽样;
    prob:为权重向量,即x中元素被抽取到的概率,是一个取值0~1的向量,其长度应该与x的长度相同。
    
    
    • 举例
    > sample(1:20, 5)
    [1] 19 16 15 20  1
    > sample(1:20, 5)
    [1] 19 14  6 11  8
    > set.seed(2)
    > sample(1:20, 5)
    [1] 15  6 19  8  1
    

    看完如果对你有帮助,感谢点赞支持!

    如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

    在这里插入图片描述

    展开全文
  • R 语言 随机抽样

    2019-02-25 10:25:00
    从iris数据集中随机抽取一个大小为20的样本 my_iris<-iris[sample(1:nrow(iris), 20, replace=FALSE),] my_iris   参数说明: 第一个参数:要从中抽取元素的数据集 第二个参数:要抽取的元素数量 ...

    从iris数据集中随机抽取一个大小为20的样本

     my_iris<-iris[sample(1:nrow(iris), 20, replace=FALSE),]
     my_iris
    

      

    参数说明:

    第一个参数:要从中抽取元素的数据集

    第二个参数:要抽取的元素数量

    第三个参数:表示抽样有无放回

    1、无放回(replace=FALSE)

     2、有放回(replace=TRUE)

    my_iris<-iris[sample(1:nrow(iris), 20, replace=TRUE),]
    my_iris
    

      

     

    转载于:https://www.cnblogs.com/RHadoop-Hive/p/10429468.html

    展开全文
  • R语言随机采样

    2020-12-08 20:29:21
    R语言中,进行随机采样可以使用sample函数,具体如下: #函数: sample(x, size, replace = FALSE, prob = NULL) #参数含义 x:向量,表示抽样的总体,或者是一个正整数,表示样本总体为1~n size:为样本容量,即要...

    R语言中,进行随机采样可以使用sample函数,具体如下:

    #函数:
    sample(x, size, replace = FALSE, prob = NULL)
    #参数含义
    x:向量,表示抽样的总体,或者是一个正整数,表示样本总体为1~n
    size:为样本容量,即要抽取的样本个数,是一个非负整数
    replace:表示是否为有放回的抽样,是一个逻辑值,默认为FALSE,即默认为无放回抽样;
    prob:为权重向量,即x中元素被抽取到的概率,是一个取值0~1的向量,其长度应该与x的长度相同。
    

    参考链接:https://www.sohu.com/a/259124475_100261403

    展开全文
  • R语言】对data.frame的行随机抽样

    千次阅读 2020-12-08 20:47:34
    df是R中的data.frame对象,对其行进项无放回随机采样,直接使用以下代码即可: df[sample(nrow(df), 10), ]
  • 由于我们通常在随机森林中使用它,因此它看起来非常适合(非常大的)数据集。大型数据集的问题在于许多特征是“相关的”,在这种情况下,很难比较可变重要性图的值的解释。例如,考虑一个非常简单的线性模型(“真实...
  • R语言从列表中取数

    千次阅读 2018-09-25 11:21:59
    x&lt;-list(id=1:4,height=170,... id中的 x[[1]] x[["id"]] x$id  &gt; l&lt;-list(asdfghj=1:10) &gt; l$a ---不完全匹配  [1] 1 2 3 4 5 6 7 8 9 10 &gt; l[["a&quo
  • R语言----决策树与随机森林详解

    千次阅读 2020-04-16 15:47:37
    这M个数据将作为每一个弱分类器(也就是CART决策树)的叶节点构成 在N个特征中随机取n个特征。我们要求n ,一般我们取n=N−−√n = \sqrt Nn= N ​ M*n组成了我们一个CART决策树的数据集,即我们使用重新抽取出来的M...
  • 可以用来查看部分数据 set.seed(4230) #设置种子,大家取随机数...- sample(levels(yo$id),24) #随机取ID ggplot(aes(x=time,y=price),data = subset(yo,id %in% sample.ids))+ facet_wrap(~ id)+ geom_line()...
  • R语言随机森林详细解析(基于randomforest包和varSelRF包)随机森林 基于R你即将从这里看到你不会看到 研究如何用R去实现随机森林也有三个月的时间了,从一开始的完全不理解,到现在的游刃有余,我似乎花了过多的...
  • R语言使用随机森林方法对数据分类

    万次阅读 多人点赞 2017-06-10 17:23:21
    说明随机森林是另一类可用的集成学习方法,该算法在训练过程中将产生多棵决策树,每棵决策树会根据输入数据集产生相应的预测输出,算法采用投票机制选择类别众数做为预测结果。
  • 此篇博客主要讲述R语言的应用,随机生成30个自然数(范围0-100),存入向量x, 然后把3的倍数的储存到一个向量x1,3k+1形式的储存到另外一向量x2, 3k+2形式储存到第三个向量x3。写出R代码。 文章目录一、随机生成30个...
  • R语言-舍选法产生正态分布随机数

    千次阅读 2020-07-18 18:35:00
    舍选法产生正态分布随机数(R语言) 思路分析 如果X∼N(0,1)X\sim N\left( 0,1 \right)X∼N(0,1),则Y=μ+σX∼N(μ,σ2)Y=\mu +\sigma X\sim N\left( \mu ,\sigma ^2 \right)Y=μ+σX∼N(μ,σ2),即只需要产生N(0,1...
  • 主要采用java语言实现swing中随机点的画法,简单便捷的在窗体中实现随机点的分布。
  • R语言随机森林初探

    千次阅读 2016-10-23 20:04:09
    在监督学习或者分类中,随机森林(RF)是一个非常好的分类学习算法。随机森林算法的实质是基于决策树的分类器集成算法,每一棵决策树给出一对实体的匹配决策,并根据所有的树的投票来得到最终决策。 基本思想:首先...
  • 3. R语言随机数生成

    万次阅读 多人点赞 2017-12-10 00:10:27
    r语言各种分布随机数的生成方式。
  • R语言 随机森林算法

    千次阅读 2018-05-03 13:22:06
    随机森林方法中,创建大量的决策树。 每个观察被馈入每个决策树。...R语言包“randomForest”用于创建随机森林。 安装R包 在R语言控制台中使用以下命令安装软件包。 您还必须安装相关软件包(如果...
  • 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域...已有多年数据分析与R语言...
  • 描述一个随机变量,不仅要说明它能够哪些值,而且还要关心它这些值的概率。因此,引入随机变量的分布函数概念。 对每个随机变量X和每个实数集合A,可以计算XA中值的概率。所有这些概率的集合就是随机变量X的...
  • R语言随机抽样sample

    万次阅读 2017-03-09 20:53:49
    在模拟实际数据情况时,常常会使用随机抽样函数来从整体中挑出部分样本数据。随机抽样又分为重复随机抽样和不重复随机抽样两种。重复抽样是指:本次从整体中抽取出的数据样本,在下一次抽取时同样有机会被抽取。不...
  • R语言随机森林mtry,ntree优化

    万次阅读 2020-04-02 10:23:58
    随机森林参数: 1、 mtry节点值,可确定每次迭代的变量抽样数值,用于二叉树的变量个 (1)一般可默认为2。...最好在确定mtry之后,带入尝试,使模型内误差基本稳定的最小值。 参考:https://blog.csdn.net/n...
  • R语言随机森林

    2019-11-16 12:53:08
    其次,参与构建该决策树的变量也是随机抽出,参与变量通常嗒嗒小于可用变量。 单个决策树在产生学习集和确定参与变量后,使用CART算法计算,不剪枝。 最后分类结果决于各个决策树分类器简单多数选举。 随机...
  • folds (y=data.all$Y,k=10) max=0 num=0 for(i in 1:10){ fold_test [folds[[i]],] #folds[[i]]作为测试集 fold_train [-folds[[i]],] # 剩下的数据作为训练集 print("***组号***") fold_pre (Y~.,data= fold_...
  • STA3050 Lec2笔记 > sample(c(-1,0,1),size=20, prob=c(0.25,0.5,0.25),replace=T) > w<-as.ts(w) # transform w into a time series object > plot(w,main="random walk") #制图 ...
  • R语言-训练随机森林模型

    万次阅读 2018-09-02 22:16:51
    随机森林算法涉及对样本单元和变量进行抽样,从而生成大量决策树。 对于每个样本单元,所有决策树依次对其进行分类,所有决策树预测类别中的众数类别即为随机森林所预测的这一样本单元的类别。 假设训练集中共有N...
  • R语言:生成均匀分布的随机整数添加变量名称并绘制条形图 本篇中主要使用的函数: runif() :用来随机生成服从均匀分布的整数 names() :定义变量名称或对变量名称进行修改 paste() :用于字符串的连接,并用sep...
  • 统计计算——基于R语言的随机数生成
  • 目录0引言1、函数名2、示例2.1正态分布随机数2.2偏正态分布2.3对数正态分布写在最后的话 0引言 最近在看偏正态分布相关的东西,偏正态分布的定义形式还是挺多样的,在偏态分布及其数字特征(R语言可视化)中我介绍的...
  • 随机产生服从不同分布的数据 均匀分布——runif() &amp;gt; x1=round(runif(100,min=80,max=100)) &amp;gt; x1 [1] 93 100 98 98 92 98 98 89 90 98 100 89 94 90 85 91 91 84 84 95 [21] 87 88 91...
  • R做正态分布 正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。可以说是最重要的一种分布,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,577
精华内容 21,030
关键字:

r语言随机取数