A continuación, se desarrollan 2 Redes Neuronales Artificiales (RNA). El propósito de desarrollar las RNAs, es para analizar que tan preciso el modelo puede calcular probabilidades sin saber la fórmula para hacerlo. Se realizarán RNAs con una distribución normal y distribución binomial.


Datos simulados de una distribución normal


Primeramente, se desarrolla el ‘data.frame’ que contendrá los datos simulados de la distribución normal. Para ‘x’, los datos se desarrollarán mediante la función de ‘seq()’, pero en caso de ‘y’, se utilizará la función de ‘pnorm()’, la cual en base a los datos de ‘x’ calculará la probabilidad con distribución normal y almacenará los datos bajo ‘y’. Todo este conjunto de datos simulado, se almacenará bajo ‘data_n’, la cual indica que contiene toda la data correspondiente a la distribución normal.


set.seed(1234)  
data_n  <- data.frame(
  x   <- round(seq(-3,3,length=100),1),
  y   <- round(pnorm(x),4))
  
names(data_n)[which(names(data_n) == "x....round.seq..3..3..length...100...1.")] <- "x_normal"
names(data_n)[which(names(data_n) == "y....round.pnorm.x...4.")] <- "y_normal"

head(data_n)
##   x_normal y_normal
## 1     -3.0   0.0013
## 2     -2.9   0.0019
## 3     -2.9   0.0019
## 4     -2.8   0.0026
## 5     -2.8   0.0026
## 6     -2.7   0.0035



Dividir de los datos de la distribución normal


Luego de desarrollar los datos para la distribución normal, se dividirán en dos grupos de datos: uno de entrenamiento y otro de prueba. Esto nos permitirá poder evaluar el funcionamiento de nuestro RNA. Se utilizará un 80% de los datos de manera aleatoria para el conjunto de datos de ‘entrenamiento_n’ y el restante de 20% se adjudicará bajo el conjunto de ‘prueba_n’


N       <- nrow(data_n)
n       <- round(N*0.80)
set.seed(1234)
indices         <- sample(1:N,n)
entrenamiento_n <- data_n[indices,]
prueba_n        <- data_n[-indices,]



Entrenar la red neuronal para los datos de la distribución normal


Teniendo establecido nuestros grupos de datos, utilizaremos la paquetería ‘neuralnet’ para que desarrolle nuestra primera red neuronal artificial. Aquí le indicamos a la función mediante el símbolo ‘~’ que ‘x_normal” determinará a ’y_normal’.


library(neuralnet)
RNA1  <- neuralnet(y_normal ~ x_normal, entrenamiento_n, hidden = c(6,6), rep = 3)



Mostrar red neuronal de los datos simulados de la distribución normal


Un vez creada nuestra RNA1, podemos visualizarla con el próximo código:


plot(RNA1, rep = "best")



Nuevos datos para saber RN1 está funcionando correctamente


Aunque RNA1 está desarrollada, se desea verificar que la misma cuente con la predicción más exacta posible. Por tal razón, utilizaremos el conjunto de datos ‘prueba_n’ para poder corroborar su funcionamiento mediante la función ‘compute’. Aquí se calculará el valor real, el valor predecido por el modelo utilizando probabilidades y finalmente, el margen de error, donde se restará el valor real, con el valor predecido y se dividirá entre el valor real para conocer la proporción.


output <- compute(RNA1, prueba_n, rep = 1)
data.frame(
  Real = round(prueba_n$y,3), 
  Pred =round(output$net.result,3), 
  Error = round(abs(prueba_n$y - output$net.result)/prueba_n$y,3))
##     Real  Pred Error
## 1  0.008 0.005 0.399
## 2  0.011 0.010 0.073
## 3  0.014 0.016 0.120
## 4  0.023 0.029 0.275
## 5  0.055 0.067 0.230
## 6  0.115 0.127 0.101
## 7  0.136 0.146 0.075
## 8  0.159 0.167 0.052
## 9  0.242 0.243 0.005
## 10 0.345 0.340 0.014
## 11 0.579 0.575 0.008
## 12 0.618 0.615 0.005
## 13 0.692 0.692 0.000
## 14 0.726 0.727 0.002
## 15 0.864 0.869 0.005
## 16 0.864 0.869 0.005
## 17 0.919 0.923 0.004
## 18 0.971 0.973 0.002
## 19 0.986 0.986 0.000
## 20 0.999 0.988 0.010



