Agosto 25 y 28, 2015

Teorema de Bayes

El método más sencillo para clasificar es que hace uso explícito del Teorema de Bayes: \[ P(A|X) = \frac{P(A)P(X|A)}{P(X)}, \qquad (1)\] es decir, \[ P(cat(A)|feat(X)) = \frac{P(cat(A))P(feat(X)|cat(A))}{P(feat(X))}, \qquad (2)\] donde \(cat(A)\) es la categoría \(A\), por ejemplo buen pagador; y \(feat(X)\) es la característica o feature \(X\), por ejemplo salario.

Teorema de Bayes Multivariable

Usando la ecuación 2, es posible deducir que para un evento con un conjunto de características dadas \({\bf X}= \{ X_1, X_2,\ldots,X_n\}\), la probabilidadd de que nuestro evento pertenezca a la categoría A es: \[ \begin{array}\phantom{P} (cat(A)|feat({\bf X}))&=&\frac{P(cat(A))P(feat(X_1)|cat(A))}{P(feat(X_1))}\times\\ & &\frac{P(cat(A))P(feat(X_2)|cat(A))}{P(feat(X_2))}\times\\ & &\ldots\times\ldots\times\\ & &\frac{P(cat(A))P(feat(X_N)|cat(A))}{P(feat(X_N))}. \end{array} \qquad (3)\] De forma similar para \(cat(\neg A)\)

Clasificación

  • ¿Cómo podemos saber si es más probable que el evento con características \({\bf X}\) pertenezca a la categoría \(A\), o a la categoría \(\neg A\)?
  • Usando las probabilidade relativas:
  • \[ y = \frac{P(cat(A)|feat({\bf X}))}{P(cat(\neg A)|feat({\bf X}))}. \]
  • Si \(y > 1\), la probabildad de que el evento con características \({\bf X}\) pertenezca a la categoría \(A\) es mayor que la probabilidad de que pertenezca a la categoría \(\neg A\).

Clasificador Bayesiano ingenuo (Naive Bayesian)

Escribiendo explícitamente las probabilidades relativas para cada característica, se tiene: \[ \begin{eqnarray} y &=& \frac{P(cat(A))P(feat({\bf X})|cat(A))}{P(cat(\neg A))P(feat({\bf X})|cat(\neg A))}\\ &=& \left(\frac{P(cat(A))}{P(cat(\neg A))}\right)^{N} \frac{P(feat(X_1)|cat(A))}{P(feat(X_1)|cat(\neg A))} \times \\ & & \frac{P(feat(X_2)|cat(A))}{P(feat(X_2)|cat(\neg A))} \times\ldots\times \frac{P(feat(X_N)|cat(A))}{P(feat(X_N)|cat(\neg A))}. \end{eqnarray} \qquad (4)\]

Empecemos a trabajar con datos

Explorando los datos

#!/usr/bin/env Rscript
setwd("~/clases/iteso/examples")
my_file<-paste(getwd(),"/../german_data/german.data-numeric.csv",sep='')
mydata <- read.table(my_file, header=FALSE, sep=",")
print(summary(mydata))

##        V1              V2             V3              V4        
##  Min.   :1.000   Min.   : 4.0   Min.   :0.000   Min.   :  2.00  
##  1st Qu.:1.000   1st Qu.:12.0   1st Qu.:2.000   1st Qu.: 14.00  
##  Median :2.000   Median :18.0   Median :2.000   Median : 23.00  
##  Mean   :2.577   Mean   :20.9   Mean   :2.545   Mean   : 32.71  
##  3rd Qu.:4.000   3rd Qu.:24.0   3rd Qu.:4.000   3rd Qu.: 40.00  
##  Max.   :4.000   Max.   :72.0   Max.   :4.000   Max.   :184.00  
##        V5              V6              V7              V8       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:2.000  
##  Median :1.000   Median :3.000   Median :3.000   Median :3.000  
##  Mean   :2.105   Mean   :3.384   Mean   :2.682   Mean   :2.845  
##  3rd Qu.:3.000   3rd Qu.:5.000   3rd Qu.:3.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :4.000   Max.   :4.000  
##        V9             V10             V11             V12       
##  Min.   :1.000   Min.   :19.00   Min.   :1.000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:27.00   1st Qu.:3.000   1st Qu.:1.000  
##  Median :2.000   Median :33.00   Median :3.000   Median :1.000  
##  Mean   :2.358   Mean   :35.55   Mean   :2.675   Mean   :1.407  
##  3rd Qu.:3.000   3rd Qu.:42.00   3rd Qu.:3.000   3rd Qu.:2.000  
##  Max.   :4.000   Max.   :75.00   Max.   :3.000   Max.   :4.000  
##       V13             V14             V15             V16       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :0.000  
##  1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:0.000  
##  Median :1.000   Median :1.000   Median :1.000   Median :0.000  
##  Mean   :1.155   Mean   :1.404   Mean   :1.037   Mean   :0.234  
##  3rd Qu.:1.000   3rd Qu.:2.000   3rd Qu.:1.000   3rd Qu.:0.000  
##  Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :1.000  
##       V17             V18             V19             V20       
##  Min.   :0.000   Min.   :0.000   Min.   :0.000   Min.   :0.000  
##  1st Qu.:0.000   1st Qu.:1.000   1st Qu.:0.000   1st Qu.:0.000  
##  Median :0.000   Median :1.000   Median :0.000   Median :0.000  
##  Mean   :0.103   Mean   :0.907   Mean   :0.041   Mean   :0.179  
##  3rd Qu.:0.000   3rd Qu.:1.000   3rd Qu.:0.000   3rd Qu.:0.000  
##  Max.   :1.000   Max.   :1.000   Max.   :1.000   Max.   :1.000  
##       V21             V22             V23           V24      
##  Min.   :0.000   Min.   :0.000   Min.   :0.0   Min.   :0.00  
##  1st Qu.:0.000   1st Qu.:0.000   1st Qu.:0.0   1st Qu.:0.00  
##  Median :1.000   Median :0.000   Median :0.0   Median :1.00  
##  Mean   :0.713   Mean   :0.022   Mean   :0.2   Mean   :0.63  
##  3rd Qu.:1.000   3rd Qu.:0.000   3rd Qu.:0.0   3rd Qu.:1.00  
##  Max.   :1.000   Max.   :1.000   Max.   :1.0   Max.   :1.00  
##       V25     
##  Min.   :1.0  
##  1st Qu.:1.0  
##  Median :1.0  
##  Mean   :1.3  
##  3rd Qu.:2.0  
##  Max.   :2.0

