使用 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。此外,它使用交叉验证或引导重采样自动调整超参数(例如sizedecay)。缺点是所有这些重新采样都需要一些时间。

#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)

它还可以在适当的范围内进行预测,因此您可以直接比较结果。如果你对神经网络感兴趣,你也应该看看neuralnetRSNNS 包。 caret 目前可以调优nnetneuralnet 模型,但还没有RSNNS 的接口。

/edit: caret 现在有一个RSNNS 的接口。事实证明,如果您向包维护者发送电子邮件并要求将模型添加到 caret 他通常会这样做!

/edit:caret 现在还支持来自brnn 包的前馈神经网络的贝叶斯正则化。此外,插入符号现在还可以更轻松地指定您自己的custom models,以便与您喜欢的任何神经网络包进行交互!

【讨论】:

非常感谢,看起来很棒。抱歉,我错过了回复通知,因此延迟回复 + 很好的例子。您的答案首先是搜索“[r] nnet predict”。 @DWin 谢谢!我很高兴听到这个消息!

以上是关于使用 nnet 进行预测,我做得对吗?的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 与 Core Data 多对多:它有效,但我做得对吗?

在 ASP.NET 中异步发送电子邮件的正确方法...(我做得对吗?)

Python机器学习

Java中的并发 - 将任务委派给工作线程,我做得对吗?

与 foreach 并行预测 nnet 输出时 R 内存爆炸

如果我从 randomforest、gbm、svm、nnet 生成预测以获得更准确的预测,如何组合结果(预测)?