我的问题是关于典型的前馈单隐层backprop神经网络,在package nnet中实现,并且使用在包装符号中进行了培训。当输出为负数时,用插入符号训练nnet和avNNet模型
raw Y ~ raw X:
预测输出是均匀地为零,其中:这是我说明问题用简单的回归示例,其中Y = sin(X) + small error
有关this question但在NNET和尖包在R.上下文原料
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
变量(S)有一个积极的范围内,但后来我的预测将是错误的规模。虽然这只是一个小问题,但我想知道是否有一个更好的解决方案,用于在输出值为负值时使用插入符号训练nnet或avNNet模型。