Graficando algunas Variables

Graficando algunas Variables

Graficando algunas Variables

¿Cómo creamos nuestro modelo?

  • Los histogramas no son aún nuestras densidades de probabilidad.
  • ¿Cómo creamos nuestras densidades de probabilidad para hacer nuestro modelo Bayesiano?
  • Debemos normalizar nuestros hostogramas con respecto al número de eventos en cada categoría.
  • Eso define nuestras densidades de probabilidad \(P(feat(X_i)|cat(A))\) y \(P(feat(X_1)|cat(\neg A))\)
  • Por el momento supondremos que \(P(cat(A)) = P(cat(\neg A))\)

Densidades de Probabilidad

freq<-FALSE
bv10<-hist(bad$V10, breaks=v10breaks, col=Red,freq = freq, main = "V10 density", xlab="V10") # Red density
gv10<-hist(good$V10, breaks=v10breaks,col=Blue,freq = freq, add=TRUE)
legend(60, 0.04, c("Good","Bad")  ,pch=15, pt.cex = 2, col=c(blue, red))

Densidades de Probabilidad

freq<-FALSE
bv4<-hist(bad$V4, breaks=v4breaks, col=Red,freq = freq, main = "V4 density", xlab="V4") # Red density
gv4<-hist(good$V4, breaks=v4breaks,col=Blue,freq = freq, add=TRUE)
legend(120, 0.02, c("Good","Bad")  ,pch=15, pt.cex = 2, col=c(blue, red))

Densidades de Probabilidad

freq<-FALSE
bv2<-hist(bad$V2, breaks=v2breaks, col=Red,freq = freq, main = "V2 density", xlab="V2") # Red density
gv2<-hist(good$V2, breaks=v2breaks,col=Blue,freq = freq, add=TRUE)
legend(60, 0.03, c("Good","Bad")  ,pch=15, pt.cex = 2, col=c(blue, red))

Probabilidades Relativas

Probabilidades Relativas

Probabilidades Relativas

Continuación, Clasificador Bayesiano

Construcción del Clasificador Bayesiano

En este punto tal vez nos hemos dado cuenta de algunos problemas:

  1. Tener demasiadas features, (bins, divisiones de histogramas), puede ocasionar que tengamos muy pocos eventos en algunos bins.
  2. No todos los bins tienen la misma incertidumbre, dejando algunos con incertidumbres demasiado grandes.
  • Solución: Tomar pocos bins, asegurando que todos los bins tengan al menos cerca de 30 eventos. Para evitar el punto 2, podemos definir los tamaños de los bins de tal forma que tengan aprox. la misma cantidad de eventos.

Densidades con Pocos bins y numero de eventos similar

Densidades con Pocos bins y numero de eventos similar

Densidades con Pocos bins y numero de eventos similar

Probabilidades Relativas

Probabilidades Relativas

Probabilidades Relativas

Ahora sí, a construir el clasificador

bayesian_model <- function(v2,v4,v10){
  for (i in 1:(length(v2breaks)-1)){
    if (v2breaks[i] <= v2 & v2breaks[i+1] > v2 ) {
       lv2 <- (bv2$density[i]/(gv2$density[i]))
    }
  }
  for (i in 1:(length(v4breaks)-1)){
    if (v4breaks[i] <= v4 & v4breaks[i+1] > v4 ) {
      lv4 <- (bv4$density[i]/(gv4$density[i]))
    }
  }
  for (i in 1:(length(v10breaks)-1)){
    if (v10breaks[i] <= v10 & v10breaks[i+1] > v10 ) {
      lv10 <- (bv10$density[i]/(gv10$density[i]))
    }
  }
  likelihood <- log(lv2*lv4*lv10)
  return(likelihood)
}

Y, ¿cómo se ve?

¿Cómo se ve en términos de probabilidades relativas?

Histograma

Puntos importantes antes de finalizar.

  • Sólo se toman en cuenta los cocientes de las probabilidades que no están indetrminandas.
  • Es importante separar una parte muestra de la muestra para entrenamiento (construir el modelo), y otra para poner a prueba el modelo.
  • Falta cambiar las proporciones de Buenos y Malos a las proporciones reales, que son 70% y 30% respectivamente.

Cambiemos todo a las Frecuencias reales:

Pureza

Eficiencia

Tarea:

  • Para el viernes:
    • Agregar una una variable al modelo Bayesiano.
    • Calcular y graficar la distribución de densidad del nuevo modelo Bayesiano, (para la muestra de prueba).
    • Calcular y graficar el histograma del modelo.
    • Calcular la Pureza y la Eficacia del Modelo.
  • Quiz del Martes: Teorema de Bayes, Histogramas, Densidades.