当输出结果为负时,用插入符号训练nnet和avNNet模型

我的问题是关于典型的前馈单隐层backprop神经网络,在package nnet中实现,并且使用train()在package中进行train() 。 这与这个问题有关,但是在R的nnet和caret包中。

我用一个简单的回归示例来说明问题,其中Y = sin(X) + small error

  • raw Y ~ raw X:预测输出在原始Y < 0统一为零。

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

  • 代码如下

    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()时,有一个预处理选项,但它只能缩放输入。 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变量以获得正范围,但是然后我的预测将是错误的。 虽然这只是一个小问题,但我想知道是否有一个更好的解决方案,用于在输出值为负值时使用插入符号训练nnet或avNNet模型。


    这是由用户topopo在这里交叉验证的答案

    他们答案的相关部分是:

    由于Y大致介于-1和1之间,因此您应该在您的nnettrain通话中使用linout = TRUE

    链接地址: http://www.djcxy.com/p/38387.html

    上一篇: Training nnet and avNNet models with caret when the output has negatives

    下一篇: Predict function from Caret package give an Error