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.
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, ]
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?
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?