Значение: улучшение RMSE во время перекрестной проверки, хотя и не на тестовом наборе? - PullRequest
0 голосов
/ 10 сентября 2018

В приведенном ниже коде я обучаю NN с перекрестной проверкой первых 20000 записей в наборе данных. Набор данных содержит 8 предикторов.

Сначала я разделил свои данные на 2 части: первые 20.000 строк (поезд) и последние 4003 строки (из выборочного тестового набора)

Я сделал 2 пробега: прогон 1) прогон с 3 предикторами прогон 2) прогон со всеми 8 предикторами (см. код ниже).

На основе перекрестной проверки в пределах 20 000 строк от набора поездов RMSE (для оптимального набора параметров) улучшается с 2,30 (прогон 1) до 2,11 (прогон 2).

Хотя, когда я тестирую обе модели на 4003 строках из набора тестов вне образца, среднеквадратичное отклонение улучшается лишь незначительно с 2,64 (прогон 1) до 2,63 (прогон 2).

Что можно сделать из этого противоречия в результатах?

Спасибо!

### R code from Applied Predictive Modeling (2013) by Kuhn and Johnson.
### Chapter 7: Non-Linear Regression Models
### Required packages: AppliedPredictiveModeling, caret, doMC (optional), 
### earth, kernlab, lattice, nnet
################################################################################

library(caret)    
### Load the data

mydata <- read.csv(file="data.csv", header=TRUE, sep=",")

validatiex <- mydata[20001:24003,c(1:8)]
validatiey <- mydata[20001:24003,9]

mydata <-  mydata[1:20000,]

x <- mydata[,c(1:8)]
y <- mydata[,9]

parti <- createDataPartition(y, times = 1, p=0.8, list = FALSE)    
x_train <- x[parti,]
x_test <- x[-parti,]
y_train <- y[parti]
y_test <- y[-parti]


set.seed(100)
indx <- createFolds(y_train, returnTrain = TRUE)
ctrl <- trainControl(method = "cv", index = indx)

## train neural net:

nnetGrid <- expand.grid(decay = c(.1), 
                        size = c(5, 15, 30), 
                        bag = FALSE)

set.seed(100)
nnetTune <- train(x = x_train, y = y_train,
                  method = "avNNet",
                  tuneGrid = nnetGrid,
                  trControl = ctrl,
                  preProc = c("center", "scale"),
                  linout = TRUE,
                  trace = FALSE,
                  MaxNWts = 30 * (ncol(x_train) + 1) + 30 + 1,
                  maxit = 1000,
                  repeats = 25,
                  allowParallel = FALSE)
nnetTune
plot(nnetTune)



predictions <- predict(nnetTune, validatiex, type="raw")
mse <- mean((validatiey - predictions)^2)
mse <- sqrt(mse)
print (mse)
...