Une banque qui accorde des prêts à la consommation souhaite un outil de “scoring crédit” pour calculer la probabilité qu’un client rembourse son crédit en s’appuyant sur des sources de données variées (données comportementales, données provenant d’autres institutions financières, etc.).
Cet outil doit aussi intégrer un dashboard interactif pour que les chargés de relation client puissent expliquer de façon la plus transparente possible les décisions d’octroi ou d’un refus de crédit.

Ce projet faisait partie de la formation bac+5 Ingénieur Machine Learning.

Durée du projet: 120 heures

Données

Les données utilisées proviennent de Kaggle. Ce sont les réponses au questionnaire à remplir lors de la demande d’un crédit, avec une variable indiquant si le prêt a été accordé ou non. Diverses tables en rapports avec l’historique des prêts et demandes des clients sont également disponibles.

Une analyse exploratoire a permis la construction du jeu de données final et son premier nettoyage (doublons valeurs manquantes, gestion de la colinéarité). Une séparation 80/20 en conservant le ratio d’accords/refus de crédits a permis d’en dégager un jeu de tests.

Un pipeline de traitements a ensuite été construit pour gérer l’imputation des valeurs manquantes restantes, l’encodage des variables catégorielles et la normalisation des variables numériques.

Déséquilibre des classes

Dans les données disponibles le nombre de crédits acceptés est largement supérieur au nombre de refus, ce qui peut biaiser les prédictions. Deux méthodes ont été testées pour résoudre ce problème:

Selection du modèle

Pour la banque il est plus grave d’accorder un prêt alors que le client ne peut pas le rembourser, plutôt que de le refuser à quelqu’un qui pourrait le rembourser.
Il faut donc minimiser le nombre de faux positifs (erreurs de type I) et pour cela les modèles testés ont été évalués avec plusieurs métriques:

  • \(\text{precision} = \frac{TP}{TP+FP}\)
  • Accuracy personnalisée qui pénalise les faux positifs: \(\text{CustomAccuracy} = \frac{TP}{TP+TN+FP*10+FN*0.1}\)
  • Les courbes ROC et Precision-Recall ont été utilisées pour évaluer les probabilités et ajuster le seuil de décision des modèles (ROC si très petit déséquilibre entre classes, et la courbe AP si le déséquilibre n’est pas géré).

Plusieurs modèles de classification binaires ont alors été comparés et le modèle XGBoost est celui qui a obtenu les meilleurs performances. Après une optimisation des hyperparmètres par GridSearch le seuil de décision a été ajusté. Ce qui a permis d’obtenir les scores suivants:

Models scores

Interprétation des prédictions

En utilisant le package Shap, il a été possible de mieux comprendre le modèle et ses prédictions, déjà avec une analyse de l’importance des features.

En produisant des force plots, il a aussi été possible de connaîtres les valeurs qui ont le plus influées la probabilité prédite pour un client.

Dashboard interactif

Le développement d’un dashboard pour les chargés de relation client s’est fait en deux parties:

  1. Une API RESTful avec le framework FastAPI permettant des appels au modèle entrainé
  2. Un frontend composé d’un simple script Python utilisant le package Streamlit, qui consomme l’API et permet l’affichage du score et de son interprétation.

L’application a finalement été Dockerizée, avec un fichier docker-compose prévu pour faciliter l’exécution locale. Et le tout fut déployé sur des plans gratuits de l’hébergeur Heroku.