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.
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í

Deja una respuesta