Débutant en machine learning

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour à tous !

Je viens vous poser des petites questions car pour un petit projet personnel, sur mon temps libre, j’essaie d’utiliser le machine learning.

Bien qu’ayant une formation scientifique, je suis loin de tout comprendre et je ne fais pour l’instant que bêtement appliquer des méthodes, et c’est peut-être de là que vient mon problème.

Quel est-il justement ?

Je dispose, sur une population anonymisée, des informations suivantes :

  • Un score indiquant le niveau d’éducation de la personne (ce score est un flottant, plus il est élevé, plus la personne est éduquée)
  • Un score indiquant la "respectabilité" d’une personne, calculé à partir de ses centres d’intérêt. Idem, plus il est élevé, plus la personne est "respectable"

(Je mets des guillemets autour de tout ça, je ne dis pas que c’est une bonne chose ou non de juger de la qualité des personnes par un score, et j’aimerais éviter un débat là-dessus, c’est vraiment un projet personnel pour apprendre).

Ces deux scores sont mes input sur la population.

Ce que je cherche à calculer (l’output), c’est la capacité de la personne à rembourser un crédit. J’ai donc un score d’output, que je cherche à prédire : 1 si la personne a remboursé sa dette, 0 sinon.

Le problème me semble donc relativement simple (en termes d’input/output) pour pouvoir appliquer du machine learning et tester des choses dessus.

Ce que j’ai fait jusqu’à présent, c’est de suivre ce tutoriel. Il m’a permis de découvrir l’application du machine learning.

Notamment, dans les dernières étapes, j’ai pu déterminer quel algorithme convenait le mieux pour mon problème, et c’est la méthode des KNN qui m’a donné les meilleurs résultats, et que j’utilise donc maintenant.

Néanmoins (on arrive enfin à mon problème), quelque chose me tracasse. En effet, j’obtiens avec cet algorithme, en fonction de la division entre données d’entraînement et de test, un score de précision compris généralement entre 80 et 90%. C’est certes très bien.

Sauf que mes données sont réparties de la façon suivante :

  • 88 % de personnes ayant honoré leur emprunt
  • 12 % de personnes ne l’ayant pas fait

Du coup je me dis la chose suivante : si je prends un algorithme qui attribue systématiquement la prédiction "1", je vais prédire juste dans 88% des cas, et pourtant je n’aurai en fait rien prédit.

C’est donc là ton mon problème : est-ce "normal" d’obtenir de tels scores ? Est-ce que le problème pourrait venir de mes données ? De la façon dont je traite le problème ? Bref, je suis un peu perdu.

Je suis preneur de toutes pistes que vous pourrez me donner pour m’améliorer. Je rappelle que j’applique bêtement ce que j’ai trouvé et le problème vient certainement de là ^^'

Merci de m’avoir lu en tout cas.

+0 -0

Bonsoir !

En fait, dans le cas de données très déséquilibrées, en machine learning entre autre, on a d’autres mesures de l’efficacité que la précision brute. Comme dit par ez613, cela comporte compter les faux négatifs, faux positifs, etc… Ici, tu as deux classes : remboursé, et pas remboursé, que l’on appellera 1 et 2. Tu peux simplement compter les faux positifs et faux négatifs pour chacun.

Il y a ensuite différentes mesures les prenant en compte :

Classe prédite : 1 Classe prédite : 2
Vrai classe : 1 A (Correct) B (Faux)
Vrai classe : 2 C (Faux) D (Correct)

(On suppose par exemple que 1=emprunt honoré, 2=emprunt non-honoré)

Les valeurs A, B, C et D te donneront le nombre de vrais et faux positifs pour chaque classe, mais c’est plus intéressant d’avoir des ratio. Ce que tu utilise, c’est l’"accuracy" (Désolé, je ne connais pas les termes français exacts), définie ainsi :

accuracy=A+DA+B+C+Daccuracy = \frac{A+D}{A+B+C+D}

Tu peux définir la "precision", qui représente, pour chaque classe, si ton modèle se trompe souvent quand il prédit cette classe, donc si ses résultats quand il donne cette réponse sont fiables. Cette mesure ignore le fait de donner la mauvaise réponse pour la classe considérée :

  • precision_classe_1=AA+Cprecision\_classe\_1 = \frac{A}{A+C}
  • precision_classe_2=BB+Dprecision\_classe\_2 = \frac{B}{B+D}

