El algoritmo Random Forest

Predicción con el algoritmo Random Forest. Enseñando a las máquinas

Otras veces hemos utilizado un algoritmo de bosque de árboles para clasificar la muestra. Ahora lo vamos a usar, con las mismas métricas, pero de forma diferente, en nuestro habitual sector de seguros Es un algoritmo tan robusto y fiable que se usa habitualmente en el ramo de la salud, como por ejemplo en la detección precoz del cancer (por citar una de sus múltiples aplicaciones) en base a los indicadores que proporcionan las analíticas y muestras de los tumores de los clientes.

Vamos a aplicarlo a una base de datos de seguros de clientes, donde se trata de predecir quien tiene un seguro de accidentes y quien no, a partir de ciertas variables que tenemos, como la edad, el codigo postal, si tienen hijos, su estado civil, el gasto medio en seguros o su nacionalidad entre otros.

Al igual que aqui el resultado será una variable binaria (SI-NO).

Para este tipo de datos mixtos (números y categorías) es un buen algoritmo; no produce “overfiting” (muy buen trabajo en el entrenamiento porque se ajusta demasiado bien pero falla en el conjunto de test), además de la facilidad de manejar grandes conjuntos de datos de forma rápida.

Vamos a separar la muestra en dos grupos (un 75% y un 25%). El primer grupo se utiliza para entrenar al algoritmo (aprendizaje de la máquina) y el segundo grupo se usa como test, para ajustar la predicción (de ventas de seguro de accidentes en este caso). Esto nos da una matriz de salida binaria, con cuatro opciones:

Clientes que tienen SI seguro de accidentes y la máquina predice SI (verdadero POSITIVO -> VP)

Clientes que NO tienen seguro de accidentes y la maquina predice NO (verdadero NEGATIVO -> VN)

Clientes que SI tienen seguro de accidentes y la máquina predice NO (falso NEGATIVO -> FN)

Clientes que NO tienen seguro de accidentes y la máquina precide SI (falso POSITIVO -> FP)

Y lo que nos interesa saber, de los diferentes tipos de algorítmos que hay, cada uno con sus métricas y caracteristicas, en base a las cualidades de nuestra base de datos, acierta mas y mejor:

Creamos los subgrupos, nos aseguramos que el porcentaje de contratación sea similar en los dos grupos (entrenamiento y test), ya que realizamos una partición aleatoria:

Code

#creamos la particion para entrenamiento y test 75/25
indice <- sample (1:nrow (estudio_acd), 
                  size = nrow(estudio_acd) * 0.75)
entrenamiento <- estudio_acd[indice,]
test <- estudio_acd[-indice,]

#mira que las particiones sean proporcionales en datos
CrossTable (entrenamiento$seguro_acd)

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  2925 

 
           |  accidente | sin_seguro | 
           |------------|------------|
           |       1035 |       1890 | 
           |      0.354 |      0.646 | 
           |------------|------------|



 

Code

CrossTable (test$seguro_acd)

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  975 

 
           |  accidente | sin_seguro | 
           |------------|------------|
           |        328 |        647 | 
           |      0.336 |      0.664 | 
           |------------|------------|



 

En el grupo de entrenamiento (2925) tenemos un 35,6% de clientes con seguro de accidentes. En el grupo de test (975) tenemos un 34,9% de clientes con seguro de accidentes, ambos elegidos al azar. Asi que la muestra está bien repartida.

Code

# Ajustar modelo
mod_RF_acd <- randomForest(seguro_acd ~., data= entrenamiento)
mod_RF_acd

Call:
 randomForest(formula = seguro_acd ~ ., data = entrenamiento) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 9.4%
Confusion matrix:
           accidente sin_seguro class.error
accidente        915        120  0.11594203
sin_seguro       155       1735  0.08201058

Code

plot (mod_RF_acd)

