Paquetes a instalar: install.packages(“nnet”) install.packages(“neuralnetwork”) install.packages(“h2o.deepLearning”) install.packages(“neuralnet”)

neuralnet # Abriendo y explorando los datos

concrete <- read.csv("concrete.csv")
str(concrete)
## 'data.frame':    1030 obs. of  9 variables:
##  $ cement      : num  540 540 332 332 199 ...
##  $ slag        : num  0 0 142 142 132 ...
##  $ ash         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ water       : num  162 162 228 228 192 228 228 228 228 228 ...
##  $ superplastic: num  2.5 2.5 0 0 0 0 0 0 0 0 ...
##  $ coarseagg   : num  1040 1055 932 932 978 ...
##  $ fineagg     : num  676 676 594 594 826 ...
##  $ age         : int  28 28 270 365 360 90 365 28 28 28 ...
##  $ strength    : num  80 61.9 40.3 41 44.3 ...
set.seed(1)
summary(concrete)
##      cement           slag            ash             water      
##  Min.   :102.0   Min.   :  0.0   Min.   :  0.00   Min.   :121.8  
##  1st Qu.:192.4   1st Qu.:  0.0   1st Qu.:  0.00   1st Qu.:164.9  
##  Median :272.9   Median : 22.0   Median :  0.00   Median :185.0  
##  Mean   :281.2   Mean   : 73.9   Mean   : 54.19   Mean   :181.6  
##  3rd Qu.:350.0   3rd Qu.:142.9   3rd Qu.:118.30   3rd Qu.:192.0  
##  Max.   :540.0   Max.   :359.4   Max.   :200.10   Max.   :247.0  
##   superplastic      coarseagg         fineagg           age        
##  Min.   : 0.000   Min.   : 801.0   Min.   :594.0   Min.   :  1.00  
##  1st Qu.: 0.000   1st Qu.: 932.0   1st Qu.:731.0   1st Qu.:  7.00  
##  Median : 6.400   Median : 968.0   Median :779.5   Median : 28.00  
##  Mean   : 6.205   Mean   : 972.9   Mean   :773.6   Mean   : 45.66  
##  3rd Qu.:10.200   3rd Qu.:1029.4   3rd Qu.:824.0   3rd Qu.: 56.00  
##  Max.   :32.200   Max.   :1145.0   Max.   :992.6   Max.   :365.00  
##     strength    
##  Min.   : 2.33  
##  1st Qu.:23.71  
##  Median :34.45  
##  Mean   :35.82  
##  3rd Qu.:46.13  
##  Max.   :82.60

En este caso queremos predecir la fuerza que tendra el concreto.

Normalizando los datos

Si los datos siguen una distribucion normal, tiene sentido normalizarlos usando scale. Si los datos siguen una distribucion uniforme o son muy poco normales, puede convenir usar normalizacion min-max.

En este caso, aplicaremos min-max:

normalize <- function(x) {
    return((x - min(x)) / (max(x) - min(x)))
}
concrete_norm <- as.data.frame(lapply(concrete, normalize))

Confirmamos que nuestros datos esten entre 0 y 1:

summary(concrete_norm)
##      cement            slag              ash             water       
##  Min.   :0.0000   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.2063   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.3442  
##  Median :0.3902   Median :0.06121   Median :0.0000   Median :0.5048  
##  Mean   :0.4091   Mean   :0.20561   Mean   :0.2708   Mean   :0.4774  
##  3rd Qu.:0.5662   3rd Qu.:0.39775   3rd Qu.:0.5912   3rd Qu.:0.5607  
##  Max.   :1.0000   Max.   :1.00000   Max.   :1.0000   Max.   :1.0000  
##   superplastic      coarseagg         fineagg            age         
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.0000   1st Qu.:0.3808   1st Qu.:0.3436   1st Qu.:0.01648  
##  Median :0.1988   Median :0.4855   Median :0.4654   Median :0.07418  
##  Mean   :0.1927   Mean   :0.4998   Mean   :0.4505   Mean   :0.12270  
##  3rd Qu.:0.3168   3rd Qu.:0.6640   3rd Qu.:0.5770   3rd Qu.:0.15110  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000  
##     strength     
##  Min.   :0.0000  
##  1st Qu.:0.2664  
##  Median :0.4001  
##  Mean   :0.4172  
##  3rd Qu.:0.5457  
##  Max.   :1.0000

Separamos los datos en entrenamiento y prueba:

largo <- nrow(concrete_norm)
s <- sample(largo, largo*0.75)
concrete_train <- concrete_norm[s, ]
concrete_test <- concrete_norm[-s, ]

Construyendo el modelo

Desgraciadamente, a neuralnet no le gusta la sintaxis de formulas con punto, por lo que hay que especificar todas las variables:

library(neuralnet)
model <- neuralnet(strength ~ cement + slag
  + ash + water + superplastic + coarseagg + fineagg + age, data = concrete_train)

Probamos la calidad de la regresion. Para determinar la calidad de la prediccion podemos usar cor:

resultados <- compute(model, concrete_test[,-9])
predicciones <- resultados$net.result
cor(concrete_test$strength, predicciones)
##              [,1]
## [1,] 0.8197239518

Podemos visualizar el modelo:

plot(model)

Error es la suma de los errores cuadaticos. Steps es el numero de pasos que dio la red para entrenar

¿Que forma tiene nuestra red? ¿Si la dejamos asi, tiene sentido haber hecho una red neuronal?

Agregando capas

model2 <- neuralnet(strength ~ cement + slag
  + ash + water + superplastic + coarseagg + fineagg + age, 
  data = concrete_train,
  hidden = c(5,5, 2))
plot(model2)

Evaluamos el nuevo modelo

resultados2 <- compute(model2, concrete_test[,-9])
cor(concrete_test$strength, resultados2$net.result)
##             [,1]
## [1,] 0.943175591

¿Que paso con el numero de pasos? ¿Y el error? Experimente agregando otra capa de 5 nodos usando hidden = c(5,5). ¿Que ocurre?