¿Cómo entrenar y validar un modelo de red neuronal en R?

33

Soy nuevo en el modelado con redes neuronales, pero logré establecer una red neuronal con todos los puntos de datos disponibles que se ajustan bien a los datos observados. La red neuronal se realizó en R con el paquete nnet:

require(nnet)      
##33.8 is the highest value
mynnet.fit <- nnet(DOC/33.80 ~ ., data = MyData, size = 6, decay = 0.1, maxit = 1000)      
mynnet.predict <- predict(mynnet.fit)*33.80  
mean((mynnet.predict - MyData$DOC)^2) ## mean squared error was 16.5      

Los datos que estoy analizando se ven de la siguiente manera, donde el DOC es la variable que debe modelarse (hay aproximadamente 17,000 observaciones):

      Q  GW_level Temp   t_sum   DOC
1 0.045    0.070 12.50     0.2 11.17
2 0.046    0.070 12.61     0.4 11.09
3 0.046    0.068 12.66     2.8 11.16
4 0.047    0.050 12.66     0.4 11.28
5 0.049    0.050 12.55     0.6 11.45
6 0.050    0.048 12.45     0.4 11.48

Ahora, he leído que el modelo debe ser entrenado con el 70% de los puntos de datos, y validado con el 30% restante de los puntos de datos. ¿Cómo hago esto? ¿Qué funciones tengo que usar?

Utilicé la función de tren del paquete caret para calcular los parámetros de tamaño y descomposición.

require(caret)
my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
mynnetfit <- train(DOC/33.80 ~ ., data = MyData, method = "nnet", maxit = 100, tuneGrid = my.grid, trace = f)

Cualquier ayuda directa o enlace a otros sitios web / publicaciones es muy apreciada.

Strohmi
fuente
66
En realidad, la metodología de división de tren / prueba es deficiente, ya que el rendimiento de su algoritmo puede variar bastante en función de su elección del punto de división (he visto diferencias del 5% ...). Una mejor metodología es la validación cruzada.
John Doucette

Respuestas:

36

El manual de cuidados de Max Kuhn - Model Building es un excelente punto de partida.

Creo que la etapa de validación ocurre dentro de la llamada caret train (), ya que está eligiendo sus hiperparámetros de descomposición y tamaño a través de bootstrapping o algún otro enfoque que puede especificar a través del parámetro trControl. Llamo al conjunto de datos que uso para caracterizar el error del modelo final elegido mi conjunto de prueba. Dado que caret maneja la selección de hiperparámetros para usted, solo necesita un conjunto de entrenamiento y un conjunto de prueba.

Puede usar la función createDataPartition () en caret para dividir su conjunto de datos en conjuntos de entrenamiento y prueba. Probé esto usando el conjunto de datos de Prestige del paquete del automóvil, que tiene información sobre los ingresos en relación con el nivel de educación y el prestigio ocupacional:

library(car)
library(caret)
trainIndex <- createDataPartition(Prestige$income, p=.7, list=F)
prestige.train <- Prestige[trainIndex, ]
prestige.test <- Prestige[-trainIndex, ]

La función createDataPartition () parece un poco mal nombrada porque no crea la partición para usted, sino que proporciona un vector de índices que luego puede usar para construir conjuntos de entrenamiento y prueba. Es bastante fácil hacerlo usted mismo en R usando sample (), pero una cosa que createDataPartition () aparentemente hace es samplear dentro de los niveles de factores. Además, si su resultado es categórico, la distribución se mantiene entre las particiones de datos. Sin embargo, no es relevante en este caso, ya que su resultado es continuo.

Ahora puedes entrenar a tu modelo en el conjunto de entrenamiento:

my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
prestige.fit <- train(income ~ prestige + education, data = prestige.train,
    method = "nnet", maxit = 1000, tuneGrid = my.grid, trace = F, linout = 1)    

Aparte: tuve que agregar el parámetro linout para que nnet funcione con un problema de regresión (vs. clasificación). De lo contrario, obtuve todos los 1 como valores predichos del modelo.

Luego puede llamar a predicción sobre el objeto de ajuste utilizando el conjunto de datos de prueba y calcular RMSE a partir de los resultados:

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 
Anne Z.
fuente
su enlace de Max Kuhn parece haber muerto.
EngrStudent - Reinstale a Monica el
Encontré el libro de Max Kuhn, está oculto aquí: feat.engineering
Agile Bean