Comparing different ML models

HR Analytics: Machine Learning per predire il tasso di abbandono

Astratto

Nel corso di questa analisi, ho analizzato l’insieme di dati IBM Employee Attrition per esplorare le principali cause di abbandono in un’azienda. In primo luogo, attraverso un’analisi esplorativa, mi sono assicurato che i dati fossero puliti.

EDA

In questa fase, mi sono reso conto che i dati avevano un problema di squilibrio tra le classi della variabile dipendente, per risolvere questo problema ho ampliato il campione della classe inferiore.

Tecnica di sovracampionamento

Una volta pronti i dati, ho iniziato a modellare il decision tree, bagging, random forest, gradient boosting machine (GBM) and extreme gradient boosting machine (XGBM). Per ogni tecnica, il mio flusso di lavoro è stato il seguente:

  1. Messa a punto degli iperparametri di ciascun modello, con la funzione train del pacchetto caret utilizzando un ciclo quando la funzione non consente il controllo di alcuni parametri e utilizzando il calcolo parallelo su tre cores diversi del processore.
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. Comprendere l’andamento della ottimizzazione dei diversi parametri attraverso grafici.

    • Anche per l’insaccamento e la foresta casuale ho visualizzato l’errore out-of-bag, per capire il camminare mentre le interazioni degli alberi aumentavano. Attraverso questo grafico sono stato in grado di ridurre la complessità del mio modello finale.

Alcune visualizzazioni dal progetto

Dopo aver scelto i parametri migliori, ho regolato il modello finale, visualizzando la matrice di confusione e le variabili più influenti per ogni modello.

Importanza Variabili

Una volta che le tecniche ad albero sono state regolate, ho nuovamente regolato i modelli con la validazione ripetuta incrociata questa volta, per confrontare il rispettivo tasso di fallimento e l area al di sotto della curva ROC, attraverso un grafico boxplot, includendo come modello di riferimento una regressione logistica.

Una volta trovato il modello vincente, ho deciso di creare un grafico a barre per ottenere le variabili più influenti a seconda dei diversi modelli. Da questi, ho creato un nuovo set training/test, che è stato poi utilizzato per implementare ulteriori tecniche ML:

  • 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
Studente Magistrale in Scienze Statistiche

Abbiamo bisogno della potenza dei dati e dell’apprendimento automatico per affrontare le esigenze di oggi in modo efficiente

Prossimo
Precedente