En la primera salida de información del algoritmo vemos que se han realizado 500 intentos (árboles) diferentes, eligiendo dos variables al azar en cada intento, y nos ofrece una primera matriz antes de ajustar los errores. Se aprecia en el gráfico como descienden los valores de error cuando aumenta el número de intentos (prácticamente a partir del intento número 100 el error se mantiene estable), lo que indica que el algoritmo ya ha aprendido a clasificar a un cliente en función de sus variables. O lo que es lo mismo, va eligiendo la importancia de las variables en cada intento y las va recordando:

Code

# Importancia de las variables
mod_RF_acd$importance
                  MeanDecreaseGini
edad                    250.473041
gasto                    56.803845
e_civil                  13.053154
hijos                     6.630892
nacionalidad            309.956887
pago                    201.432609
seguro_voluntario       107.005487

Aqui vemos la importancia de las variables según su pureza (a mayor valor, más homogenea es la la partición, más ganancia de información, o menor entropía como habiamos visto en el capítulo de clasificación):

Code

# Hacer predicciones
RF_acd <- predict(mod_RF_acd, test)

# Matriz de confusion
confusionMatrix(RF_acd, test$seguro_acd)
Confusion Matrix and Statistics

            Reference
Prediction   accidente sin_seguro
  accidente        302         46
  sin_seguro        26        601
                                              
               Accuracy : 0.9262              
                 95% CI : (0.9079, 0.9418)    
    No Information Rate : 0.6636              
    P-Value [Acc > NIR] : < 0.0000000000000002
                                              
                  Kappa : 0.8371              
                                              
 Mcnemar's Test P-Value : 0.02514             
                                              
            Sensitivity : 0.9207              
            Specificity : 0.9289              
         Pos Pred Value : 0.8678              
         Neg Pred Value : 0.9585              
             Prevalence : 0.3364              
         Detection Rate : 0.3097              
   Detection Prevalence : 0.3569              
      Balanced Accuracy : 0.9248              
                                              
       'Positive' Class : accidente           
                                              

Con todos estos parámetros se realiza la predicción, se ajusta y se compara la salida con el grupo de test, para comparar los resultados. Digamos que el grupo de test se coge como si fueran clientes “nuevos” y se comparan con los que ya teniamos (el grupo de entrenamiento) y se comparan las predicciones hechas con el grupo real. Aquí es donde aparece la matriz de confusión y analizamos los resultados sobre los 975 clientes:

  • Verdaderos Positivos (VP): 302 predicciones correctas de “accidente: el cliente lo tiene y el algoritmo acierta.
  • Falsos Positivos (FP): 46 predicciones incorrectas de “accidente”: el cliente no lo tiene y el algoritmo lo clasifica como que lo tiene.
  • Falsos Negativos (FN): 26 predicciones incorrectas de “sin_seguro”: el cliente tiene seguro pero el algoritmo lo clasifica como que no lo tiene
  • Verdaderos Negativos (VN): 601 predicciones correctas de “sin_seguro”: el cliente no tiene seguro y el algoritmo acierta.

Matriz de Confusión

