Od zbioru danych do modelu wykrywania

Wykrywanie oszustw w R

Sebastiaan Höppner

PhD researcher in Data Science at KU Leuven

Plan działania

  • (1) Podział zbioru danych na zbiór treningowy i zbiór testowy
  • (2) Wybór modelu uczenia maszynowego
  • (3) Zastosowanie SMOTE na zbiorze treningowym w celu zbalansowania klas
  • (4) Trenowanie modelu na zrównoważonym zbiorze treningowym
  • (5) Testowanie wydajności na (oryginalnym) zbiorze testowym
Wykrywanie oszustw w R

Podział zbioru danych na zbiór treningowy i testowy

  • Podział zbioru danych na zbiór treningowy i zbiór testowy (np. 50/50, 75/25, ...)
  • Należy upewnić się, że oba zbiory mają identyczny rozkład klas (na początku)
  • Przykład: 50% zbiór treningowy i 50% zbiór testowy
prop.table(table(train$Class))
   0    1 
0.98 0.02
prop.table(table(test$Class))
   0    1 
0.98 0.02
Wykrywanie oszustw w R

Wybór i trenowanie modelu uczenia maszynowego

  • Drzewo decyzyjne, sztuczna sieć neuronowa, maszyny wektorów nośnych, regresja logistyczna, las losowy, naiwny klasyfikator Bayesa, k-najbliższych sąsiadów, ...
  • Przykład: algorytm Classification And Regression Tree (CART)
  • Funkcja rpart z pakietu rpart
library(rpart)

model1 = rpart(Class ~ ., data = train)
Wykrywanie oszustw w R
library(partykit)
plot(as.party(model1))

drzewo1

Wykrywanie oszustw w R
## Predict fraud probability of test set
scores1 = predict(model1, newdata = test, type = "prob")[, 2]

## Predict class (fraud or not) of test set predicted_class1 = factor(ifelse(scores1 > 0.5, 1, 0))
## Confusion matrix & accuracy, 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
Wykrywanie oszustw w R

Zastosowanie SMOTE na zbiorze treningowym

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
Wykrywanie oszustw w R
library(rpart)
model2 = rpart(Class ~ ., data = train_oversampled)

drzewo2

Wykrywanie oszustw w R
## Predict fraud probability of test set
scores2 = predict(model2, newdata = test, type = "prob")[, 2]

## Predict class (fraud or not) of test set predicted_class2 = factor(ifelse(scores2 > 0.5, 1, 0))
## Confusion matrix & accuracy 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
Wykrywanie oszustw w R

Koszt wdrożenia modelu wykrywania

  • Uwzględnienie różnych kosztów wykrywania oszustw przy ocenie algorytmu
  • Koszty są związane z:
    • błędami klasyfikacji (fałszywe pozytywy i fałszywe negatywy) oraz
    • poprawnymi klasyfikacjami (prawdziwe pozytywy i prawdziwe negatywy)
Wykrywanie oszustw w R

Macierz kosztów

macierz_kosztów_1

  • $y_i$ = prawdziwa klasa przypadku $i$
  • $c_i$ = przewidywana klasa przypadku $i$
Wykrywanie oszustw w R

Macierz kosztów

macierz_kosztów_2

  • $y_i$ = prawdziwa klasa przypadku $i$
  • $c_i$ = przewidywana klasa przypadku $i$
Wykrywanie oszustw w R

Macierz kosztów

macierz_kosztów_3

  • $C_a$ = koszt analizy przypadku
Wykrywanie oszustw w R

Macierz kosztów

macierz_kosztów_4

  • $C_a$ = koszt analizy przypadku
Wykrywanie oszustw w R

Miara kosztów modelu wykrywania

  • Uwzględnienie rzeczywistych kosztów każdego przypadku: $$Cost(model)=\sum_{i=1}^{N}y_i(1-c_i)Amount_i + c_iC_a$$
    • $y_i$ = prawdziwa klasa przypadku $i$
    • $c_i$ = przewidywana klasa przypadku $i$
cost_model = function(predicted.classes, true.classes, amounts, fixedcost) {

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

    return(cost)
}
Wykrywanie oszustw w R

Rzeczywisty koszt wykrywania oszustw

## Total cost without using SMOTE:
cost_model(predicted_class1, test$Class, test$Amount, fixedcost = 10)
10061.8
## Total cost when using SMOTE:
cost_model(predicted_class2, test$Class, test$Amount, fixedcost = 10)
7431.93
  • Straty zmniejszają się o 26%!
Wykrywanie oszustw w R

Czas na ćwiczenia!

Wykrywanie oszustw w R

Preparing Video For Download...