Row

big_title_0

Contexte

Row

Contexte

Le but de cette étude est de faire de la classification automatique de transactions financières frauduleuses, problématique à laquelle l’intelligence artificielle a beaucoup à apporter. Le dataset que nous utilisons contient une liste de transactions effectuées sur la plateforme d’un service de monnaie mobile, dont certaines déjà identifiées comme frauduleuses. L’idée est de faire extrapoler à un algorithme de machine learning les critères importants pour classifier une transaction comme frauduleuse, pour l’appliquer à de nouvelles données.

Le type de fraudes que nous essayons de détecter ici correspond au cas où un utilisateur malveillant essaye de prendre le contrôle du compte de quelqu’un d’autre, pour transférer les fonds vers un autre compte utilisateur (transfer) et les retirer de la plate-forme de transaction (cash-out). L’utilisateur n’étant pas forcément responsable de ce type d’attaque, ces fraudes résultent en un manque à gagner conséquent pour la compagnie concernée.

Image

Variables


Les variables disponibles dans notre jeu de données sont les suivantes (isFraud sert à entraîner notre modèle) :

- amount: montant de la transaction;
- type: CASH_IN, CASH_OUT, PAYMENT, DEBIT, TRANSFER;
- oldBalanceOrig: solde initial sur le compte émetteur;
- oldBalanceDest: solde initial sur le compte récepteur;
- newBalanceOrig: solde final sur le compte émetteur;
- newBalanceDest: solde final sur le compte récepteur;
- isFraud: la transaction est-elle frauduleuse (notre vérité terrain);
- isFlaggedFraud: critère précédemment utilisé par la compagnie pour identifier les fraudes (1 si la transaction dépasse les 2000€, 0 sinon).

Row

big_title_0

Exploration des données

Row

Types de paiements

Volume des transactions

Cash_origin_after

Row

Types de paiements text

On constate que les transactions frauduleuses sont de 2 types uniquement :

  • Les transferts vers des comptes tiers (après usurpation d’identité)
  • Les cash_out (retrait total avant de disparaître dans la nature)

Ce qui correspond bien au type de fraudes que l’on cherche à détecter ici.

Volume des transactions text

Cette répartition de densité met bien en avant le fait que les montants des transactions frauduleuses ont tendance à être plus élevés que ceux des transactions usuelles (au vu de la position par rapport à la valeur moyenne globale).

On remarque également que beaucoup de fraudeurs semblent opter pour des transactions de 10M (pic net vers la droite), ce qui peut être un critère intéressant pour identifier une transaction frauduleuse.

Cash_origin_after text

Il apparaît clairement que la quasi-totalité des transactions frauduleuses consistent à vider entièrement le compte en question, ce qui nous fournit un autre critère potentiellement intéressant.

Il est également intéressant de constater en considérant l’ensemble des transactions, que même les utilisateurs “normaux” de la plate-forme s’en servent majoritairement pour des transactions ponctuelles et ne gardent pas d’argent sur leur compte, ce qui rend l’utilisation de ce critère plus délicate.

Row

big_title_0

Modélisation et résultats

Row

Modèle + variables importance

L’enjeu de cette étude est d’entraîner un algorithme de machine learning sur notre jeu de données pour apprendre à identifier une fraude. Nous avons opté pour un algorithme XGboost sur nos données, et après entraînement, il est possible d’en déduire les variables d’importance globales et locales. L’idée de l’interprétabilité locale d’un modèle est de trouver parmi nos variables lesquelles contribuent le plus à la prédiction faite sur une transaction spécifique; on lit alors les graphiques de haut en bas comme une addition de probabilités dues à chaque feature.

Le graphique d'importance relative des variables à l'échelle globale nous apprend que le critère le plus efficace quand il s'agit d'identifier une fraude est le solde pré-transaction sur le compte débiteur. Comme nous l'avions discuté précédemment, le modèle a pu utiliser l'argument 'compte vidé après transaction' (newBalanceOrig), mais dans une moindre mesure car c'est le cas dans presque toutes . On constate également que le critère précédemment employé pour identifier les fraudes, isFlaggedFraud, n'est pas du tout utilisé par notre modèle, infirmant encore si besoin sa fiabilité : l'information qu'il contient est déjà contenue dans les autres champs.

Pour ce premier témoin par exemple (transaction non frauduleuse), les valeurs de oldBalanceOrig, newBalanceOrig et oldBalanceDest font augmenter la probabilité qu'il s'agisse d'une fraude; le type et 'isFlaggedFraud' n'ont pas d'impact et newBalanceDest et amount font rechuter la probabilité de fraude aux alentours de 0.

Pour ce témoin d'une transaction frauduleuse, toutes les variables qui contribuent à la probabilité de fraude y contribuent positivement : oldBalanceOrig, newBalanceOrig, newBalanceDest et amount. La valeur du total étant au-dessus du seuil fixé de détection, la transaction est identifiée comme frauduleuse.

Explication seuil / slider + Matrice de confusion / explications

Ces résultats ont été obtenus avec le threshold maximisant le F-Score : on pourrait envisager de baisser le seuil de détection pour répérer une plus grande quantité d'informations frauduleuses, mais il faut bien sûr être conscient du fait que cela entraînerait un plus grand nombre de fausses alarmes, qu'il faudrait faire traiter à la main pour un coût à estimer.



0 0 0 0 0 0


On y lit que sur les 270 transactions frauduleuses présentes dans notre jeu de données, 161 ont été correctement identifiées et 109 sont passées sous notre radar, pour un taux de rappel de 60% . On lit également que sur les 196 transactions identifiées comme frauduleuses, seulement 35 sont des faux positifs (de fausses alarmes), pour un taux de précision de 82%.
Les faux positifs ne sont pas un problème dans ce cas d'usage, puisqu'il vaut mieux ne pas accepter une transaction financière potentiellement suspecte avant de l'avoir vérifié manuellement, que ne pas empêcher des transactions qui sont réellement frauduleuses. Mieux vaut être trop prudent que pas assez!

Highcharts seuil probas + Résultats valueBox

1,200,000 transactions
270 Fraudes au total
161 Fraudes Identifiées
Etant donné que notre algorithme a identifié 196 transactions comme étant frauduleuses, le nombre de transactions à faire vérifier manuellement par un opérateur est drastiquement réduit. Si on part du principe que la compagnie gérant les transactions doit rembourser chacun des clients concernés à hauteur de la somme subtilisée (ce qui revient à dire que les clients ne peuvent pas être tenus pour responsables de la fraude), on peut alors estimer simplement que le manque à gagner est égal à la valeur moyenne d'une transaction frauduleuse (14,000€ environ) multiplié par le nombre de fraudes effectivement détectées. Ce qui nous donne en première approximation :
2,254,000 €
Economie réalisée par notre modèle sur un mois