Métricas de Evaluación

  • Accuracy (Exactitud): 0.9262 (VP + VN) / (VP + VN+ FP + FN) como la proporción de predicciones correctas sobre el total de predicciones.Kappa: 0.8371
    • Mide el acierto entre las predicciones y las etiquetas reales, ajustado por lo ocurre por azar
    • En un rango de 0 (no hay precisión ni exactidud) o 1 (máxima precisión y exactitud); un valor de 0.8371 es un valor alto.
  • Sensitivity (Sensibilidad): 0.9207 (VP / (VP + FN) como la proporción de verdaderos positivos correctamente identificados (tasa de verdaderos positivos)Specificity (Especificidad): 0.9289 (VN / (VN + FP) proporción de verdaderos negativos correctamente identificados (tasa de verdaderos negativos)Positive Predictive Value (PPV): 0.8678 (VP / (VP + FP) proporción de predicciones positivas correctas.Negative Predictive Value (NPV): 0.9585 (VN / (VN + FN) proporción de predicciones negativas correctas.Balanced Accuracy: 0.9248 Promedio de la sensibilidad y la especificidad como (Sensib. + especif.) / 2Mcnemar’s Test P-Value: 0.02514
    • Prueba estadística para evaluar si hay una diferencia significativa entre las proporciones de dos categorías emparejadas.
    • Un valor p de 0.02514 indica que hay una diferencia significativa (un grupo tiene alrededor del 35% (categoría “accidente”) y el otro grupo el 65% (categoría “sin_seguro”)

Interpretación General

  • La precisión del modelo es alta (92.62%), lo que indica que la mayoría de las predicciones son correctas. El intervalo de confianza ofrecido es del 95% (entre el 90,79% y el 94,18%) el algoritmo acertará la predicción.
  • El valor kappa de 0.8371 sugiere buena precisión y exactitud entre las predicciones y las etiquetas reales.
  • La sensibilidad y especificidad son ambas altas, lo que indica que el modelo es bueno tanto para identificar las categorías (clases) “accidentes” como “sin_seguro”.
  • Los valores predictivos positivos y negativos también son altos, lo que sugiere que las predicciones del modelo son confiables.

En resumen, el modelo funciona bien en términos de precisión y capacidad para distinguir entre las dos clases. Estos datos nos vienen bien a la hora de calcular por ejemplo, con una precisión del 95% el número de ventas que vamos a tener para este servicio.

6.2.4 Curva ROC

Hay una forma gráfica de contrastar las métricas también, mediante el uso de las curvas ROC (receiver Operating Characteristic). Lo que hace esta función es confrontar la sensibilidad con la especificidad colocando cada una en un eje. La sensibilidad eran los falsos positivos (FP) (predice que tiene seguro cuando no lo tiene): esto coincide con el error tipo I en el contraste de hipótesis estadísticas: la hipótesis nula es “el cliente tiene seguro de accidentes” pero se elige la hipótesis alternativa. La especificidad son los falsos negativos (FN) (lapredicción dice que no tiene un seguro de accidentes cuando en realidad si lotiene).

El gráfico muestra una curva con la sensibilidad (FP) en el eje Y, y en eje X como 1-Especificidad. El area formada entre la diagonal y la curva dibujada (AUC, Area Under Curve), es la medida que buscamos. A mayor área, mejor se comporta el algoritmo bajo los supuestos de sensibilidad y especificidad. El óptimo sería un ángulo recto (clasificador o predictor perfecto), lo que indica que el bajo la curva es 1. Un valor menor de 0.5 (la diagonal) significa que el modelo no es mejor que el azar (aunque no ofrece un punto óptimo.

LA curva ROC de nuestro algoritmo es esta:

Code

#CURVA ROC de  random forest
RF_acd_p <- data.frame (predict(mod_RF_acd, test, type = "prob"))
RF_roc <- roc (test$seguro_acd, RF_acd_p$accidente)
Setting levels: control = accidente, case = sin_seguro
Setting direction: controls > cases

Code

plot (RF_roc, col = "violet", lwd = 2,
      main = "Curva ROC de Random Forest",
      xlab = "1 - Especificidad (tasa de verdaderos negativos)",
      ylab = "Sensibilidad, (tasa de verdaderos positivos)")

Y el valor bajo la curva:Code

auc (RF_roc)
Area under the curve: 0.9845

Los Resultados de otros algoritmos no mejoran esta predicción. Hemos probado redes neuronales, máquinas de vector soporte, naive bayes, k-nearest neighbours, entre otros, pero ninguno de ellos alcanza los valores de predicción, kappa, especificidad y sensibilidad de Random Forest. por lo que es el único que mostramos.

Como comparativa, aportamos las curvas ROC del resto de algoritmos de predicción para esta base de datos, pero por extensión del trabajo no vamos a desarrollar el resto de algoritmos ni sus métricas aquí

Grafico propio creado con R-Studio en mi script V4.1 de Machine Learning

Deja una respuesta

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