Datos simulados de una distribución binomial


En esta sección se creará el RNA2 para una distribución de datos binomial. Para esto, primeramente se genera un conjunto de datos mediante un ‘data.frame’. Se utilizará la función ‘seq()’ para producir los datos de ‘x’. No obstante, los datos de ‘y’ se generarán usando la función ‘dbinom()’. Se espera que la probabilidad de éxito sea de 0.9 y la muestra tenga un tamaño de 100. Todos estos datos se almacenarán bajo ‘data_b’, lo cual indica que tiene todos los datos simulados de la distribución binomial.


set.seed(1234)  
size <- 100
data_b <- data.frame(
  x <- round(seq(0, size, length=100)),
  y <- round(dbinom(x, size = size, prob = 0.9), 4))

names(data_b)[which(names(data_b) == "x....round.seq.0..size..length...100..")] <- "x_binomial"
names(data_b)[which(names(data_b) == "y....round.dbinom.x..size...size..prob...0.9...4.")] <- "y_binomial"

head(data_b)
##   x_binomial y_binomial
## 1          0          0
## 2          1          0
## 3          2          0
## 4          3          0
## 5          4          0
## 6          5          0



Dividir los datos simulados de la distribución binomial


De igual manera que se realizó con los datos de la distribución normal, nuestros datos de la distribución binomial serán divididos, donde un 80% se encontrará en el conjunto de entrenamiento y un 20% en el grupo de prueba. Esto nos permitirá adiestrar y evaluar el modelo RNA2.


N       <- nrow(data_b)
n       <- round(N*0.80)
set.seed(1234)
indices         <- sample(1:N,n)
entrenamiento_b <- data_b[indices,]
prueba_b        <- data_b[-indices,]



Entrenar la red neuronal de los datos simulados de la distribución binomial


A continuación, crearemos a RNA2 para los datos simulados de la distribución binomial. Se utilizará la paquetería ‘neuralnet’, donde ‘x_binomial’ determinará ‘y_binomial’.


library(neuralnet)
RNA2  <- neuralnet(y_binomial ~ x_binomial, entrenamiento_b, hidden = c(6,6), rep = 3)



Mostrar red neuronal de los datos simulados de la distribución binomial


Luego de crear RN2, se visualizará mediante la función ‘plot()’.


plot(RNA2, rep = "best")



Nuevos datos para saber si RN2 está funcionando correctamente


Ya finalizado nuestro RNA para los datos de la distribución binomial, vamos a ingresarle los datos de ‘prueba_b’ y corroborar su funcionamiento. Se calcularán los datos reales, los datos predecidos por el modelo y el margen de error, donde se restará el valor real, con el valor predecido y se dividirá entre el valor real para conocer la proporción.


output <- compute(RNA2, prueba_b, rep = 1)
data.frame(
  Real = round(prueba_b$y,3), 
  Pred =round(output$net.result,3), 
  Error = round(abs(prueba_b$y - output$net.result)/prueba_b$y,3))
##     Real   Pred Error
## 1  0.000 -0.001   Inf
## 2  0.000 -0.001   Inf
## 3  0.000 -0.002   Inf
## 4  0.000 -0.002   Inf
## 5  0.000  0.000   Inf
## 6  0.000  0.002   Inf
## 7  0.000  0.002   Inf
## 8  0.000  0.002   Inf
## 9  0.000  0.002   Inf
## 10 0.000  0.001   Inf
## 11 0.000 -0.004   Inf
## 12 0.000 -0.005   Inf
## 13 0.000 -0.005   Inf
## 14 0.000 -0.005   Inf
## 15 0.000  0.001   Inf
## 16 0.000  0.003   Inf
## 17 0.000  0.011   Inf
## 18 0.005  0.029 4.456
## 19 0.074  0.041 0.448
## 20 0.000  0.066   Inf



Conclusiones


Al comparar los resultados de RNA1 y RNA2, podemos concluir que el modelo de RNA1 con datos de distribución normal, brinda predicciones más exactas que RNA2. No obstante, RNA2 en algunos datos aparenta brindar mucha más precisión que la distribución normal, al demostrar datos infinitos. Sin embargo, la data que genera en términos de valores reales en su mayoría son ceros, por lo que, se pueden relucir como posibles errores y no brinda mucha confiabilidad.