La clasificación supervisada es una de las tares que más frecuentemente son llevadas a cabo por los denominados Sistemas Inteligentes. Por lo tanto, un gran número de paradigmas desarrollados bien por la Estadística (Regresión Logística, Análisis Discriminante) o bien por la Inteligencia Artificial (Redes Neuronales, Inducción de Reglas, Árboles de Decisión, Redes Bayesianas) son capaces de realizar las tareas propias de la clasificación.
En el apartado anterior se han estudidado los métodos desarrollados por la estadística basados en el análisis de regresión: Regresión Logística y Probit, aquí estudiaremos otros métodos estadísticos como lo son, el Análisis Discriminantes y los K vecinos próximos, y los Arboles de Decisión, las Máquinas Soporte Vector, Redes Neuronales y el Clasificador Bayesiano desarrollados por la Inteligencia Artificial.
Paso previo a aplicar un método de clasificación, es la partición del conjunto de datos en dos conjuntos de datos más pequeños que serán utilizadas con los siguientes fines: entrenamiento y test . El subconjunto de datos de entrenamiento es utilizado para estimar los parámetros del modelo y el subconjunto de datos de test se emplea para comprobar el comportamiento del modelo estimado. Cada registro de la base de datos debe de aparecer en uno de los dos subconjuntos, y para dividir el conjunto de datos en ambos subconjuntos, se utiliza un procedimiento de muestreo: muestreo aleatorio simple o muestreo estratificado. Lo ideal es entrenar el modelo con un conjunto de datos independiente de los datos con los que realizamos el test.
Como resultado de aplicar un método de clasificación, se cometerán dos errores, en el caso de una variable binaria que toma valores 0 y 1, habrá ceros que se clasifiquen incorrectamente como unos y unos que se clasifiquen incorrectamente como ceros. A partir de este recuento se puede construir el siguiente cuadro de clasificación:
Valor real \(Y_i\) Valor estimado \(\hat Y_i\) | \(Y_i=0\) | \(Y_i=1\) |
---|---|---|
\(\hat Y_i=0\) | \(P_{11}\) | \(P_{12}\) |
\(\hat Y_i=1\) | \(P_{21}\) | \(P_{22}\) |
Donde \(P_{11}\) y \(P_{22}\) corresponderán a predicciones correctas (valores 0 bien predichos en el primer caso y valores 1 bien predichos en el segundo caso), mientras que \(P_{12}\) y \(P_{21}\) corresponderán a predicciones erróneas (valores 1 mal predichos en el primer caso y valores 0 mal predichos en el segundo caso). A partir de estos valores se pueden definir los índices que aparecen en el siguiente cuadro:
Indice | Definición | Expresión |
---|---|---|
Tasa de aciertos | Cociente entre las predicciones correctas y el total de predicciones | \(\frac {P_{11}+P_{22}}{P_{11}+P_{12}+P_{21}+P_{22}}\) |
Tasa de errores | Cociente entre las predicciones incorrectas y el total de predicciones | \(\frac {P_{12}+P_{21}}{P_{11}+P_{12}+P_{21}+P_{22}}\) |
Especificidad | Proporción entre la frecuencia valores cero correctos y el total de valores cero observados | \(\frac {P_{11}}{P_{11}+P_{21}}\) |
Sensibilidad | Proporción entre la frecuencia de valores uno correctos y el total de valores uno observados | \(\frac {P_{22}}{P_{12}+P_{22}}\) |
Tasa de falsos ceros | Proporción entre la frecuencia de valores cero incorrectos y el total de valores cero observados | \(\frac {P_{21}}{P_{11}+P_{21}}\) |
Tasa de falsos unos | Proporción entre la frecuencia de valores uno incorrectos y el total de valores uno observados | \(\frac {P_{12}}{P_{12}+P_{22}}\) |
Un método para evaluar clasificadores alternativo a la métrica expuesta es la curva ROC (Receiver Operating Characteristic). La curva ROC es una representación gráfica del rendimiento del clasificador que muestra la distribución de las fracciones de verdaderos positivos y de falsos positivos. La fracción de verdaderos positivos se conoce como sensibilidad, sería la probabilidad de clasificar correctamente a un individuo cuyo estado real sea definido como positivo. La especificidad es la probabilidad de clasificar correctamente a un individuo cuyo estado real sea clasificado como negativo. Esto es igual a restar uno de la fracción de falsos positivos.
La curva ROC también es conocida como la representación de sensibilidad frente a (1-especificidad). Cada resultado de predicción representa un punto en el espacio ROC. El mejor método posible de predicción se situaría en un punto en la esquina superior izquierda, o coordenada (0,1) del espacio ROC, representando un 100% de sensibilidad (ningún falso negativo) y un 100% también de especificidad (ningún falso positivo). Una clasificación totalmente aleatoria daría un punto a lo largo de la línea diagonal, que se llama también línea de no-discriminación. En definitiva, se considera un modelo inútil, cuando la curva ROC recorre la diagonal positiva del gráfico. En tanto que en un test perfecto, la curva ROC recorre los bordes izquierdo y superior del gráfico. La curva ROC permite comparar modelos a través del área bajo su curva.
Curva ROC
En R existe una librería que ayuda a la representación de la curva ROC, el R-package ROCR.
library(ROCR)
## Loading required package: gplots
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
data(ROCR.simple)
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
abline(a=0, b= 1)
La validación cruzada o cross-validation es una técnica utilizada para evaluar los resultados de un análisis estadístico y garantizar que son independientes de la partición entre datos de entrenamiento y prueba. Consiste en repetir y calcular la media aritmética obtenida de las medidas de evaluación sobre diferentes particiones. Se utiliza en entornos donde el objetivo principal es la predicción y se quiere estimar cómo de preciso es un modelo que se llevará a cabo a la práctica.
Suponemos que tenemos un modelo con uno o más parámetros de ajuste desconocidos y unos datos de entrenamiento que queremos analizar. El proceso de ajuste optimiza los parámetros del modelo para que éste se ajuste a los datos de entrenamiento tan bien como pueda. Si tomamos una muestra independiente como dato de prueba (validación), del mismo grupo que los datos de entrenamiento, normalmente el modelo no se ajustará a los datos de prueba igual de bien que a los datos de entrenamiento. Esto se denomina sobreajuste y acostumbra a pasar cuando el tamaño de los datos de entrenamiento es pequeño o cuando el número de parámetros del modelo es grande.
Validación cruzada(De Joan.domenech91 - Trabajo propio, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=17617674)
Las maneras más habituales de realizar la validación cruzada son:
Validación cruzada dejando k interaciones (De Joan.domenech91 - Trabajo propio, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=17616792)
Validación cruzada aleatoria (De Joan.domenech91 - Trabajo propio, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=17616794)
Validación cruzada aleatoria (De Joan.domenech91 - Trabajo propio, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=17616792)
El Análisis Discriminante (AD), introducido por Fisher (1936), es una técnica que se utiliza para predecir la pertenencia a un grupo (variable dependiente) a partir de un conjunto de predictores (variables independientes). El objetivo del AD es entender las diferencias de los grupos y predecir la verosimilitud de que una persona o un objeto pertenezca a una clase o grupo basándose en los valores que toma en los predictores. Ejemplos de análisis discriminante son distinguir entre innovadores y no innovadores de acuerdo a sus perfiles demográficos y sociales o el riesgo de impago de un préstamo a través de predictores económicos y sociodemográficos.
El análisis discriminante es conceptualmente muy similar al análisis de varianza multivariante de un factor. El AD trata de establecer una relación entre una variable dependiente no métrica (dicotómica o multidicotómica) y un conjunto de variables independientes métricas:
\[ Y_{1i}=X_{1i}+X_{2i}+...+X_{pi}\]
El propósito del AD consiste en aprovechar la información contenida en las variables independientes para crear una función Z combinación lineal de las p explicativas, capaz de diferenciar lo más posible a los k grupos. La combinación lineal para el análisis discriminante, función discriminante, se formula:
\[ Z_{jk}= \beta_0 + \beta_1 X_{1k} + \beta_2X_{2k}+...+ \beta_pX_{pk}\]
donde,
\(Z_{jk}\) es la puntuación \(Z\) discriminante \(j\) para el objeto \(k\).
\(\beta_0\) es el término constante.
\(\beta_i\) es la ponderación discriminante para la variable independiente \(i\).
\(X_{ik}\) es la variable independiente \(i\) para el objeto \(k\).
Una vez hallada la función discriminante, el resultado es una única puntuación Z discriminante compuesta para cada individuo en el análisis. Promediando las puntuaciones discriminantes para todos los individuos dentro de un grupo particular, obtenemos la media del grupo. Esta media es conocida como centroide. Cuando el análisis se realiza con dos grupos tenemos dos centroides, si es con tres serían tres los centroides, con k objetos tendremos k centroides.
En el caso de dos grupos y dos predictores o variables explicativas, la función discriminante es de la forma:
\[ Z_{jk}= \beta_0 + \beta_1 X_{1k} + \beta_2X_{2k}\]
Sustituyendo en la función discriminante el valor de las medias del grupo 1 en las variables \(X_1\) y \(X_2\), obtenemos el centroide del grupo 1:
\[ \bar Z_{1}= \beta_0 + \beta_1 \bar X_{11} + \beta_2 \bar X_{21}\]
De igual modo, sustituyendo las medias del grupo 2, obtenemos el centroide del grupo 2:
\[ \bar Z_{2}= \beta_0 + \beta_1 \bar X_{12} + \beta_2 \bar X_{22}\]
La función \(Z\) debe ser tal que la distancia entre los dos centroides sea máxima, consiguiendo de esta forma que los grupos estén lo más distantes posible. Podemos expresar esta distancia de la siguiente manera:
\[h= \bar Z_{1}-\bar Z_{2}\]
Es importante señalar que los grupos deben diferenciarse de antemano en las variables independientes. El análisis busca diferenciar los dos grupos al máximo combinando las variables independientes pero si los grupos no difieren en las variables independientes, no podrá encontrar una dimensión en la que los grupos difieran (Figura 5.1) .
Analisis Discriminante
Dicho de otro modo, si el solapamiento entre los casos de ambos grupos es excesivo, los centroides se encontrarán en la misma o parecida ubicación en el espacio p-dimensional y en esas condiciones, no será posible encontrar una función discriminante útil para la clasificación. Si los centroides están muy próximos, las medias de los grupos en la función discriminante serán tan parecidas que no será posible distinguir a los sujetos de uno y otro grupo.
La mayor utilidad de una función discriminante radica en su capacidad para clasificar nuevos casos. Ahora bien, la clasificación de casos es algo muy distinto de la estimación de la función discriminante. De hecho, una función perfectamente estimada puede tener una pobre capacidad clasificatoria.
Una vez obtenida la función discriminate podemos utilizarla, en primer lugar, para efectuar una clasificación de los mismos casos utilizados para obtener la función: esto permitirá comprobar el grado de eficacia la función desde el punto de vista de la clasificación. Si los resultados son satisfactorios, la función discriminante podrá utilizarse, en segundo lugar, para clasificar futuros casos de los que, conociendo su puntuación en las variables independientes, se desconozca el grupo al que pertenecen.
Una manera de clasificar los casos consiste en calcular la distancia existente entre los centroides de ambos grupos y situar un punto de corte \(z_0=\frac{\bar Z_{1}+\bar Z_{2}}{2}\) equidistante de ambos centroides. A partir de ese momento, los casos cuyas puntuaciones discriminantes sean mayores que el punto de corte,\(z_0\) serán asignados al grupo superior y los casos cuyas puntuaciones discriminantes sean menores que el punto de corte, \(z_0\), serán asignados al grupo inferior.
La regla de clasificación descrita sólo permite distinguir entre dos grupos, con lo que es difícilmente aplicable al caso de más de dos grupos e incluso a dos grupos con distinto tamaño, con tamaños desiguales es preferible utilizar una regla de clasificación que desplace el punto de corte hacia el centroide del grupo de menor tamaño buscando igualar los errores de clasificación. Para calcular este punto de corte se utiliza una distancia ponderada:
\(z_0=\frac{n_1\bar Z_{1}+n_2\bar Z_{2}}{n_1+n_2}\)
El AD solo admite variables cuantitativas como regresores, por lo que si alguna de las variables independientes es categórica, hay que utilizar otros métodos alternativos de clasificación.
La función R que realiza el Análisis Discriminante Lineal es “lda”. Para los 5 primeros datos, se dan los resultados de la clasificación (class), las probabilidades posteriores de pertenecer a la clase cero (posterior.0) o de pertenecer a la clase 1 (posterior.1), la probabilidad posterior es la probabilidad condicional que es asignada después de que la evidencia es tomada en cuenta.
Con la base de datos de R, Aid2, que contiene datos acerca de pacientes con sida,realizaremos un ejercicio de clasifición con AD, y evaluaremos los resultados con una métrica de porcentaje de aciertos y la curva ROC.
library(MASS)
data("Aids2")
str(Aids2)
## 'data.frame': 2843 obs. of 7 variables:
## $ state : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
## $ diag : int 10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
## $ death : int 11081 11096 9983 9654 10290 10344 11135 11069 10956 10873 ...
## $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2 ...
## $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2 ...
## $ age : int 35 53 42 44 39 36 36 31 26 27 ...
# Lineal Discriminat Analisys
ad=lda(status~diag+age,data=Aids2)
#predicción
probs=predict(ad,newdata=Aids2,type="prob")
data.frame(probs)[1:5,]
## class posterior.A posterior.D LD1
## 1 A 0.54097063 0.4590294 -0.6423339
## 2 A 0.53868200 0.4613180 -0.6355380
## 3 D 0.03063147 0.9693685 2.0271192
## 4 D 0.03154984 0.9684502 2.0046295
## 5 D 0.09943774 0.9005623 1.1042254
table(probs$class,Aids2$status)
##
## A D
## A 794 332
## D 288 1429
mean(probs$class==Aids2$status) #porcentaje de bien clasificados
## [1] 0.7819205
# Curva ROC
library(ROCR)
pred <- prediction(probs$posterior[,2],Aids2$status)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
abline(a=0, b= 1)
Para realizar este ejercicio vamos a realizar una mineria de datos, dividiendo la base de datos en una muestra de entrenamiento y otra de test, la muestra de entrenamiento incluirá el 70% de las observaciones de la base de datos.
library(MASS)
data(iris)
attach(iris)
# división de la muestra en entrenamiento y validación
train=sample(seq(length(iris$Species)),length(iris$Species)*0.70,replace=FALSE)
# Lineal Discriminat Analisys
lda.tr=lda(Species[train]~.,data=iris[train,])
#predicción
probs=predict(lda.tr,newdata=iris[-train,],type="prob")
data.frame(probs)[1:5,]
## class posterior.setosa posterior.versicolor posterior.virginica
## 2 virginica 0.3318547 0.2876032 0.3805421
## 8 setosa 0.4450826 0.3419294 0.2129879
## 9 setosa 0.3968617 0.2806124 0.3225259
## 12 setosa 0.4994710 0.3264726 0.1740564
## 13 setosa 0.3805789 0.2678757 0.3515454
## x.LD1 x.LD2
## 2 -0.43143962 1.0199195
## 8 0.61805483 0.9689741
## 9 -0.09327434 1.6327000
## 12 0.94204753 1.4283630
## 13 -0.25777472 1.7302975
table(probs$class,iris$Species[-train])
##
## setosa versicolor virginica
## setosa 12 1 0
## versicolor 1 5 9
## virginica 3 7 7
mean(probs$class==iris$Species[-train]) #porcentaje de bien clasificados
## [1] 0.5333333
El método K-nn (K nearest neighbors Fix y Hodges, 1951) es un método de clasificación supervisada (Aprendizaje, estimación basada en un conjunto de entrenamiento y prototipos) que sirve para estimar la función de densidad \(F(x / C_j)\) de las predictoraa \(x\) por cada clase \(C_j\).
Este es un método de clasificación no paramétrico, que estima el valor de la función de densidad de probabilidad o directamente la probabilidad a posteriori de que un elemento \(x\) pertenezca a la clase \(C_j\) a partir de la información proporcionada por el conjunto de prototipos o ejemplos. En el proceso de aprendizaje no se hace ninguna suposición acerca de la distribución de las variables predictoras.
K-vecinos
En la figura nº 5.2 se ilustra el funcionamiento de este método de clasificación. En la figura se encuentran representadas 12 muestras pertenecientes a dos clases distintas: la Clase 1 está formada por 6 cuadrados de color azul y la Clase 2 formada por 6 círculos de color rojo. En este ejemplo, se han seleccionado tres vecinos, es decir, (k=3).
De los 3 vecinos más cercanos a la muestra \(x\), representada en la figura por un aspa, uno de ellos pertenece a la Clase 1 y los otros dos a la Clase 2. Por tanto, la regla 3-nn asignará la muestra a la Clase 2. Es importante señalar que si se hubiese utilizado como regla de clasificación k=1, la 1-nn, la muestra sería asignada a la Clase 1, pues el vecino más cercano de la muestra pertenece a la Clase 1.
Un ejemplo de entrenamiento,\(x_i\), es un vector en un espacio característico multidimensional, que está descrito en términos de atributos, y pertenecerá a una de las clases de la clasificación. Los valores de los atributos del i-esimo ejemplo se representan por el vector -dimensional:
\[x_i=(x_{1i},x_{2i},...,x_{pi}) \epsilon X\]
El espacio es particionado en regiones por localizaciones y etiquetas de clases de los ejemplos de entrenamiento. Un punto en el espacio es asignado a la clase si esta es la clase más frecuente entre los k ejemplos de entrenamiento más cercano. Generalmente se usa la distancia euclidiana.
\[ d(x_i,x_j)=\sqrt{\sum_{r=1}^p(x_{ri}-x_{rj})^2} \]
La fase de entrenamiento del algoritmo consiste en almacenar los vectores característicos y las etiquetas de las clases de los ejemplos de entrenamiento. En la fase de test, la evaluación del ejemplo (del que no se conoce su clase) es representada por un vector en el espacio característico. Se calcula la distancia entre los vectores almacenados y el nuevo vector, y se seleccionan los k ejemplos más cercanos. El nuevo ejemplo es clasificado con la clase que más se repite en los vectores seleccionados.
El método k-nn supone que los vecinos más cercanos nos dan la mejor clasificación y esto se hace utilizando todos los atributos; el problema de dicha suposición es que es posible que se tengan muchos atributos irrelevantes que dominen sobre la clasificación, de manera que los atributos relevantes perderían peso entre otros veinte irrelevantes.
La mejor elección de k depende fundamentalmente de los datos; generalmente, valores grandes de k reducen el efecto de ruido en la clasificación, pero crean límites entre clases parecidas. Un buen k puede ser seleccionado mediante un procedimiento de optimización. El caso especial en que la clase es predicha para ser la clase más cercana al ejemplo de entrenamiento (cuando k=1) es llamada Nearest Neighbor Algorithm, Algoritmo del vecino más cercano.
Con la base de datos de R, Aid2, vamos a realizar una minería de datos, dividiendo la encuesta en dos muestras una de entrenamiento con el 70% de los datos y una muestra test con el 30% restante, se va a realizar el proceso con el primer vecino próximo k=1 (Nearest Neighbor Algorithm), para ello hay que instalar el package-R class, e invocar la función knn, dentro de esta librería la función knn permite elegir el numero de vecinos a aproximar, en está función todas las covariables han de ser numéricas, por este motivo seleccionamos en un “data.frame”" las variables numéricas de la base de datos. Evaluaremos los resultados con una métrica de porcentaje de aciertos.
library(class)
# Selección de variables
x=data.frame(Aids2[,3],Aids2[,7])
str(x)
## 'data.frame': 2843 obs. of 2 variables:
## $ Aids2...3.: int 10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
## $ Aids2...7.: int 35 53 42 44 39 36 36 31 26 27 ...
# Selección muestra entrenamiento
train=sample(seq(length(Aids2$status)),length(Aids2$status)*0.70,replace=FALSE)
# K-Nearest Neighbors
knn.prd=knn(x[train,],x[-train,],Aids2$status[train],k=3,prob=TRUE)
table(knn.prd,Aids2$status[-train])
##
## knn.prd A D
## A 215 103
## D 121 414
mean(knn.prd==Aids2$status[-train]) #porcentaje de bien clasificados
## [1] 0.7373974
# Validación cruzada con la muestra de entrenamiento
knn.cross=knn.cv(x[train,],Aids2$status[train],k=3,prob=TRUE)
table(knn.cross,Aids2$status[train])
##
## knn.cross A D
## A 470 227
## D 276 1017
Los árboles de decisión o clasificación tampoco son modelos estadísticos basados en la estimación de los parámetros de la ecuación propuesta, por tanto, no tenemos que estimar un modelo estadístico formal, son algoritmos para clasificar utilizando particiones sucesivas. Son apropiados cuando hay un número elevado de datos, siendo una de sus ventajas su carácter descriptivo que permite entender e interpretar fácilmente las decisiones tomadas por el modelo, revelando formas complejas en la estructura de datos que no se pueden detectar con los métodos convencionales de regresión.
Los árboles de decisión o de clasificación son un modelo surgido en el ámbito del aprendizaje automático (Machine Learning) y de la Inteligencia Artificial que partiendo de una base de datos, crea diagramas de construcciones lógicas que nos ayudan a resolver problemas. A esta técnica también se la denomina segmentación jerárquica. Es una técnica explicativa y descomposicional que utiliza un proceso de división secuencial, iterativo y descendente que partiendo de una variable dependiente, forma grupos homogéneos definidos específicamente mediante combinaciones de variables independientes en las que se incluyen la totalidad de los casos recogidos en la muestra.
Suponemos que se dispone de una muestra de entrenamiento que incluye la información del grupo al que pertenece cada caso y que sirve para construir el criterio de clasificación. Se comienza con un nodo inicial, dividiendo la variable dependiente a partir de una partición de una variable independendiente que se escoge de modo tal que de lugar a dos conjuntos homogeneos de datos (que maximizan la reducción en la impureza). Se elige, por ejemplo, la variable \(x_1\) y se determina un punto de corte, por ejemplo \(c\), de modo que se puedan separar los datos en dos conjuntos: aquellos con \(x_1 \leq c\) y los que tienen \(x_1 > c\). De este nodo inicial saldrán ahora dos: uno al que llegan las observaciones con \(x_1 \leq c\) y otro al que llegan las observaciones con \(x_1 > c\). En cada uno de estos nodos se vuelve a repetir el proceso de seleccionar una variable y un punto de corte para dividir la muestra. El proceso termina cuando se hayan clasificado todas las observaciones correctamente en su grupo.
En los árboles de decisión se encuentran los siguientes componentes: nodos, ramas y hojas. Los nodos son las variables de entrada, las ramas representan los posibles valores de las variables de entrada y las hojas son los posibles valores de la variable de salida. Como primer elemento de un árbol de decisión tenemos el nodo raíz que va a representar la variable de mayor relevancia en el proceso de clasificación. Todos los algoritmos de aprendizaje de los árboles de decisión obtienen modelos más o menos complejos y consistentes respecto a la evidencia, pero si los datos contienen incoherencias, el modelo se ajustará a estas incoherencias y perjudicará su comportamiento global en la predicción, es lo que se conoce como sobreajuste. Para solucionar este problema hay que limitar el crecimiento del árbol modificando los algoritmos de aprendizaje para conseguir modelos más generales. Es lo que se conoce como poda en los árboles de decisión.
Arboles de decisión
Las reglas de parada tratan de preguntar si merece la pena seguir o detener el proceso de crecimiento del árbol por la rama actual, se denominan reglas de prepoda ya que reducen el crecimiento y complejidad del árbol mientras se está construyendo:
Pureza de nodo. Si el nodo solo contiene ejemplos o registros de una única clase se decide que la construcción del árbol ya ha finalizado.
Cota de profundidad. Previamente a la construcción se fija una cota que nos marque la profundidad del árbol, cuando se alcanza se detiene el proceso.
Umbral de soporte. Se especifica un número de ejemplos mínimo para los nodos, y cuando se encuentre un nodo con ejemplos por debajo del mínimo se para el proceso, ya que no consideramos fiable una clasificación abalada con menos de ese número mínimo de ejemplos.
Existen dos formas de poda muy comunes utilizadas en los diferentes algoritmos: la poda por coste-complejidad y la poda pesimista. En la poda por coste-complejidad se trata de equilibrar la precisión y el tamaño del árbol. La complejidad está determinada por el número de hojas que posee el árbol (nodos terminales). La poda pesimista utiliza los casos clasificados incorrectamente y obtiene un error de sustitución, eliminando los subárboles que no mejoran significativamente la precisión del clasificador.
Con la base de datos de R, iris, vamos a realizar una minería de datos, dividiendo la encuesta en dos muestras una de entrenamiento con el 70% de los datos y una muestra test con el 30% restante, se va ha realizar la clasificación utilizando arboles de decisión, para ello hay que instalar el package-R: “tree”, e invocar la función tree. Se realiza una poda por el procedimiento de coste-complejidad, y mediante un procedimiento de validación cruzada elegirá el mejor resultado. Para ello hay que invocar la función cv.tree con la opción FUN=prune.misclas. Evaluaremos los resultados con una métrica de porcentaje de aciertos. La salida ofrece la tasa de errores (Misclassification error rate).
library(tree)
# Selección muestra entrenamiento
train=sample(seq(length(iris$Species)),length(iris$Species)*0.70,replace=FALSE)
iris.tree = tree(iris$Species~.,iris,subset=train)
summary(iris.tree)
##
## Classification tree:
## tree(formula = iris$Species ~ ., data = iris, subset = train)
## Variables actually used in tree construction:
## [1] "Petal.Length" "Petal.Width" "Sepal.Length"
## Number of terminal nodes: 6
## Residual mean deviance: 0.136 = 13.46 / 99
## Misclassification error rate: 0.0381 = 4 / 105
plot(iris.tree);text(iris.tree,pretty=0)
iris.tree
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 105 229.30 versicolor ( 0.33333 0.38095 0.28571 )
## 2) Petal.Length < 2.45 35 0.00 setosa ( 1.00000 0.00000 0.00000 ) *
## 3) Petal.Length > 2.45 70 95.61 versicolor ( 0.00000 0.57143 0.42857 )
## 6) Petal.Length < 4.95 40 15.88 versicolor ( 0.00000 0.95000 0.05000 )
## 12) Petal.Width < 1.45 28 0.00 versicolor ( 0.00000 1.00000 0.00000 ) *
## 13) Petal.Width > 1.45 12 10.81 versicolor ( 0.00000 0.83333 0.16667 )
## 26) Sepal.Length < 5.95 5 6.73 versicolor ( 0.00000 0.60000 0.40000 ) *
## 27) Sepal.Length > 5.95 7 0.00 versicolor ( 0.00000 1.00000 0.00000 ) *
## 7) Petal.Length > 4.95 30 14.70 virginica ( 0.00000 0.06667 0.93333 )
## 14) Petal.Width < 1.75 5 6.73 virginica ( 0.00000 0.40000 0.60000 ) *
## 15) Petal.Width > 1.75 25 0.00 virginica ( 0.00000 0.00000 1.00000 ) *
tree.pred=predict(iris.tree,iris[-train],type="class")
summary(tree.pred)
## setosa versicolor virginica
## 50 54 46
with(iris[-train],table(tree.pred,Species))
## Species
## tree.pred setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 48 6
## virginica 0 2 44
# Mediante validación cruzada se busca el mejor arbol de decision
cv.iris=cv.tree(iris.tree,FUN=prune.misclass)
cv.iris
## $size
## [1] 6 3 2 1
##
## $dev
## [1] 7 8 30 70
##
## $k
## [1] -Inf 0 26 35
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
plot(cv.iris)
El mismo ejercicio realizado con la función C5.0 del package C50.
library(C50)
data(iris)
# Selección de una submuestra de 105 (el 70% de los datos)
set.seed(101)
iris.indices <- sample(1:nrow(iris),size=105)
iris.entrenamiento <- iris[iris.indices,]
iris.test <- iris[-iris.indices,]
modelo <- C5.0(Species~., data = iris.entrenamiento,rules=TRUE)
modelo
##
## Call:
## C5.0.formula(formula = Species ~ ., data = iris.entrenamiento, rules
## = TRUE)
##
## Rule-Based Model
## Number of samples: 105
## Number of predictors: 4
##
## Number of Rules: 4
##
## Non-standard options: attempt to group attributes
# predicción
prediccion <- predict(modelo,newdata=iris.test)
# Matriz de confusión
tabla <- table(prediccion, iris.test$Species)
tabla
##
## prediccion setosa versicolor virginica
## setosa 15 0 0
## versicolor 0 11 0
## virginica 0 1 18
# % correctamente clasificados
100 * sum(diag(tabla)) / sum(tabla)
## [1] 97.77778
La función, rpart, del package “rpart” tambien permite realizar arboles de decisión. Por defecto utiliza en metodo “Class”, que es el apropiado para estimar arboles de decisión. En la opción “control” encontramos parámetros opcionales para controlar el crecimiento del árbol. Por ejemplo, en control = rpart.control (minsplit = 30, cp = 0.001) se le indica que el número mínimo de observaciones en un nodo sea 30 antes de intentar una división y que una división debe pararse cuando el Coste factor de complejidad sea inferior a un 0.001.
En este caso utilizamos un ejemplo de niños que tienen problemas de espalda.
library(rpart)
fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
plot(fit)
text(fit, use.n = TRUE)
Realizar el ejercicio con la base de datos Aids2
Las Máquinas de Soporte Vectorial (Support Vector Machines SVMs) son un conjunto de algoritmos de aprendizaje supervisados que desarrollan métodos relacionados con los problemas de clasificación y regresión.
Como en la mayoría de los métodos de clasificación supervisada, los datos de entrada (los puntos) son vistos como un vector p-dimensional (una lista de p números). Dado un conjunto de puntos como un subconjunto de un conjunto mayor (espacio), en el que cada uno de ellos pertenece a una de dos posibles categorías, de manera que un algoritmo basado en SVM construye un modelo capaz de predecir si un punto nuevo (cuya categoría desconocemos) pertenece a una categoría o a la otra.
La SVM, intuitivamente, es un modelo que partiendo de un conjunto de ejemplos de entrenamiento, podemos etiquetarlos en diferentes clases y representar dichas muestras en puntos en el espacio para tratar de separar las diferentes clases mediante un espacio lo más amplio posible, para que cuando las nuevas muestras de los casos de test se pongan en correspondencia con dicho modelo puedan ser clasificadas correctamente en función de su proximidad.
En ese concepto de “separación óptima” es donde reside la característica fundamental de las SVM: este tipo de algoritmos buscan el hiperplano que tenga la máxima distancia (margen) con los puntos que estén más cerca de él mismo. Por eso también a veces se les conoce a las SVM como clasificadores de margen máximo. De esta forma, los puntos del vector que son etiquetados con una categoría estarán a un lado del hiperplano y los casos que se encuentren en la otra categoría estarán al otro lado.
La manera más simple de realizar la separación es mediante una línea recta, un plano recto o un hiperplano N-dimensional, pero los universos a clasificar no se suelen presentar en el ideal de las dos dimensiones como ocurre en el ejemplo gráfico, sino que un algoritmo SVM debe tratar con más de dos variables predictoras, curvas no lineales de separación, casos donde los conjuntos de datos no pueden ser completamente separados, clasificaciones en más de dos categorías. La representación por medio de funciones núcleo ó Kernel ofrece una solución a este problema, proyectando la información a un espacio de características de mayor dimensión el cual aumenta la capacidad computacional de la máquinas de aprendizaje lineal.
En la figura siguiente se presenta una programación R en donde SVM traza un hiperplano para clasificar la categoría de sertosa de la base de datos iris. Para ello hay que instalar el package-R: “e1017”, e invocar la función svm. Se estima un modelo con un lineal y un Kernel de base lineal (la función permite además funciones base polinomiales y sigmoides).
library("e1071")
library("rgl")
train <- iris
train$y <-ifelse(train[,5]=="setosa", 1, -1)
sv <- svm(y~Petal.Length+Petal.Width+Sepal.Length,data=train,kernel="linear",scale=FALSE,type="C-classification")
W <- rowSums(sapply(1:length(sv$coefs), function(i)sv$coefs[i]*sv$SV[i,]))
plot3d(train$Petal.Length, train$Petal.Width,train$Sepal.Length, col=ifelse(train$y==-1,"red","blue"),size = 2, type='s', alpha = .6)
rgl.planes(a = W[1], b=W[2], c=W[3],d=-sv$rho,color="gray", alpha=.4)
Clasificación de la clase Sertosa por SMV
Utilizamos la base de datos Aids, y realizamos un ejercicio de clasificación por svm, utilizando una muestra de entrenamiento y otra de test:
library(e1071)
# Selección de variables
datos=data.frame(Aids2[,-4])
str(datos)
## 'data.frame': 2843 obs. of 6 variables:
## $ state : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
## $ diag : int 10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
## $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2 ...
## $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2 ...
## $ age : int 35 53 42 44 39 36 36 31 26 27 ...
# Selección muestra entrenamiento
train=sample(seq(length(Aids2$status)),length(Aids2$status)*0.70,replace=FALSE)
# se estima un modelo svm lineal para la muestra de entrenamiento
svmfit=svm(datos$status~.,data=datos,kernel="linear",scale=FALSE,subset=train)
print(svmfit)
##
## Call:
## svm(formula = datos$status ~ ., data = datos, kernel = "linear",
## subset = train, scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
## gamma: 0.07142857
##
## Number of Support Vectors: 645
table(datos$status[train],svmfit$fitted)
##
## A D
## A 542 188
## D 261 999
# Predicción para la muestra test
svm.pred=predict(svmfit,datos[-train,])
summary(svm.pred)
## A D
## 375 478
with(datos[-train,],table(svm.pred,status))
## status
## svm.pred A D
## A 268 107
## D 84 394
# se estima un modelo svm lineal para la muestra de entrenamiento y se predice la muestra de test
svmfit2=svm(datos$status~.,data=datos,kernel="radial",scale=FALSE,subset=train,probability=TRUE)
print(svmfit2)
##
## Call:
## svm(formula = datos$status ~ ., data = datos, kernel = "radial",
## probability = TRUE, subset = train, scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 1
## gamma: 0.07142857
##
## Number of Support Vectors: 1913
svm.pred=predict(svmfit2,datos[-train,],probability=TRUE)
summary(svm.pred)
## A D
## 191 662
with(datos[-train,],table(svm.pred,status))
## status
## svm.pred A D
## A 145 46
## D 207 455
Una Red Neuronal Artificial (RNA) es un modelo matemático inspirado en el comportamiento biológico de las neuronas y en cómo se organizan formando la estructura del cerebro. Las redes neuronales intentan aprender mediante ensayos repetidos como organizarse mejor a si mismas para conseguir maximizar la predicción.
El primer modelo matemático de una neurona artificial, creado con el fin de llevar a cabo tareas simples, fue presentado en el año 1943 en un trabajo conjunto entre el psiquiatra y neuroanatomista Warren McCulloch y el matemático Walter Pitts. Un modelo de red neuronal se compone de nodos, que actúan como input, output o procesadores intermedios. Cada nodo se conecta con el siguiente conjunto de nodos mediante una serie de trayectorias ponderadas. Basado en un paradigma de aprendizaje, el modelo toma el primer caso, y toma inicial basada en las ponderaciones. Se evalúa el error de predicción y modifica las ponderaciones para mejorar la predicción, a continuación se evalúa el siguiente caso con las nuevas ponderaciones y se modifican para mejorar la predicción de los casos ya evaluados, el ciclo se repite para cada caso en lo que se denomina la fase de preparación o evaluación. Cuandos se ha calibrado el modelo, con la muesta test se evalúan los resultados globales.
Las redes neuronales se hicieron operativas por primera vez a finales de los 50. Rosenblat F. (1958) creó el perceptrón , un algoritmo de reconocimiento de patrones basado en una red de aprendizaje de computadora de dos capas usando una simple suma y la resta. A finales de los 60 el proceso de investigación sufrío un estancamiento, y ha sido a partir de los años 80 del siglo pasado, cuando se produjo el mayor desarrollo teórico. Son muchos los modelos de redes neuronales, el más utilizado es el algoritmo backpropagation fue creado por Werbos P. (1990).
Un ejemplo de modelo neuronal con \(n\) entradas, consta de:
Las entradas son el estímulo que la neurona artificial recibe del entorno que la rodea, y la salida es la respuesta a tal estímulo. La neurona puede adaptarse al medio circundante y aprender de él modificando el valor de sus pesos sinápticos, y por ello son conocidos como los parámetros libres del modelo, ya que pueden ser modificados y adaptados para realizar una tarea determinada.
En este modelo, la salida neuronal \(Y\) está dada por:
\(Y=f(\sum_{i=1}^{n}w_ix_i)\)
La función de activación se elige de acuerdo a la tarea realizada por la neurona. Entre las más comunes dentro del campo de las RNAs podemos destacar:
Funciones de Activación
Si qereemos un modelo de red neuronal para realizar tareas de clasificación en el plano (por lo que solo haremos uso de dos entradas, \(x_1\) y \(x_2\)). Para ello, vamos a considerar que existe una entrada de peso 1, llamada \(b\) y consideraremos como función de activación a la función signo definida por:
\(\Gamma(s) = \left\{ \begin{array}{cl} 1 & \mbox{si } s \geq 0 \\ -1 & \mbox{si } s < 0 \end{array} \right.\)
Por lo tanto, la salida neuronal \(Y\) estará dada en este caso por:
\(Y =\left\{ \begin{array}{cl} 1 & \mbox{si } w_1 x_1 + w_2 x_2 + b \geq 0 \\ -1 & \mbox{si } w_1 x_1 + w_2 x_2 + b < 0 \end{array} \right.\)
Supongamos que tenemos dos clases en el plano: la clase \(C_1\), formada por los círculos rojos, y la clase \(C_2\), formada por los círculos azules, donde cada elemento de estas clases está representado por un punto (x,y) en el plano. Supondremos además que tales clases son separables linealmente, es decir, es posible trazar una recta que separe estrictamente ambas clases.
Red Neuronal
Diremos que la neurona artificial clasifica correctamente las clases \(C_1\) y \(C_2\) si dados los pesos sinápticos \(w_1\) y \(w_2\) y el término aditivo \(b\), la recta con ecuación:
\(y = −\frac{w_1}{w_2} x − \frac{b}{w_2}\)
es una recta que separa las dos clases. La ecuación implícita de la recta es \(w_1x + w_2y + b = 0\).Obsérvese que si el punto \((x_0,y_0) \in C_1\) entonces \(w_1x_0+ w_2y_0+ b < 0\) y si \((x_0,y_0) \in C_2\) entonces \(w_1x_0+ w_2y_0+ b > 0\) Por lo tanto, dado el par \((x_0,y_0) \in C_1\cup C_2\), la neurona clasifica de la siguiente manera:
\((x_0,y_0) \in C_1 \Leftrightarrow Y = −1\)
\((x_0,y_0) \in C_2 \Leftrightarrow Y = 1\)
Si ahora tomamos dos clases \(C^∗_1\) y \(C^∗_2\) (separables linealmente) distintas a las anteriores, entonces la neurona puede no clasificar correctamente a estas clases, pues la recta anterior puede no ser una recta válida para separarlas. Sin embargo, es posible modificar los parámetros anteriores y obtener nuevos parámetros \(w^∗_1\),\(w^∗_2\) y \(b^∗\) tal que la recta \(y = −\frac{w^*_1}{w^*_2} x − \frac{b^*}{w^*_2}\), sirva ahora de separación entre ellos.
El proceso por el cual la neurona pasa de los parámetros \(w_1\),\(w_2\),\(b\) a los parámetros \(w^∗_1\),\(w^∗_2\), \(b^∗\) se conoce como método de aprendizaje. Este proceso es el que permite modificar los parámetros libres con el fin de que la neurona se adapte y sea capaz de realizar diversas tareas.
El método de aprendizaje que detallaremos a continuación y que utilizaremos para adaptar los parámetros libres con el fin de clasificar correctamente las clases \(C^∗_1\) y \(C^∗_2\) se conoce como método de error-corrección. Para aplicarlo es necesario:
El entrenamiento consiste en lo siguiente:
\(w_1= w'_1+ d x_0\)
\(w_2= w'_2+ d y_0\)
\(b = b'+ d\)
donde el valor de \(d\) se obtiene de la siguiente manera:
\(d = =\left\{ \begin{array}{cl} 1 & \mbox{si } Y=-1 \mbox{ y } (x_0,y_0)\in C_2 \\ -1 & \mbox{si } Y=1 \mbox{ y } (X_0,y_0)\in C_1 \end{array} \right.\)
Si la neurona clasifica bien el punto \((x_0,y_0)\), entonces no se realiza ninguna corrección.
El procedimiento se repite pasando a la neurona otro punto del conjunto \(D\) y usando los últimos parámetros\(w_1\),\(w_2\), \(b\) corregidos (no los iniciales). Nuevamente, si la neurona clasifica mal el punto, entonces se aplica una corrección similar a la anterior.
Esta tarea se repite con todos los puntos del conjunto \(D\).
Si en el proceso hubo correcciones, entonces el procedimiento es repetido nuevamente con todos los puntos de \(D\).
El entrenamiento termina cuando la neurona clasifica correctamente todos los elementos del conjunto de entrenamiento.
Un modelo neuronal utilizado para clasificación, cuya salida está dada de la forma anterior y que utiliza el método de error-corrección para modificar sus parámetros libres se conoce como Perceptron (el nombre deriva de la palabra en inglés “perception”). Estas neuronas pueden agruparse formando una RNA conocida como Perceptron múltiple.
Mas detalles en: http://www.cs.us.es/~fsancho/?e=72
Vamos a realizar una ejercicio de clasificación binaria con un conjunto de datos sobre fertilidad despues de abortos inducidos o expontaneos, que se encuentran el la librería “datasets”, la red neuronal que se utiliza por defecto es “rprot+”, relativa al algoritmo “Resilient Backpropagation”, que actualiza los pesos considerando únicamente el signo del cambio, es decir, si el cambio del error es en aumento (+) o disminución (-) entre una iteración y otra. Para detalles ver: https://en.wikipedia.org/wiki/Rprop
Los algoritmos de red que permite esta función R son:‘backprop’, ‘rprop+’, ‘rprop-’, ‘sag’, or ‘slr’.
La función para el calculo de error es la de entropía cruzada, que utiliza la distancia Kullback-Leibler.
library(neuralnet)
##
## Attaching package: 'neuralnet'
## The following object is masked from 'package:ROCR':
##
## prediction
# Leemos los datos y hacemos dos conjuntos uno de entrenamiento y otro de test
data(infert, package="datasets")
str(infert)
## 'data.frame': 248 obs. of 8 variables:
## $ education : Factor w/ 3 levels "0-5yrs","6-11yrs",..: 1 1 1 1 2 2 2 2 2 2 ...
## $ age : num 26 42 39 34 35 36 23 32 21 28 ...
## $ parity : num 6 1 6 4 3 4 1 2 1 2 ...
## $ induced : num 1 1 2 2 1 2 0 0 0 0 ...
## $ case : num 1 1 1 1 1 1 1 1 1 1 ...
## $ spontaneous : num 2 0 0 0 1 1 0 0 1 0 ...
## $ stratum : int 1 2 3 4 5 6 7 8 9 10 ...
## $ pooled.stratum: num 3 1 4 2 32 36 6 22 5 19 ...
n <- nrow(infert)
muestra <- sample(n,n*.70)
train <- infert[muestra, ]
test <- infert[-muestra, ]
# Entrenamos la red neuronal
net.infert <- neuralnet(case~parity+induced+spontaneous, train,err.fct="ce", linear.output=FALSE,likelihood=TRUE)
plot(net.infert)
# Computamos la red neuronal
resultados <- compute(net.infert,data.frame(test[,3:4],spontaneus=test[,6]))$net.result
# recodificamos los resultados y evaluamos
test.result=ifelse(resultados>0.5,1,0)
table(test.result,test$case)
##
## test.result 0 1
## 0 38 14
## 1 5 18
Naïve Bayes es uno de los clasificadores más utilizados por su simplicidad y rapidez. Se trata de una técnica de clasificación y predicción supervisada que construye modelos que predicen la probabilidad de posibles resultados, en base al Teorema de Bayes, tambiéń conocido como teorema de la probalibidad condicionada:
\[P(A/B)=\frac{P(B/A)P(A)}{P(B)}\]
Un ejemplo nos servirá para entender la operativa de este clasificador. Supongamos un típico problema de clasificación en Minería de Datos, donde tenemos unos cuantos ejemplos que queremos clasificar. Cada ejemplo (también llamados instancias), se caracteriza por una serie de atributos. Además como estamos en clasificación supervisada, dichos ejemplos deben estar etiquetados, es decir, se debe conocer de qué clase son. Por tanto, tenemos un conjunto de 4 ejemplos con 3 atributos cada uno y 2 posibles clases.
Ejemplos | Atr. 1 | Atr. 2 | Atr. 3 | Clase |
---|---|---|---|---|
\(x_1\) | 1 | 2 | 1 | positiva |
\(x_2\) | 2 | 2 | 2 | positiva |
\(x_3\) | 1 | 1 | 2 | negativa |
\(x_4\) | 2 | 1 | 2 | negativa |
Fuente:
Caben destacar dos partes en el algoritmo. La primera es la construcción del modelo, y la segunda clasificar un nuevo ejemplo con dicho modelo:
PARTE 1: Crear el modelo.
Para ello se necesitan cuatro pasos:
Calcular las probabilidades a priori de cada clase.
Para cada clase, realizar un recuento de los valores de atributos que toma cada ejemplo. Se debe distribuir cada clase por separado para mayor comodidad y eficiencia del algoritmo.
Aplicar la Corrección de Laplace, para que los valores “cero” no den problemas.
Normalizar para obtener un rango de valores [0,1].
A continuación se detalla cada paso:
Paso 1: Hay varias formas de establecer la probabilidad a priori a cada clase. La más intuitiva es que todas ellas tengan la misma probabilidad, es decir, 1 divido entre el número de clases. Si contamos con la opinión de un experto, puede que éste nos proporciones dichas probabilidades.
En este caso, vamos a considerar cada clase equiprobable. Por tanto:
\(P(positivo) = 1/2 = 0,5\)
\(P(negativo) = 1/2 = 0,5\)
Paso 2: Se crea una tabla (un otro contenedor) para cada clase y se hace un recuento de valores:
positivo | valor 1 | valor 2 |
---|---|---|
atr.1 | 1 | 1 |
atr.2 | 0 | 2 |
atr.3 | 1 | 1 |
negativo | valor 1 | valor 2 |
---|---|---|
atr.1 | 1 | 1 |
atr.2 | 2 | 0 |
atr.3 | 0 | 2 |
Paso 3: Se suma una unidad a cada valor de la tabla anterior.
positivo | valor 1 | valor 2 |
---|---|---|
atr.1 | 2 | 2 |
atr.2 | 1 | 3 |
atr.3 | 2 | 2 |
negativo | valor 1 | valor 2 |
---|---|---|
atr.1 | 2 | 2 |
atr.2 | 3 | 1 |
atr.3 | 1 | 3 |
Paso 4: Se normalizan todos los valores de la tabla del siguiente modo. Cada celda se divide por la suma de los valores de la fila. Por ejemplo, el valor: “valor 1” del atributo: “atr. 2” se actualiza con: 1 / (1+3) = 0,25.
positivo | valor 1 | valor 2 |
---|---|---|
atr.1 | 0.5 | 0.5 |
atr.2 | 0.25 | 0.75 |
atr.3 | 0.5 | 0.5 |
negativo | valor 1 | valor 2 |
---|---|---|
atr.1 | 0.5 | 0.5 |
atr.2 | 0.75 | 0.25 |
atr.3 | 0.25 | 0.75 |
PARTE 2: Clasificar un nuevo ejemplo. Por ejemplo, \(x_5 = (1,1,1)\).
Para ello se necesitan dos pasos:
Para cada clase disponible, se determinan los valores de probabilidad de cada valor de los atributos del nuevo ejemplo.
Aplicar la fórmula de Naïve Bayes.
Si generalizamos el teorema de Bayes a \(n\) atributos, obtenemos la siguiente expresión:
\(P(A | b_1,b_2,...,b_n)=P(A) P(b_1| A) P(b_2| A),...,P(b_n | A) = P(A)P(b_j| A)\)
que resolvemos:
\(Solucion=argmax_{i=1}^n P(A) P(b_i| A)\)
A continuación se detalla cada paso:
Paso 1: En este caso, se para cada tabla escogemos los valores: 1 de cada atributo, es decir, la primera columna de cada tabla, ya que todos los valores del ejemplo \(x_5\) son: \(1\).
positivo | valor 1 | valor 2 |
---|---|---|
atr.1 | 0.5 | 0.5 |
atr.2 | 0.25 | 0.75 |
atr.3 | 0.5 | 0.5 |
negativo | valor 1 | valor 2 |
---|---|---|
atr.1 | 0.5 | 0.5 |
atr.2 | 0.75 | 0.25 |
atr.3 | 0.25 | 0.75 |
Paso 2: Se aplica la fórmula:
\(P(positivo | x_5 ) = 0,5 • ( 0,5 • 0,25 • 0,5 ) = 0,03125\) \(P( negativo | x_5 ) = 0,5 • ( 0,5 • 0,75 • 0,25 ) = 0,046875\) Como la clase más probable es “negativa”, clasificamos el nuevo ejemplo (\(x_5\)) como negativo.
Esta forma de clasificar, se denomina Tecnica de maximo a posteriori.
A continuación se presenta un ejemplo de clasificar clientes con el método Naive Bayes, para clasificar a los clientes según su probabilidad de compra (Si o No) y en base a determinados atributos personales(Estado Cvivil,Profesion, etc.).
El cálculo de la probabilidad de cada atributo y para cada cliente nuevo seria algo como:
La programación en R sería la siguiente:
library(e1071)
data(iris)
m <- naiveBayes(Species ~ ., data = iris)
## alternatively:
m <- naiveBayes(iris[,-5], iris[,5])
m
##
## Naive Bayes Classifier for Discrete Predictors
##
## Call:
## naiveBayes.default(x = iris[, -5], y = iris[, 5])
##
## A-priori probabilities:
## iris[, 5]
## setosa versicolor virginica
## 0.3333333333 0.3333333333 0.3333333333
##
## Conditional probabilities:
## Sepal.Length
## iris[, 5] [,1] [,2]
## setosa 5.006 0.3524896872
## versicolor 5.936 0.5161711471
## virginica 6.588 0.6358795933
##
## Sepal.Width
## iris[, 5] [,1] [,2]
## setosa 3.428 0.3790643691
## versicolor 2.770 0.3137983234
## virginica 2.974 0.3224966382
##
## Petal.Length
## iris[, 5] [,1] [,2]
## setosa 1.462 0.1736639965
## versicolor 4.260 0.4699109772
## virginica 5.552 0.5518946957
##
## Petal.Width
## iris[, 5] [,1] [,2]
## setosa 0.246 0.1053855894
## versicolor 1.326 0.1977526800
## virginica 2.026 0.2746500556
table(predict(m, iris), iris[,5])
##
## setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 47 3
## virginica 0 3 47
Recientemente en el área de la Inteligencia Artificial el concepto de combinación de clasificadores ha sido propuesto como una nueva dirección para mejorar el rendimiento de los clasificadores individuales. Estos clasificadores pueden estar basados en una variedad de metodologías de clasificación, y pueden alcanzar diferentes ratios de individuos bien clasificados. El objetivo de la combinación de clasificadores individuales es el ser más certeros, precisos y exactos. Los métodos multiclasificadores más conocidos son el Bagging (Breiman, 1966) y Boosting (Freund y Schapire, 1996).
El método propuesto por Breinan (1966) intenta aunar las características del Boostrapping y la agregación incorporando los beneficios de ambos (Boostrap AGGregatiNG). La operativa del método es la siguiente:
• Se generan muestras aleatorias que serán los conjuntos de entrenamiento. Las muestras se generan a través de un muestreo aleatorio con reemplazamiento.
• Cada subconjunto de entrenamiento aprende un modelo.
• Para clasificar un ejemplo se predice la clase de ese ejemplo para cada clasificador y se clasifica en la clase con mayor voto.
El método propuesto por Freund y Schapire (1996), está basado en la asignación de un peso a cada conjunto de entrenamiento. Cada vez que se itera se aprende un modelo que minimiza la suma de los pesos de aquellos ejemplos clasificados erróneamente. Los errores de cada iteración sirven para actualizar los pesos del conjunto de entrenamiento, incrementando el peso de los mal clasificados y reduciendo el peso de aquellos que han sido correctamente clasficados. La decisión final para un nuevo patrón de clasificación viene dada por la votación mayoritaria ponderada entre los diferentes conjuntos de entrenamiento.
El package R: “ipred” opera multiclasificadores por los métodos bagging y boosting.
Bagging (o Bootstrap Aggregating), consiste en crear diferentes modelos usando muestras aleatorias con reemplazo y luego combinar o ensamblar los resultados.
La técnica de Bagging sigue estos pasos:
Muestra uniforme (misma cantidad de individuos en cada set)
Muestras con reemplazo (los individuos pueden repetirse en el mismo set de datos).
El tamaño de la muestra es igual al tamaño del set de entrenamiento, pero no contiene a todos los individuos ya que algunos se repiten.
Si se usan muestras sin reemplazo, suele elegirse el 50% de los datos como tamaño de muestra
Luego se crea un modelo predictivo con cada set, obteniendo modelos diferentes
Luego se construye o ensambla un único modelo predictivo, que es el promedio de todos los modelos.
Red Neuronal Artificial Precio Vivienda
Sobre el Bagging hay que tener presente (http://apuntes-r.blogspot.com.es/search/label/Bagging):
• Disminuye la varianza de un data set al realizar remuestreo con reemplazo..
• Si no existe varianza en el data set, la tecnica de Baggin no mejora significativamente el modelo.
• Es recomendable en modelos de alta inestabilidad (data set con mucha varianza). Ejemplo de inestabilidad: el % de error de la predicción de fraudes de enero , es muy diferente al de febrero.
• Mientras más inestable es un modelo, mejor será la predicción al usar Bagging.
• Se reduce el overfetting o sobre entrenamiento de modelos. Esto porque los modelos no pueden sobreaprender o memorizar ya que ninguno tiene todos los datos de entrenamiento.
• Mejora la predicción, ya que lo que no detecta un modelo lo detectan los otros.
• Reduce el ruido de los outliers, ya los outliers no pueden estar presenten en todos los modelos.
• No mejora significativamente las funciones lineales, ya que el ensamble de una función lineal da como resultado otra función linear.
• Una técnica mejorada del Bagging es el Random Forest que ademas de elegir un grupo aleatorio de individuos, también elige un grupo aleatorio de variables.
• Los diferentes modelos creados con la técnica Bagging pueden considerarse como algoritmos que buscan respuestas (o hipótesis) en un data set (o espacio h). Como cada algoritmo tiene un set de datos diferentes, cada uno creará una hipótesis diferentes sobre la realidad.
Realizamos un bagging para un clasificador binario, utilizando un scrip obtendido en: http://apuntes-r.blogspot.com.es/2015/01/bagging-para-clasificador-binario.html#more
# Bagging para un clasificador binario
# -----------------------------------------------------------
# PASO 1. Carga de package y datos
suppressMessages(library(C50));data(churn); # para datos
suppressMessages(library(foreach)) # para la logica de bagging
library(rpart) # para algoritmo Arbol Decision
Train <- churnTrain[,1:20]
Test <- churnTest [,1:20]
Clase <- unique(churnTrain$churn)
Iteraciones <- 5 # Debe ser impar, para evitar el empate en el "Voto mayoritario"
#-----------------------------------------------------------
# PASO 2. Crea modelos y crea predicciones en columnas
Prediccion <- foreach(i=1:Iteraciones,.combine=cbind) %do% {
muestra <- sample(nrow(Train), size=floor((nrow(Train)*.7)))
modelo <- rpart(churn ~., data=Train[muestra,])
as.character(predict(modelo, Test, type="class"))
}
# -----------------------------------------------------------
# PASO 3. Evaluación del Voto Mayoritario
Prediccion <- as.data.frame(Prediccion)
Prediccion$Cantidad_yes <- rowSums(Prediccion [, 1:Iteraciones] == "yes")
Prediccion$Cantidad_no <- rowSums(Prediccion [, 1:Iteraciones] == "no")
Prediccion$Prediccion <- with(Prediccion,ifelse(Cantidad_yes>Cantidad_no,"yes","no"))
MC <- table(Test[, "churn"],Prediccion[,"Prediccion"])
Efectividad <- MC["yes","yes"]/(MC["yes","yes"]+MC["yes","no"])
print(MC)
##
## no yes
## yes 82 142
## no 1430 13
print(Efectividad)
## [1] 0.6339285714