Cuantificador Bayesiano Ingenuo en R

por | Sep 29, 2016 | R | 3 Comentarios

Uso: Clasificador probabilístico.

Descripción: Este método de clasificación probabilístico está fundamentado en el teorema de Bayes, clasifica clases preestablecidas de una población dependiendo de sus variables independientes.

Para entender la peculiaridad del método se recurrirá al ejemplo típico de clasificar fruta, donde se considerada como una manzana una fruta si es amarilla, redonda y de alrededor de 7 cm de diámetro. Un clasificador de Bayes ingenuo considera que cada una de estas características contribuye de manera independiente a la probabilidad de que esta fruta sea una manzana, independientemente de la presencia o ausencia de las otras características.

Variable dependiente: No métrica.

Variables independientes: Métricas y no métricas.

Ejemplo en R: Clasificar fruta atendiendo a su color, forma, tamaño y calorías.

Carga de datos inicial, tipos de flores con diferentes características

# Carga de datos inicial, tipos de flores con diferentes características 
# Crea vector con repetición del dato entre comillas por el número de veces que se establezcan (100)
color <- c(rep('amarilla',100), rep('naranja',100), rep('roja',100), rep('amarilla',100), rep('verde',100) )
forma <- c(rep('redonda',300), rep('alargada',200))
fruta <- c(rep('manzana',100),rep('mandarina',100), rep('sandia',100), rep('plátano',100), rep('melón',100) )

#Crea vector con una distribución normal donde la primera variable es el numero de valores a obtener (100) y el segundo
#la media del valor a obtener (11,6 etc..)
tamano <- c(rnorm(100,11), rnorm(100,6), rnorm(100,25), rnorm(100,16),rnorm(100,24))
calorias <- c(rnorm(100,52),rnorm(100,53), rnorm(100,30),rnorm(100,89),rnorm(100,34))

aux <-matrix(c(color, forma, tamano, calorias, fruta), ncol = 5)
colnames(aux) <- c('color', 'forma','tamano', 'calorías', 'fruta')
datos<-data.frame(aux)

Corregimos tipos de variables

#Calidad de datos: Corregimos las variables tamano, calorias y fruta a su tipo de variable correcta
install.packages('dplyr')
install.packages('tidyr')
library(dplyr)
library(tidyr)
datos <- datos %>%
  mutate(tamano = as.numeric(tamano)) %>%
  mutate(calorias = as.numeric(calorias)) %>%
  mutate(fruta = as.factor(fruta))

Preparamos los datos de entrenamiento y de testeo

set.seed(101)
tamano.total <- nrow(datos)
tamano.train <- round(tamano.total*0.7)
datos.indices <- sample(1:tamano.total , size=tamano.train)
datos.train <- datos[datos.indices,]
datos.test <- datos[-datos.indices,]

Ejecución del Clasificador bayesiano ingenuo

install.packages('e1071')
library("e1071")
modelo <- naiveBayes(fruta ~ ., data=datos.train)
summary(modelo)

## Length Class  Mode     
## apriori   5      table  numeric  
## tables    5      -none- list     
## levels    5      -none- character
## isnumeric 5      -none- logical  
## call      4      -none- call  

Predicciones

# predict necesita el parámetro newdata
results <- predict(modelo, newdata=datos.test) #Obtenemos la clase con mayor probabilidad que ha predecido que es
results2 <- predict(modelo, newdata=datos.test, type="raw") #Obtenemos las probabilidades de ser de cada clase

#Matriz de confusión que enfrenta las predicciones frente a la realidad
mc <- table(results,datos.test$fruta)
mc

##  results     mandarina manzana melón plátano sandia
## mandarina        29       0     0       0      0
## manzana           0      28     0       0      0
## melón             0       0    30       0      0
## plátano           0       0     0      29      0
## sandia            0       0     0       0     34

# Elementos correctamente clasificados
correctos <- 100 * sum(diag(mc)) / sum(mc)
correctos

## [1] 100

3 Comentarios

  1. Luis Dos Santos

    Buen dia Diego. Como se escribe para que no solo me arroje la clase sino que me arroje la probabilidad? (en caso de que devuelva una u otra, que me devuelva la probabilidad). Probe escribiendo type=»raw» en lugar de class, pero me arroja un error. Me dice que tiene que ser mismo length. Como lo puedo corregir? Gracias. Saludos

    Responder
    • Luis Delannoy

      results <- predict(object = modelo, newdata=datos.test, type = "row")

      Responder
    • Luis Delannoy

      results <- predict(object = modelo, newdata=datos.test, type = "raw")

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada.