Métodos de potenciación

Aprendizaje Supervisado vs Aprendizaje no supervisado.

La mayoría de problemas de aprendizaje estadístico pueden ser clasificados dos categorías: Aprendizaje Supervisado y Aprendizaje No Supervisado.

Aprendizaje supervisado.

Para cada observación de las variables predictoras \(x_i~;~i=1,..,n\) existe una variable respuesta \(y_i\). Se desea ajustar un modelo de datos que relacione la variable respuesta \(y_i\) con las variables predictoras.

  • Predicción: para futuras observaciones de individuos tratar de pronosticar con exactitud la respuesta.

  • Inferencia: comprender mejor la relación entre la respuesta y las predictoras.

Algunos ejemplos de métodos de solución de problemas asociados con aprendizaje supervisado:

  • Regresión lineal
  • Regresión polinómica.
  • Regresión Ridge.
  • Regresión Lasso.
  • Regresión logística.
  • Árboles de decisión.
  • Máquinas de soporte vectorial.
  • Random Forest.
  • K-Nearest Neighbors (KNN).
  • Naive Bayes. …

Aprendizaje no supervisado.

Para cada observación \(i=1,..., n\), se tiene un vector \(x_i\), sin embargo, no se tiene asociado una variable respuesta \(y_i\) que permita supervisar algún ajuste.

Cuando se utiliza aprendizaje no supervisado se puede tratar de entender las relaciones entre variables o las relaciones entre las observaciones. Una herramienta de aprendizaje estadístico que podemos utilizar en este contexto es el análisis de conglomerados, o clustering. El objetivo del análisis de conglomerados es determinar, a partir del análisis de x1, . , xn , si las observaciones pertenecen a grupos relativamente distintos. Por ejemplo, en un estudio de segmentación de mercado podríamos observar múltiples características (variables) de los clientes potenciales, como el código postal, los ingresos familiares y los hábitos de compra. Podríamos pensar que los clientes pertenecen a grupos diferentes, como los que gastan mucho o los que gastan poco. Si se dispusiera de información sobre los patrones de gasto de cada cliente, sería posible realizar un análisis supervisado. Sin embargo, esta información no está disponible, es decir, no sabemos si cada cliente potencial es un gran gastador o no. En este caso, podemos intentar agrupar a los clientes en función de las variables medidas, con el fin de identificar distintos grupos de clientes potenciales. La identificación de estos grupos puede ser interesante porque es posible que difieran en alguna propiedad de interés, como los hábitos de gasto. Algunos métodos de aprendizaje no supervisado:

  • K-means
  • Clustering jerárquico.
  • Análisis de componentes principales.
  • Análisis discriminante no supervizado. …

Problemas de regresión vs Problemas de clasificación

Las variables pueden ser clasificadas como cuantitativas o cualitativas. Las variables cuantitativas toman valores numéricos: edad, estatura, ingreso, precio de una materia prima, costo de una vivienda. En contraste, las variables cualitativas toman valores en una de \(k\) clases o categorías diferentes: estado civil, marca de producto comprado, tipo de diagnóstico de una enfermedad.

En análisis de datos suele referirse a los problemas con variables respuesta cuantitativas como problemas de regresión, mientras que, a los problemas con variable respuesta cualitativa se consideran problemas de clasificaicón

Métodos de potenciación

También conocido como BOOSTING La idea de los métodos de potenciación consiste en tomas una muestra aleatoria de los datos originales y aplicar sobre esta un método predictivo y luego aumentar el peso (potenciar) a los individuos mal clasificados para que en la siguiente aplicación del método predictivo se enfoque en los individuos mal clasificados, mejornado su clasificación.

El boosting nació en el contexto de los problemas de clasificación y tardó varios años en poderse extender a los problemas de regresión. Originalmente se emplea para métodos de clasificación en dondela variable respuesta tiene 2 clases

Funcionamiento del método de potenciación.

El funcionamiento gráfico del método se observa en la Figura 1

flowchart TD
  A[Datos entrenamiento] --> B[Muestra 1 nuevos pesos]
  B --> C[Muestra 2 nuevos pesos]
  C --> |...|D[Muestra M nuevos pesos]

  style A fill:#b6daf6
  
Figura 1: Métodos de consenso

Para la tabla de entrenamiento se aplica el método de clasificación \(G_1(x)\).

Para la Muestra 1 se aplica el método de clasificación \(G_2(x)\). La Muestra 1 está potenciada, esto es, los individuos mal clasificados en \(G_1(x)\) tienen mayor probabilidad de estar en la Muestra 1.

Para la Muestra 2 se aplica el método de clasificación \(G_3(x)\). La Muestra 2 está potenciada, esto es, los individuos mal clasificados en \(G_2(x)\) tienen mayor probabilidad de estar en la Muestra 2.

Para la Muestra M se aplica el método de clasificación \(G_M(x)\). La Muestra M está potenciada, esto es, los individuos mal clasificados en \(G_{M-1}(x)\) tienen mayor probabilidad de estar en la Muestra M

Como el método predictivo \(G_{M}(x)\) puede clasificar mal un individuo anteriormente bien clasificado por \(G_{M-1}(x)\) se aplica un consenso que corresponde al clasificador final:

\[\begin{align} G(x) = sign \left[ \sum_{m=1}^M \alpha_m G_m(x) \right] \end{align}\]

El método de potenciación más usado corresponde al algoritmo adaBoost.M1, que se lleva a cabo de la siguiente forma:

  1. Inicializar los pesos de las observaciones \(w_i = \frac{1}{N}\) con \(i=1,2,..,N\)

  2. Para \(m=1~hasta~ M\)

  1. Ajustar un clasificador \(G_m()x\) a los datos de entrenamiento usando \(w_i\)

  2. Calcular la proporción de errores:

\[\begin{align} err_m = \frac{\sum_{i=1}^N w_iI(y_i \ne G_m(x_i))}{\sum_{i=1}^N w_i} \end{align}\]

  1. Calcular:

\[\begin{align} \alpha_m = log \left[ \frac{1-err_m}{err_m} \right] \end{align}\]

  1. Recalcular \(w_i\)

\[\begin{align} w_i \leftarrow w_ie^{\alpha_m I(y_i \ne Gm(x_i))} \end{align}\]

  1. Salida:

\[\begin{align} G(x) = sign \left[ \sum_{m=1}^M \alpha_m G_m(x) \right] \end{align}\]

Vemos que el algoritmo AdaBoost no combina árboles independientes (como sería el caso de los bosques aleatorios, por ejemplo), sino que estos se van generando en una secuencia en la que cada árbol depende del anterior. Se utiliza siempre el mismo conjunto de datos (de entrenamiento), pero a estos datos se les van poniendo unos pesos en cada iteración que dependen de lo que ha ocurrido en la iteración anterior: se les da más peso a las observaciones mal clasificadas para que en sucesivas iteraciones se clasifiquen bien.

Baoosting para árboles de deciciones de clasificación enR usando la librería ada

Usaremos una base de datos que contiene la siguiente información fisico-química y de calidad:

  • fixed.acidity: acidez fija.

  • volatile.acidity:acidez volátil.

  • Citric.acid: ácido cítrico.

  • residual.sugar: azúcar residual.

  • chlorides: cloruros.

  • free.sulfur.dioxide : dióxido de azufre libre.

  • total.sulfur.dioxide: dióxido de azufre total.

  • density: densidad,

  • pH: PH.

  • sulphates: sulfatos

  • alcohol: alcohol)

  • taste: sabor, que indica la calidad del vino (se considera bueno si la mediana de las evaluaciones de la calidad del vino, realizadas por expertos, que los evaluaron entre 0 = muy malo y 10 = muy excelente, no es inferior a 6. Factor con niveles «bueno» y «malo» que indican la calidad del vino.

Librerías

library(ada) #Para boosting
library(rpart) #Para árboles de decisión
library(mpae) #Contiene la base de datos que se utilizará como ejemplo
library(caret) #Matriz de confusión
library(pROC) #Curva ROC y AUC

Creación del data.frame a partir de la base de datos winetaste de mpae

datos <- winetaste

Limpieza básica de datos N/A

datos<- na.omit(datos)

Definición de la base de datos en entrenamiento y prueba

set.seed(1) #Semilla para replicabilidad del ejemplo
numero_obs <- nrow(datos)
base_entrenamiento<- sample(numero_obs, 0.8*numero_obs, replace=FALSE) 
datos_entrenamiento <- datos[base_entrenamiento,]
datos_prueba <- datos[-base_entrenamiento,]

Planteamiento del modelo

control <- rpart.control(maxdepth = 2, cp=0, minsplit = 10, xval=0) 
#El árbol control tendrá una profundidad máxima de 2. No se aplica poda,número mínimo de observaciones en la clasificación de 10. Sin validación cruzada.
set.seed(1) 
boosting <- ada(taste~., data= datos_entrenamiento, type="real", control= control, iter=200, nu=0.05)
boosting

Call: ada(taste ~ ., data = datos_entrenamiento, type = “real”, control = control, iter = 200, nu = 0.05)

Loss: exponential Method: real Iteration: 200

Final Confusion Matrix for Data: Final Prediction True value bad good bad 199 139 good 60 602

Train Error: 0.199

Out-Of-Bag Error: 0.215 iteration= 192

Additional Estimates of number of iterations:

train.err1 train.kap1 195 195

# Se estiman probabilidades continuas, para pesos suaves. Se ajustan 100 árboles. Peso del nuevo clasificador de 0.05.

Evaluación del modelo con matriz de confusión

prediccion <- predict(boosting, newdata=datos_prueba)
matriz_confusion <- confusionMatrix(data = prediccion, reference = datos_prueba$taste)
matriz_confusion

Confusion Matrix and Statistics

      Reference

Prediction good bad good 150 46 bad 16 38

           Accuracy : 0.752           
             95% CI : (0.6937, 0.8043)
No Information Rate : 0.664           
P-Value [Acc > NIR] : 0.0016219       
                                      
              Kappa : 0.3904          
                                      

Mcnemar’s Test P-Value : 0.0002305

        Sensitivity : 0.9036          
        Specificity : 0.4524          
     Pos Pred Value : 0.7653          
     Neg Pred Value : 0.7037          
         Prevalence : 0.6640          
     Detection Rate : 0.6000          

Detection Prevalence : 0.7840
Balanced Accuracy : 0.6780

   'Positive' Class : good            
                                      

Para recordar

\[\begin{align} Accuracy = \frac{TP+TN}{TP+TN+FP+FN} \end{align}\]

\[\begin{align} Sensitivity = \frac{TP}{TP+FN} \end{align}\]

\[\begin{align} Specificity = \frac{TN}{TN+FP} \end{align}\]

Evaluación del modelo con ROC y AUC

#Predicción como probabilidades
prob_prediccion <- predict(boosting,datos_prueba, type="prob")

#Probabilidad "Positiva" o "Buena"
prob_positiva <- prob_prediccion[, 2]

# Variable binaria con la clase "verdadera"
clase_verdadera <- datos_prueba$taste

#Curva ROC
curva_ROC <- roc(clase_verdadera, prob_positiva)
plot(curva_ROC, main = "Curva ROC para el modelo Bagging")

#AUC
valor_AUC <- auc(curva_ROC)
print(valor_AUC)

Area under the curve: 0.7878

Podemos analizar la convergencia

plot(boosting)