Par curiosite, il y a moyen que tu partages le jeu de donnees?
C’est le prof qui nous à fourni le dataset qui est extrait d’un data set réel de Capgemini chez qui il travaille, donc je ne pense pas qu’on ai le droit de le diffuser malheureusement.
Sans connaître les données et les approches utilisées, ca me semble dur de donner des conseils.
Du coup, pour répondre à cette question : ca dépend des algos que tu veux utiliser. Tu ne peux pas étudier cette question indépendamment du choix de l’algo d’apprentissage.
En fait on nous à donné le dataset et on doit en faire ce qu’on veut, sachant que nous n’avons jamais eu aucun cours de machin learning (ni de programmation^^). J’ai heureusement déjà un minimum de lectures sur le sujet, mais c’est la première fois que je suis confronté à la mise en pratique de ces techniques. Et clairement mes connaissances restent superficielles, je comprends les différents types de modèles et leurs fonctionnement dans les grandes lignes, mais quand il s’agit de choisir un modèle parmi la multitude de variances et combinaisons qui existent ainsi que les différents paramètres et hyper-paramètres…
Je n’ai donc pas vraiment la moindre idée en soit de quels algos utiliser, si ce n’est essayer de tester un peu tous les trucs basiques en classification et voir ce que ça donne.
Si ton modèle donne de très bons résultats sur le jeu de données 1, et des résultats mitigés sur le jeu de données 2, c’est qu’il y a ’overfitting’, autrement dit, c’est que tu as trop de features.
J’ai entrainé (avec un 10 fold cross validation quand c’est possible) quelques modèles de base pour l’instant (regression logistique, knn, svm, random forest, boosted regression) et je n’ai jamais de problèmes d’over fiting, mes résultats en entrainement et en test sont similaires (j’ai 70% des données en entrainement et 30% en test).
Je crois que finalement mon soucis principal n’est pas l’over fitting mais la modélisation en tant que telle.
Le problème est que mes données sont très déséquilibrées par nature : 93% des entreprises ne font pas défaut et 7% font défaut. Ainsi on obtient facilement une acuracy très élevée (plus de 90% à chaque fois) et une spécificité aussi élevée. Le problème est que la sensibilité des modèles (la capacité à détecter correctement les entreprises qui font faillite) est le plus important critère. En effet prêter à une entreprise qui fera faillite (faux négatif) peut conduire à des pertes économiques importantes alors que ne pas prêter à une entreprise qui ne fera pas faillite (faux positif) conduit à un manque a gagné minimum (les intérêts qu’on aurait gagné en prêtant).
Le problème est que tous mes modèles ont une sensibilité très faible et sont incapable d’apprendre correctement à prédire les défauts. Ma random forest à ainsi une sensibilité de littéralement 0%, elle classe toutes les entreprises en non défaut… Mon meilleur modèle, un Naive Bayes, obtient un score de 50% en sensibilité, tout en restant à 85% en spécificité. Sinon les autres ont une sensibilité entre 10% et 30%.
J’ai essayer de chercher comment demander à mes modèles de maximiser plutôt la spécificité. Mon package R comporte une variable metric = "Sens"
qui indique la métrique de sélection des meilleurs modèles, mais que j’utilise ça au lieu de l’Accuracy ou du Kappa ne change quasiment rien aux résultats malheureusement…
Tous mes modèles sont entrainés avec le package Carret qui choisit lui même les meilleurs paramètres du modèle. Par exemple pour un knn :
| knn_model = train(DEFAULT~.,
data = training_set,
trControl = train_control,
method = "kknn",
metric = "Sens")
prediction = predict(knn_model, testing_set)
conf_matrix = confusionMatrix(prediction, testing_set$DEFAULT)
print(conf_matrix)
|
La librairie choisie elle-même la distance optimale et le k du modèle, ce qui est bien pratique quand on ne connait pas exactement soit-même l’impact des paramètre et qu’on a aucune idée sur quel set de paramètres essayer plutôt qu’un autre.
J’ai essayé de tester des modèles plus avancées, mais la liste de modèles disponibles est juste énorme et je n’ai pas la moindre idée de ce qu’il faudrait plutôt tester ou pas.
J’ai par exemple testé une random foret avec adaboost et outre les 2heures que j’ai perdu, le modèle était certes plus efficace qu’une random forest classique (qui avait 0% de sensibilité^^) mais le résultat restait terriblement mauvais. Je me dis que les random forests semblent un mauvais candidat pour mon problème à priori non ?
A l’inverse mon naive bayes à donné les meilleurs résultats, je pensait tester différents algorithmes qui s’en inspirent, mais lesquels ? En prenant des modéles avec le nom "baysian" au hasard dans ce que carret propose j’ai juste réussit… à planter mon ordinateur par manque de ram. J’ai 12go de ram mais a chaque fois le modèle veut allouer des vecteurs de 6go alors qu’il utilise déjà 7go ce qui conduit à l’arrêt de l’entrainement.
Existe-il des modèles qui sont plus efficaces que d’autres quand les classes à prédire sont totalement déséquilibrées comme dans mon cas ? Devrait-je continuer avec des classificateurs baysiens en essayant de les booster ou de les combiner à d’autres techniques ? Dois-je tester des réseaux de neurones ? Il y a il a priori des types de neurones/fonctions d’activations qui semblent adaptées à mon problème ?