Iris Data – un ejemplo de una RNA usandoR

Buen día a todos, en este post, se mostrará una manera sencilla de correr el algoritmo de una red neuronal artificial, RNA usando el software libre “R”.
Antes que nada, queremos dejar en claro que en este post no explicaremos la teoría, para aprender la teoría recomendamos el libro de “Make your own neural network” by Tariq Rashid.

Abrimos primero RStudio y cargamos la base de datos de iris, de la siguiente manera

data(iris)

#Una buena práctica es iniciar con la estadística descriptiva, conocer nuestros datos, la estructura, etc.
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
#Podemos checar nrow, ncol o dim, para de esta manera saber cuantas filas y columnas tenemos.
dim(iris)
## [1] 150   5
#Podememos también probar algo como(iris, 10), para conocer las primeras 10 observaciones de nuestra información.
head(iris,10)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa

Después de jugar un poco con los datos, se observó que contamos con cinco variables, las cuales tratan del ancho y largo del sépalo y pétalo de las flores.

El problema aquí es que contamos con cuatro variables explicatorias o predictoras y una variable dependiente que es la especie de la flor “iris$Species”, pero en realidad tenemos tres variables ya que son tres especies las que podemos encontrar en la columna de “iris$Species”, para esto debemos primero convertir la columna en varias columnas “dummy” como se diría en econometría.
El código sería el siguiente:

#There might be many ways to encode our data, but I'll show a simple one here.
#I used the ifelse function the following way.
iris$setosa<-ifelse(iris$Species == "setosa",1,0)
iris$versicolor<-ifelse(iris$Species == "versicolor",1,0)
iris$virginica<-ifelse(iris$Species == "virginica",1,0)

#Una vez que hemos añadido las variables, podemos proceder la eliminación de la columna de "iris$Species"
iris$Species <- NULL

Una RNA necesita variables de entrada y variables de salida, es por eso que hemos creado las varaibles “dummy” (1,0) para cada especie. El siguiente paso sería separar los datos en datos de entrada y de salida, podemos intentar algo como:

xin<-data.frame(iris$Sepal.Length,iris$Sepal.Width,iris$Petal.Length,iris$Petal.Width)
xout<-data.frame(iris$setosa,iris$versicolor,iris$virginica)

Si observamos la información, veremos que nuestros datos estan ordenados y esto es algo que no necesitamos pues sabemos debemos dividir la información para entrenar los datos con un porcentaje y probar el modelo con los datos restantes, una buena práctica es tomar una muestra de los datos de manera aleatoria. Para esto R cuenta con una función llamada sample, la cual usaremos de la siguiente manera.

#Sample Indexes
indexes = sample(1:nrow(xin), size=0.6*nrow(xin))
#################################33
# Split data
testxin = xin[indexes,]
trainxin = xin[-indexes,]
##########################3
# Split data
testxout = xout[indexes,]
trainxout = xout[-indexes,]

Ya casi terminamos, cargemos la libreria nnet o instalemosla en caso de no tenerla.

library(nnet)
#Train the ann
iristrain<-nnet(trainxin,trainxout, size = 10, softmax = TRUE, maxit= 1000, abstol=1e-10)
## # weights:  83
## initial  value 89.405588 
## iter  10 value 11.188072
## iter  20 value 0.118171
## iter  30 value 0.000142
## iter  40 value 0.000000
## iter  50 value 0.000000
## final  value 0.000000 
## converged
#Predict 
irisPredict<-round(predict(iristrain,testxin))

Es importante entender la razón del uso de la función round, esta función es utilizada ya que la predicción nos brindará resultados entre 0 y 1, pero sabemos nosotros que el resultado solo puede tomar dos números el cero o el uno, si redondeamos, el resultado será como esperamos.

#Compare the prediction vs the real results.
Table1<-abs(irisPredict-testxout)

#Medición de error y precisión
Error<-(sum(Table1)/2)/nrow(testxout)
#Dividimos entre dos ya que en caso de tener un error, al realizar la resta nos quedarán 1 y -1, pero si obtenemos el valor absoluto de los datos podemos sumarlos para conocer el número de errores realizados.
Error
## [1] 0.02
Accuracy<-1-Error
Accuracy
## [1] 0.98

Eso es todo, has hecho uso de una red neuronal artificial!

 

Red Neuronal Artificial – Un ejemplo usando R

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *