当输出具有负数时,使用插入符号训练nnet和avNNet模型

时间:2014-09-12 16:19:31

标签: r r-caret nnet

我的问题是典型的前馈单隐藏层backprop神经网络,在包nnet中实现,并在包插入符号中使用train()进行训练。这与this question有关,但在R。

中的nnet和插入符号包的上下文中

我用Y = sin(X) + small error

的简单回归示例演示了这个问题
  
      
  1. raw Y ~ raw X:预测的输出在原始Y < 0中均为零。

  2.   
  3. scaled Y (to 0-1) ~ raw X:解决方案看起来很棒;见下面的代码。

  4.   

代码如下

library(nnet)
X <- t(t(runif(200, -pi, pi)))
Y <- t(t(sin(X)))           # Y ~ sin(X)
Y <- Y + rnorm(200, 0, .05) # Add a little noise
Y_01 <- (Y - min(Y))/diff(range(Y)) # Y linearly transformed to have range 0-1.
plot(X,Y)
plot(X, Y_01)
dat <- data.frame(cbind(X, Y, Y_01)); names(dat) <- c("X", "Y", "Y_01")
head(dat)
plot(dat)

nnfit1 <- nnet(formula = Y ~ X, data = dat, maxit = 2000, size = 8, decay = 1e-4)
nnpred1 <- predict(nnfit1, dat)
plot(X, nnpred1)

nnfit2 <- nnet(formula = Y_01 ~ X, data = dat, maxit = 2000, size = 8, decay = 1e-4)
nnpred2 <- predict(nnfit2, dat)
plot(X, nnpred2)

在插入符号中使用train()时,有一个preProcess选项,但它只会缩放输入train(..., method = "nnet", ...)似乎使用原始Y值;见下面的代码。

library(caret)
ctrl <- trainControl(method = "cv", number = 10) 
nnet_grid <- expand.grid(.decay = 10^seq(-4, -1, 1), .size = c(8))
nnfit3 <- train(Y ~ X, dat, method = "nnet", maxit = 2000, 
            trControl = ctrl, tuneGrid = nnet_grid, preProcess = "range")
nnfit3
nnpred3 <- predict(nnfit3, dat)
plot(X, nnpred3)

当然,我可以线性转换Y变量(s)以获得正范围,但之后我的预测将是错误的。虽然这只是一个小问题,但我想知道当输出具有负值时,是否有更好的解决方案来训练nnet或avNNet模型。

1 个答案:

答案 0 :(得分:2)

用户here

在交叉验证的topepo上对此进行了回答

他们答案的相关部分是:

  

由于Y大致介于-1和1之间,因此您还应在linout = TRUEnnet来电中使用train