Du jeu de données au modèle de détection

Détection de la fraude en R

Sebastiaan Höppner

PhD researcher in Data Science at KU Leuven

Feuille de route

  • (1) Diviser le jeu de données en ensemble d'entraînement et ensemble de test
  • (2) Choisir un modèle de machine learning
  • (3) Appliquer SMOTE à l'ensemble d'entraînement pour équilibrer les classes
  • (4) Entraîner le modèle sur l'ensemble rééquilibré
  • (5) Évaluer la performance sur l'ensemble de test (d'origine)
Détection de la fraude en R

Diviser le jeu de données : entraînement et test

  • Scinder le jeu de données en ensemble d'entraînement et ensemble de test (p. ex. 50/50, 75/25, ...)
  • Vérifier que les deux ensembles ont d'abord une distribution de classes identique
  • Exemple : 50 % entraînement et 50 % test
prop.table(table(train$Class))
   0    1 
0.98 0.02
prop.table(table(test$Class))
   0    1 
0.98 0.02
Détection de la fraude en R

Choisir et entraîner un modèle de machine learning

  • Arbre de décision, réseau de neurones artificiels, machines à vecteurs de support, régression logistique, forêt aléatoire, Naive Bayes, k plus proches voisins, ...
  • Exemple : algorithme CART (Classification And Regression Tree)
  • Fonction rpart du paquet rpart
library(rpart)

model1 = rpart(Class ~ ., data = train)
Détection de la fraude en R
library(partykit)
plot(as.party(model1))

tree1

Détection de la fraude en R
## Prédire la probabilité de fraude pour l'ensemble de test
scores1 = predict(model1, newdata = test, type = "prob")[, 2]

## Prédire la classe (fraude ou non) de l'ensemble de test predicted_class1 = factor(ifelse(scores1 > 0.5, 1, 0))
## Matrice de confusion et exactitude library(caret) CM1 = confusionMatrix(data = predicted_class1, reference = test$Class)
          Reference         
Prediction     0     1
         0 12046    55
         1     8   191       Accuracy : 0.994878
library(pROC)
auc(roc(response = test$Class, predictor = scores1)) ## Area Under ROC Curve (AUC)
Area under the ROC curve: 0.8938
Détection de la fraude en R

Appliquer SMOTE à l'ensemble d'entraînement

library(smotefamily)
set.seed(123)

smote_result = SMOTE(X = train[, -17],
                     target = train$Class,
                     K = 5,
                     dup_size = 10)

train_oversampled = smote_result$data colnames(train_oversampled)[17] = "Class"
prop.table(table(train_oversampled$Class))
        0         1 
0.8166667 0.1833333
Détection de la fraude en R
library(rpart)
model2 = rpart(Class ~ ., data = train_oversampled)

tree2

Détection de la fraude en R
## Prédire la probabilité de fraude pour l'ensemble de test
scores2 = predict(model2, newdata = test, type = "prob")[, 2]

## Prédire la classe (fraude ou non) de l'ensemble de test predicted_class2 = factor(ifelse(scores2 > 0.5, 1, 0))
## Matrice de confusion et exactitude library(caret) CM2 = confusionMatrix(data = predicted_class2, reference = test$Class)
          Reference
Prediction     0     1
         0 11967    34
         1    87   212       Accuracy : 0.9901626                                
library(pROC)
auc(roc(response = test$Class, predictor = scores2)) ## Area Under ROC Curve (AUC)
Area under the curve: 0.9538
Détection de la fraude en R

Coût du déploiement d'un modèle de détection

  • Tenir compte des coûts de détection de fraude lors de l'évaluation d'un algorithme
  • Les coûts sont associés aux
    • erreurs de classification (faux positifs et faux négatifs) et
    • classifications correctes (vrais positifs et vrais négatifs)
Détection de la fraude en R

Matrice des coûts

cost_matrix_1

  • $y_i$ = classe réelle du cas $i$
  • $c_i$ = classe prédite pour le cas $i$
Détection de la fraude en R

Matrice des coûts

cost_matrix_2

  • $y_i$ = classe réelle du cas $i$
  • $c_i$ = classe prédite pour le cas $i$
Détection de la fraude en R

Matrice des coûts

cost_matrix_3

  • $C_a$ = coût d'analyse du cas
Détection de la fraude en R

Matrice des coûts

cost_matrix_4

  • $C_a$ = coût d'analyse du cas
Détection de la fraude en R

Mesure de coût pour un modèle de détection

  • Tenir compte des coûts réels de chaque cas : $$Cost(model)=\sum_{i=1}^{N}y_i(1-c_i)Amount_i + c_iC_a$$
    • $y_i$ = classe réelle du cas $i$
    • $c_i$ = classe prédite pour le cas $i$
cost_model = function(predicted.classes, true.classes, amounts, fixedcost) {

    cost = sum(true.classes * (1 - predicted.classes) * amounts +
               predicted.classes * fixedcost)

    return(cost)
}
Détection de la fraude en R

Vrai coût de la détection de fraude

## Coût total sans SMOTE :
cost_model(predicted_class1, test$Class, test$Amount, fixedcost = 10)
10061.8
## Coût total avec SMOTE :
cost_model(predicted_class2, test$Class, test$Amount, fixedcost = 10)
7431.93
  • Les pertes diminuent de 26 %!
Détection de la fraude en R

Passons à la pratique !

Détection de la fraude en R

Preparing Video For Download...