Мой вопрос касается типичной нейронной сети backprop с прямой скрытой структурой, реализованной в пакете nnet, и обучения с помощью train()
в пакете caret. Это связано с this question, но в контексте Nnet и CARET пакетов в R.Обучение nnet и avNNet моделей с кареткой, когда выходные данные имеют отрицательные значения
я демонстрирую эту проблему с помощью простой регрессии, например, где Y = sin(X) + small error
:
raw Y ~ raw X:
предсказанного выходы равномерно нуля где rawY < 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()
в каретку, есть вариант 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
переменных (ы), чтобы иметь положительный диапазон, но затем мои предсказания будут на неправильном уровне. Хотя это лишь незначительная головная боль, мне интересно, есть ли лучшее решение для обучения nnet или avNNet-моделей с каретой, когда выходные данные имеют отрицательные значения.