Enfin, tu peux définir le "recall", qui représente la capacité de ton modèle à correctement détecter tout les éléments ayant cette classe. Cette mesure ignore les élément auquel ton modèle à assigné cette classe, alors que ce n’est pas la bonne :

  • recall_classe_1=AA+Brecall\_classe\_1 = \frac{A}{A+B}
  • recall_classe_2=DD+Crecall\_classe\_2 = \frac{D}{D+C}

Ainsi, dans ton cas, tu as bein indiqué que un algo constant avait 88% d’accuracy. Cependant, son recall pour la classe non honoré serait de 0% ! Il est alors très mauvais sous cet angle. Tout un aspect du problème de choisir son modèle, est de savoir quel paramètre regarder. Évidemment, on veut qu’ils soient tous bons, mais auxquels donner le plus d’importance ?

Pour ton exemple, dans le cas d’emprunt, supposons que refuser un emprunt intéressant engendre une perte petite, mais qu’elle soit petite devant la perte si l’emprunt n’est pas honoré. Alors ce n’est pas grave si recall_classe_1 (honorés), n’est pas énorme, tant qu’il n’est pas désastreux. Par contre, il va te falloir surtout :

  • recall_classe_2 (non-honorés) très haut, pour éviter les grosses pertes (quitte à laisser filer des clients)
  • ou encore precision_classe_1 (honorés) très haut, qui va mesurer, de la même manière, si ton a souvent raison quand il prédit que l’on peut faire confiance à telle personne.

(Désolé pour le message masqué, erreur de ma part)

+0 -0

C’est tout à fait normal.
Dans une classification (c’est ce que tu es en train de faire), les classes n’ont pas à être de taille égale. Le "problème" vient ici du fait que les classes ne sont pas équilibrées.
Donc forcément quand tu prédit toujours 1, tu as un "bon" résultat.

Sauf que…

Bon résultat est ici bon par rapport à une norme que tu t’es fixé, à savoir le pourcentage de classes bien prédites. Il y a plusieurs façons de résoudre ça :

  • simplement dire que "bien", ce n’est pas 80%, mais plutôt 95%
  • équilibrer les classes : prendre un sous-ensemble de tes classes pour qu’il y ait à peu près 50/50 et que la précision veuille dire quelque chose, à ce moment là, un classifieur aléatoire devrait prédire à peu près 50% de bons résultats
  • utiliser une autre valeur pour les résultats comme les taux de faux-négatifs, faux-positifs, etc. comme l’a suggéré webalorn

Après, il y a probablement plein d’autres solutions mais c’est ce qui me vient à l’esprit pour le moment.

Édité par Ryx

+0 -0

La proposition : 'Prendre un sous-ensemblre pour qu’il y ait 50/50' : je n’y crois pas du tout.

D’accord avec les comptages des 4 groupes, et à toi de voir ce que tu préfères : 88% de bons pronostics, avec un truc qui dit toujours oui, ou environ 88% de bons pronostics, avec un truc qui prévoirait par exemple 76% de Oui, et 24% de non… ou tout truc intermédiaire.

Faisons confiance à ton travail. Il est probable que tes données ne permettent pas d’obtenir de meilleurs résultats.

Si par exemple tu as 2 individus qui ont quasiment le même profil (les 2 premiers indicateurs), et l’un a remboursé, l’autre pas, n’importe quel outil va faire le même pronostic pour ces 2 individus, et donc se trompera sur l’un des 2. Idem, si tu as un individu 'négatif’, avec ses 2 scores entre plusieurs individus 'positifs’, l’algo va se tromper sur l’individu négatif. Et si tu joues sur les paramètres pour forcer l’algorithme à bien prédire cet individu, tu vas aboutir à un modèle totalement artificiel, qui marche très bien sur les données de test, mais qui donnera n’importe quoi sur un autre échantillon.

Seulement 2 variables explicatives, c’est peu dans un environnement de Machine-Learning. Par curiosité, ajoute une autre variable (par exemple le produit score1*score2). Soit ça ne change rien, parce que l’algo considère que cette nouvelle variable fait doublon. Soit ça change quelque chose, mais dans le mauvais sens. Soit ça change quelque chose dans le bon sens.

Si ça change dans le bon sens, ça ne veut pas dire que c’est une bonne idée… pas sûr du tout.

Questiond subsidiaire : tu as combien d’individus dans ta base de données ?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte