Comparing different ML models

HR Analytics: Machine Learning to predict Attrition Rate

Abstracto

A lo largo de esta análisis, he analizado el conjunto de datos IBM Employee Attrition para explorar las causas principales de la deserción en una empresa. Primero, a través de un análisis exploratorio, me he asegurado que los datos esteban limpios.

EDA

En esta etapa, me dí cuenta que los datos tenían un problema de desbalanceo entre las clases de la variable dependiente, para arreglar este problema he ampliado la muestra de la clase menor.

Oversampling Technique

Una vez que los datos estaban listos, he empezado la modelización del árbol de decisión, bagging, random forest, gradient boosting machine (GBM) y extreme gradient boosting machine (XGBM). Para cada técnica, mi flujo de trabajo ha sido lo siguiente:

  1. Tunear los parámetros de cada modelo, con la función train del paquete caret, empleando un bucle cuando la función no permite el control de unos parámetros y utilizando computación paralela sobre tres procesadores.
library(doParallel)
library(tictoc)
registerDoParallel(makeCluster(3) -> cpu) 

nodesize_ <- c()
sampsize_ <- c()
Accuracy <- c()
Kappa <- c()
Auc <- c()

tic()
for (nodesize in c(20,40,60,80,100)) {
    for (sampsize in c(200,500,800,1200,1570)) {
bg <- train(data=upTrain,
                factor(attrition)~.,
                method="rf", trControl= control,
                #fijar mtry for bagging
                tuneGrid= expand.grid(mtry=c(51)), 
                ntree = 5000, 
                sampsize = sampsize, 
                nodesize = nodesize,
                #muestras con reemplazamiento
                replace = TRUE, 
                linout = FALSE) 

confusionMatrix <- confusionMatrix(
    bg$pred$pred, bg$pred$obs)

roc <- roc(response = bg$pred$obs,
                     predictor = bg$pred$Yes)

Acc_i <- confusionMatrix$overall[1]
Accuracy <- append(Accuracy, Acc_i)

K_i <- confusionMatrix$overall[2]
Kappa <- append(Kappa, K_i)

Auc_i <- roc$auc
Auc <- append(Auc, Auc_i)

nodesize_ <- append(nodesize_, nodesize)
sampsize_ <- append(sampsize_, sampsize)

dput("---------------")
dput(paste0("With nodesize= ", nodesize))
dput(paste0("With sampsize= ", sampsize))
dput(paste0("Accuracy: ", 
     round(confusionMatrix$overall[1], 3)))
print(roc$auc)
    }
}
toc()
stopCluster(cpu)

# Aggregate Metrics ----
bagging_results = cbind(
    data.frame(Accuracy, Kappa, Auc, 
               nodesize = nodesize_, sampsize=sampsize_))

#save(bagging_results, file="bagging_results.RData")

# Clear cache ----
rm(Acc_i, K_i, Auc_i, nodesize, roc, sampsize)
rm(Accuracy, Auc, Kappa, nodesize_, sampsize_)
  1. Entender el andamiento del ajuste para los distintos parámetros tuneados a través unos gráficos.

    • Además para el bagging y random forest he visualizado el error de out-of-bag, para entender el andamiento a medida que aumentaban las interacciones de los árboles. A través este gráfico he podido reducir la complejidad de mi modelo final.

some visualizations from the project

Después haber elegido los parámetros mejores, he ajustado el modelo final, visualizando la matriz de confusión y las variables más influyentes para cada modelo.

Variable Importance

Una vez ajustadas las técnicas de árboles, he ajustado otra vez los modelos con validación cruzada repetida esta vez, para comparar las respectivas tasa de fallo y la área abajo la curva ROC, a través de un grafo de caja y bigote incluyendo como modelo de referencia una regresión logística.

Una vez encontrado el modelo ganador, he decidido crear un grafo de barras apiladas para obtener las variables más influyentes según los distintos modelos. A partir de estas, he creado un nuevo conjunto entrenamiento/test, con el cual voy a realizar otras técnicas de aprendizaje automático:

  • Support Vector Machines, con kernel:
    • Lineal
    • Polynomial
    • Radial
  • Bagging del SVM Lineal
  • Boosting
  • Stacking de:
    • Gradient Boosting Machine
    • SVM Radial
    • XGBoost

Comparing models

Alessio Crisafulli Carpani
Estudiante Posgrado en Estadística

Necesitamos el poder de los datos y el aprendizaje automático para hacer frente a las necesidades actuales de manera eficiente

Siguiente
Anterior