Abstracto
Au long de cette analyse, j’ai analysé l’ensemble de données IBM Employee Attrition pour explorer les principales causes de décrochage dans une entreprise. Premièrement, au moyen d’une analyse exploratoire, j’ai verifié que les données soient propres.
À cette stade, j’ai réalisé que les données avaient un problème de déséquilibre entre les classes de la variable dépendante, pour résoudre ce problème, j’ai élargi l’échantillon de la classe inférieure.
Une fois les données prêtes, j’ai commencé à modéliser le decision tree, bagging, random forest, gradient boosting machine (GBM) and extreme gradient boosting machine (XGBM). Pour chaque technique, mon flux de travail a été le suivant :
- Réglage des hyperparamètres de chaque modèle, avec la fonction
train
du paquet «caret
», en utilisant une boucle lorsque la fonction ne permet pas de contrôler certains paramètres et en utilisant le calcul parallèle sur trois cœurs de processeurs.
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_)
-
Comprendre le moment de l’ajustement pour les différents paramètres ajustés au moyen de graphiques.
- Aussi pour l’ensachage et la forêt aléatoire, j’ai visualisé l’erreur de sortir du sac, pour comprendre la marche à mesure que les interactions des arbres augmentaient. Grâce à ce graphique, j’ai pu réduire la complexité de mon modèle final.
Après avoir choisi les meilleurs paramètres, j’ai ajusté le modèle final, visualisant la matrice de confusion et les variables les plus influentes pour chaque modèle.
Une fois les techniques d’arborescence ajustées, j’ai de nouveau ajusté les modèles avec validation croisée répétée cette fois, pour comparer le taux d’échec et la area sous la courbe ROC, à travers une boîte et un graphique moustache comprenant comme modèle de référence une régression logistique.
Une fois que j’ai trouvé le modèle gagnant, j’ai décidé de créer un graphique à barres empilées pour obtenir les variables les plus influentes selon les différents modèles. À partir de ces éléments, j’ai créé un nouvel ensemble de train/test, qui a ensuite été utilisé pour mettre en œuvre d’autres techniques d’apprentissage machine :
- Support Vector Machines, con kernel:
- Lineal
- Polynomial
- Radial
- Bagging del SVM Lineal
- Boosting
- Stacking de:
- Gradient Boosting Machine
- SVM Radial
- XGBoost