全文链接:http://tecdat.cn/?p=23485
原文来源:拓端数据部落微信官方账号
多层感知器用于R语言(MLP)和极限学习机(ELM)预测时间序列。请注意,因为无法使用网络GPU因此,大型网络的训练速度往往很慢。与现有神经网络的实现不同,R具有合理预测性能的网络可以自动设计。这增加了神经网络的鲁棒性,但也有助于减少训练时间。
使用MLP进行预测
使用R软件包,您可以生成外推(单变量)预测或解释变量。
单变量预测
以最简单的形式输入要建模的时间序列。
fit1 <- MLPfit(Air) print(fit1)
输出显示,该网络有5个隐藏节点,进行了20次训练,并将不同的预测与中位数操作相结合。自动生成网络集合,从不同的随机初始重量开始。此外,它还提供了网络中包含的输入。
可以使用plot()
直观的摘要。
plot(fit1)
灰色输入节点是自回归,而洋红色是确定性输入(在这种情况下是季节性的)。如果包括任何其他回归变量,它们将显示为浅蓝色。
该MLP()
该函数接受多个参数微调生成的网络。hd
参数定义了固定数量的隐藏节点。若为单个数字,则神经元排列在单个隐藏节点中。若为矢量,则将其排列成多层。
fit( hd = c(10,5))
稍后,我们将介绍如何自动选择节点数。根据我的经验(以及来自文献的证据),预测单个时间序列的传统神经网络不能从多个隐藏层中获得更好的效果。预测通常并不那么复杂!
reps
定义重复多少次训练。如果你想训练一个单一的网络,你可以使用它reps=1
,有很多证据表明这种效果是一般的。reps=20
这是训练速度和性能之间的折衷,但你能承受的重复次数越多越好。重新训练网络时,不仅有助于模型的性能,还有助于结果的稳定性。
lags
允许您选择网络考虑的自回归滞后。如果不提供此参数,则使用网络lag 1到lag m
,即序列季节。
lags=1:24
keep=c(rep(TRUE,12), rep(FALSE,12)))
lags=1:24, sel.lag=FALSE
第一种情况下,保留滞后(1、2、4、7、8、9、10、11、12、13、21、23、24)。第二种情况下,保留所有1-12,其余13-24。
神经网络在建模趋势上并不出色。因此,在建模趋势之前消除它是非常有用的。这是由参数处理的difforder
。如果difforder=0
不执行任何差分。对于diff=1
,执行一阶差分。同样,如果difforder=12
执行12阶差分。若时间序列为季节性周期12的季节性序列,则为季节性差异。
可同时执行difforder=c(1,12)
或执行任何其他差异。difforder=NULL
然后自动决定代码。如果有趋势,则使用一阶差。该序列也经过季节性测试。如果存在,则使用Canova-Hansen检查是确定性还是随机性。假如是后者,还会增加季节性差异。
季节性虚拟变量可用于确定性季节性建模。
使用参数预设隐藏的节点数。默认情况下,使用验证样本(时间序列的20%)进行测试,或type="cv"
使用5倍交叉验证。
auto.type="valid",hd.max=8
由于训练神经网络非常耗时,您可以重用已指定/训练过的网络。在下面的例子中,我们将重用它fit1
到新的时间序列。
fit(x, model=fit1)
模型参数保留fit1
。如果您只想使用参数,但需要训练网络,可以使用参数retrain=TRUE
。
观察两个设置之间的样本MSE的差异。
最后,您可以使用省略号直接将参数传输给训练网络函数...
。
我们使用函数生成预测forecast()
,该函数需要训练的网络对象和预测范围h
。
print(frc)
plot(frc)
所有集合的预测都是灰色的。
使用回归预测
假设我们需要使用确定性趋势来预测时间序列。首先,我们构建输入,然后建模序列。
z <- 1:(length() 24) # 我为预测增加了24个额外的观测值 z <- cbind(z) # 将其转换为列数 # 添加滞后0的回归因子,并强迫它留在模型中 difforder=0) # 不要让mlp()删除随机趋势
输出反映了包含回归变量的内容。这反映在带有浅蓝色输入的网络图中。
plot(fit4)
为了包括更多的滞后,我们扩大了xreg.lags
:
difforder=0,xreg=z,xreg.lags=list(1:12)
观察到网络中没有任何变量。我们使用它xreg.keep
强制包含这些变量。
difforder=0,xreg=z,xreg.lags=list(1:12),xreg.keep=list(c(rep(TRUE,3),rep(FALSE,9)
显然,神经网络不喜欢确定性趋势!如果我们强制执行,它只会保留它。为此,我会尝试的包。
zz <- cbind(z, 0) zz[loc,2] <- 1 fitxreg.lags=list(c(0:6),0),xregkeep=list(rep(FALSE,7),TRUE)
显然,您可以包含任意数量的回归变量。
为了产生预测,我们使用 forecast()
函数,但现在使用 xreg
输入。方法是从网络训练期间使用的相同观察值开始输入回归变量,并根据需要扩展预测范围。您
frc.reg <- forecast(fit5,xreg=zz)
ELM的预测
使用极限学习机(EML)。默认情况下,ELM从一个非常大的隐藏层(100个节点)开始,并根据需要对其进行修剪。
print(fit6)
plot(fit6)
网络图有一些黑线和一些灰线。后者被修剪。装有20个网络(由参数控制 reps
)。每个网络可能具有不同的最终连接。
par(mfrow=c(2,2))
for (i in 1:4){plot(fit6,i)}
par(mfrow=c(1,1))
修剪的方式由参数控制。默认选项是使用LASSO回归(类型=“套索LASSO”)。或者,可以使用“ ridge”进行岭回归,使用“ step”进行逐步OLS,使用“ lm”获得OLS解决方案而不进行修剪。
要进行预测,使用forecast()
。
forecast(fit6,h=12)
时间层次结构
实现时间层次结构mlp和
elm。
par(mfrow=c(1,2))
plot(thiMLP)
plot(thiELM)
par(mfrow=c(1,1))
这应该使您可以进行神经网络的时间序列预测。
最受欢迎的见解
1.用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类
2.Python中利用长短期记忆模型LSTM进行时间序列预测分析 – 预测电力消耗数据
3.python在Keras中使用LSTM解决序列问题
4.Python中用PyTorch机器学习分类预测银行客户流失模型
5.R语言多元Copula GARCH 模型时间序列预测
6.在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
7.R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数
8.R语言估计时变VAR模型时间序列的实证研究分析案例
9.用广义加性模型GAM进行时间序列分析