Cesar Augusto Morales Godoy
Roberto Arturo
Buen trabajo en Colab.
¿Cómo generalizar una red neuronal para aplicarla a toda la población?
Las redes neuronales son herramientas poderosas para el análisis de datos, pero su aplicabilidad puede estar limitada si solo se implementan sobre muestras específicas. Hoy aprenderemos a generalizar una red neuronal para que pueda usarse en toda la población. Para ello, haremos uso de diversas librerías y técnicas de validación cruzada que nos ayudarán a reforzar la precisión de nuestro modelo.
¿Qué librerías necesitamos?
Para este proyecto, es crucial contar con ciertas librerías que faciliten la manipulación de datos, la creación de la red neuronal y su validación:
El uso de estas herramientas proporciona una base sólida para implementar una red neuronal eficaz y garantizar su capacidad de generalización a un conjunto más amplio de datos.
¿Cómo funciona la validación cruzada?
La función RMS default es fundamental para llevar a cabo la validación cruzada. Esta función calcula el error cuadrático medio (RMSE) al evaluar la red neuronal en un conjunto de datos de entrenamiento y luego lo comprueba en un conjunto de datos de prueba. Los pasos a seguir son:
Un RMSE consistente entre los diferentes pliegues indica una buena capacidad de generalización del modelo. En este caso, un tamaño muestral de cinco mil fue utilizado, junto con diez neuronas y diez pliegues para evaluar el modelo.
¿Por qué es importante tratar los datos faltantes?
Trabajar con datos reales implica lidiar con datos faltantes. En nuestra ejecución, estos datos son removidos. Sin embargo, el tratamiento y la imputación de datos faltantes es un campo vital en data science que impacta significativamente en la precisión de cualquier modelo. A continuación, algunos enfoques para tratar con datos faltantes:
¿Cómo mejorar la eficiencia con procesamiento paralelo?
Para optimizar el uso de recursos, el procesamiento paralelo juega un papel importante. El paquete parallel y la función MC laply permiten distribuir la carga de procesamiento en varios núcleos del CPU. Al especificar el número de núcleos:
library(parallel) resultados <- mclapply(pliegues, funcion_RMSE_fold, mc.cores = 6)
Esto mejora la velocidad de ejecución del código, especialmente en modelos complejos como las redes neuronales.
¿Cómo interpretar los resultados?
Al graficar los pliegues y su RMSE, podemos identificar:
Aquí un ejemplo de cómo visualizar los datos:
plot(rmse_vector, ylim = c(0, 14)) abline(h = mean(rmse_vector), col = 2, lwd = 2)
El análisis gráfico ayuda a entender mejor el comportamiento del modelo sobre diferentes subconjuntos de datos.
Este enfoque permite afinar una red neuronal para que sea capaz no solo de ajustarse a la muestra inicial, sino de generalizar sus predicciones sobre una gama más amplia de datos. ¡Sigue investigando y experimentando para encontrar el balance ideal en tus modelos!
library('ggplot2') library('lattice') library('caret') library('parallel') rmse_fold <- function(pliegue, form, datos, nn_size){ pliegue_logic <- seq_len(nrow(datos)) %in% pliegue prueba <- subset(datos, pliegue_logic) entrena <- subset(datos, !pliegue_logic) modelo <- nnet(form, data = entrena, size = nn_size, linout = TRUE, trace = FALSE) response_name <- setdiff(names(datos), modelo$coefnames) Y_pronosticado <- predict(modelo, newdata = prueba) rmse <- RMSE(Y_pronosticado, prueba[[response_name]]) rmse } #red neuronal tamano_muestral <- 2000 neuronas <- 10 n_pliegues <- 10 c( 'ECON_PERSONAS_HOGAR', 'ECON_CUARTOS', 'ECON_SN_LAVADORA', 'ECON_SN_NEVERA', 'ECON_SN_HORNO', 'ECON_SN_DVD', 'ECON_SN_MICROHONDAS', 'ECON_SN_AUTOMOVIL', 'MATEMATICAS_PUNT' ) -> variables indices_muestra <- seq_len(nrow(SB11_20111)) %in% sample(seq_len(nrow(SB11_20111)), tamano_muestral) muestra <- subset(SB11_20111, subset = indices_muestra, select = variables) muestra <- na.omit(muestra) createFolds(muestra$MATEMATICAS_PUNT, k = n_pliegues) -> pliegues mclapply( pliegues, rmse_fold, MATEMATICAS_PUNT ~ ., muestra, nn_size = neuronas, mc.cores = 1 ) -> rmse_pliegues rmse_pliegues <- unlist(rmse_pliegues) mean(rmse_pliegues) plot(rmse_pliegues, ylin = c(0, 14)) abline(h = mean(rmse_pliegues), col =2, lwd = 2)
con un nucleo me corrio rapido, toca ver como es con los clusters en windows.
Cesar Augusto Morales Godoy
Roberto Arturo
Buen trabajo en Colab.
VICTOR RENTERIA
El computador de Julián: "Se va a demorar mucho mas" 0.075seg despues... "Ya esta"
Diego Alejandro Lesmes
¿Poder usar los puntajes de otras materias implica que a la red neuronal no le interesa si se usan covariables categoricas o continuas?
Cruz Julian
ProfesorJhon Freddy Tavera Blandon
Videl Chavez Benavente
Se me presento este error: Error in mclapply(pliegues, rmse_fold, ph ~ ., muestra, nn_size = neuronas, : 'mc.cores' > 1 is not supported on Windows por lo que cambie el mclapply por lapply, ya que la funcion mclapply no estad isponible en windows y borre el mc.cores, el codigo quedo asi:
lapply( pliegues, rmse_fold, ph ~., muestra, nn_size = neuronas ) -> rmse_pliegues
Carlos Felipe Saldarriaga Bejarano
En la clase anterior se planteó el reto de determinar nuestras propias variables dependientes para mejorar la predicción de la red neuronal. Apliqué la validación cruzada vista en clase y aquí están los resultados:
Variables:
c("ECON_SN_COMPUTADOR",
"ECON_SN_INTERNET",
"FISICA_PUNT",
"QUIMICA_PUNT",
"MATEMATICAS_PUNT"
) -> variables_reto
Gráfica de rmse
Negro: Resultados de la clase.
Azul: Resultados con variables_reto.
Diego, para (casi todos) los modelos predictivos es necesario dar variables numéricos a las variables explicativas de tipo categórico. En estadística usualmente se denominan variables dummy. En este caso, si examinamos los datos podemos ver que las variables utilizadas tienen valores numéricos, algunas veces 1 y 0 indicando presencia o ausencia.
library("dplyr") glimpse(SB11_20112) ... $ ECON_PERSONAS_HOGAR <int> 5, 3, 6, 5, 6, 6, 6, 12, 4, 7, 4, 4, 6,… $ ECON_CUARTOS <int> 2, 3, 3, 3, 3, 5, 2, 3, 2, 1, 2, 3, 4, … $ ECON_MATERIAL_PISOS <int> 1, 4, 2, 4, 2, 2, 2, 4, 4, 1, 4, 4, 2, … $ ECON_SN_TELEFONIA <int> 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, … $ ECON_SN_CELULAR <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, … $ ECON_SN_INTERNET <int> 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, … $ ECON_SN_SERVICIO_TV <int> 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, … $ ECON_SN_LAVADORA <int> 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, … $ ECON_SN_NEVERA <int> 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, … $ ECON_SN_HORNO <int> 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, … $ ECON_SN_DVD <int> 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, … $ ECON_SN_MICROHONDAS <int> 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, … $ ECON_SN_AUTOMOVIL <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, … ...
Entonces, como vemos, a la red neuronal no le importa que las variables sean numéricas o categóricas desde que estén codificadas correctamente.