使用 nnet 进行预测,我做得对吗?
Posted
技术标签:
【中文标题】使用 nnet 进行预测,我做得对吗?【英文标题】:Using nnet for prediction, am i doing it right? 【发布时间】:2011-12-06 07:47:05 【问题描述】:我对 R 和 AI /ML 技术还是很陌生。我想使用神经网络进行预测,由于我是新手,我只想看看这是否应该这样做。
作为一个测试用例,我根据之前的 2 个值预测 sin()
的值。对于训练,我使用y = sin(x)
、x1 = sin(x-1)
、x2 = sin(x-2)
创建了一个数据框,然后使用公式y ~ x1 + x2
。
它似乎有效,但我只是想知道这是否是正确的方法,或者是否有更惯用的方法。
这是代码:
require(quantmod) #for Lag()
requre(nnet)
x <- seq(0, 20, 0.1)
y <- sin(x)
te <- data.frame(y, Lag(y), Lag(y,2))
names(te) <- c("y", "x1", "x2")
p <- nnet(y ~ x1 + x2, data=te, linout=TRUE, size=10)
ps <- predict(p, x1=y)
plot(y, type="l")
lines(ps, col=2)
谢谢
[编辑]
这对于预测调用是否更好?
t2 <- data.frame(sin(x), Lag(sin(x)))
names(t2) <- c("x1", "x2")
vv <- predict(p, t2)
plot(vv)
我想我想通过查看它的预测(应该近似于正弦波)来了解 nnet 是否真的在工作。
【问题讨论】:
predict()
调用看起来很可疑。你不只是用'y'预测'y'吗?另一方面,它可能无法实际提供新数据,因为它不是数据框。所以你只是用'te'中的滞后值来“预测”。您可以查看expand
以避免需要“pkg:quantmod”
我添加了一个更好的预测示例,您认为这实际上会使用 nnet 模型吗?绘制时似乎有罪
您可以通过以与预测相同的比例绘制原件来检查:plot(x, vv); lines(x, y)
并且您会看到存在滞后(您似乎会预料到)。
here 中关于 R + DNN 的示例以便更好地理解。
【参考方案1】:
我真的很喜欢caret
包,因为它为各种模型提供了一个漂亮、统一的接口,例如nnet
。此外,它使用交叉验证或引导重采样自动调整超参数(例如size
和decay
)。缺点是所有这些重新采样都需要一些时间。
#Load Packages
require(quantmod) #for Lag()
require(nnet)
require(caret)
#Make toy dataset
y <- sin(seq(0, 20, 0.1))
te <- data.frame(y, x1=Lag(y), x2=Lag(y,2))
names(te) <- c("y", "x1", "x2")
#Fit model
model <- train(y ~ x1 + x2, te, method='nnet', linout=TRUE, trace = FALSE,
#Grid of tuning parameters to try:
tuneGrid=expand.grid(.size=c(1,5,10),.decay=c(0,0.001,0.1)))
ps <- predict(model, te)
#Examine results
model
plot(y)
lines(ps, col=2)
它还可以在适当的范围内进行预测,因此您可以直接比较结果。如果你对神经网络感兴趣,你也应该看看neuralnet
和RSNNS
包。 caret
目前可以调优nnet
和neuralnet
模型,但还没有RSNNS
的接口。
/edit: caret
现在有一个RSNNS
的接口。事实证明,如果您向包维护者发送电子邮件并要求将模型添加到 caret
他通常会这样做!
/edit:caret
现在还支持来自brnn 包的前馈神经网络的贝叶斯正则化。此外,插入符号现在还可以更轻松地指定您自己的custom models,以便与您喜欢的任何神经网络包进行交互!
【讨论】:
非常感谢,看起来很棒。抱歉,我错过了回复通知,因此延迟回复 + 很好的例子。您的答案首先是搜索“[r] nnet predict”。 @DWin 谢谢!我很高兴听到这个消息!以上是关于使用 nnet 进行预测,我做得对吗?的主要内容,如果未能解决你的问题,请参考以下文章
RestKit 与 Core Data 多对多:它有效,但我做得对吗?
在 ASP.NET 中异步发送电子邮件的正确方法...(我做得对吗?)