Từ dữ liệu đến mô hình phát hiện

Phát hiện gian lận với R

Sebastiaan Höppner

PhD researcher in Data Science at KU Leuven

Lộ trình

  • (1) Chia bộ dữ liệu thành tập huấn luyệntập kiểm tra
  • (2) Chọn một mô hình học máy
  • (3) Áp dụng SMOTE trên tập huấn luyện để cân bằng phân bố lớp
  • (4) Huấn luyện mô hình trên tập đã cân bằng
  • (5) Đánh giá hiệu năng trên tập kiểm tra (gốc)
Phát hiện gian lận với R

Chia dữ liệu thành tập huấn luyện & kiểm tra

  • Chia dữ liệu thành tập huấn luyệntập kiểm tra (ví dụ 50/50, 75/25, ...)
  • Ban đầu, đảm bảo hai tập có phân bố lớp giống nhau
  • Ví dụ: 50% huấn luyện và 50% kiểm tra
prop.table(table(train$Class))
   0    1 
0.98 0.02
prop.table(table(test$Class))
   0    1 
0.98 0.02
Phát hiện gian lận với R

Chọn & huấn luyện mô hình học máy

  • Cây quyết định, mạng nơ-ron, SVM, hồi quy logistic, rừng ngẫu nhiên, Naive Bayes, k-NN, ...
  • Ví dụ: Thuật toán CART (Classification And Regression Tree)
  • Hàm rpart trong gói rpart
library(rpart)

model1 = rpart(Class ~ ., data = train)
Phát hiện gian lận với R
library(partykit)
plot(as.party(model1))

cây1

Phát hiện gian lận với R
## Dự đoán xác suất gian lận cho tập kiểm tra
scores1 = predict(model1, newdata = test, type = "prob")[, 2]

## Dự đoán lớp (gian lận/không) cho tập kiểm tra predicted_class1 = factor(ifelse(scores1 > 0.5, 1, 0))
## Ma trận nhầm lẫn & độ chính xác, 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)) ## Diện tích dưới đường cong ROC (AUC)
Area under the ROC curve: 0.8938
Phát hiện gian lận với R

Áp dụng SMOTE cho tập huấn luyện

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
Phát hiện gian lận với R
library(rpart)
model2 = rpart(Class ~ ., data = train_oversampled)

tree2

Phát hiện gian lận với R
## Dự đoán xác suất gian lận cho tập kiểm tra
scores2 = predict(model2, newdata = test, type = "prob")[, 2]

## Dự đoán lớp (gian lận/không) cho tập kiểm tra predicted_class2 = factor(ifelse(scores2 > 0.5, 1, 0))
## Ma trận nhầm lẫn & độ chính xác 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)) ## Diện tích dưới đường cong ROC (AUC)
Area under the curve: 0.9538
Phát hiện gian lận với R

Chi phí triển khai mô hình phát hiện

  • Tính đến các chi phí phát hiện gian lận khi đánh giá thuật toán
  • Chi phí gắn với
    • lỗi phân loại (dương/âm giả) và
    • phân loại đúng (dương thật/âm thật)
Phát hiện gian lận với R

Ma trận chi phí

ma trận chi phí 1

  • $y_i$ = lớp thực của quan sát $i$
  • $c_i$ = lớp dự đoán cho quan sát $i$
Phát hiện gian lận với R

Ma trận chi phí

ma trận chi phí 2

  • $y_i$ = lớp thực của quan sát $i$
  • $c_i$ = lớp dự đoán cho quan sát $i$
Phát hiện gian lận với R

Ma trận chi phí

ma trận chi phí 3

  • $C_a$ = chi phí phân tích hồ sơ
Phát hiện gian lận với R

Ma trận chi phí

ma trận chi phí 4

  • $C_a$ = chi phí phân tích hồ sơ
Phát hiện gian lận với R

Thước đo chi phí cho mô hình phát hiện

  • Tính tới chi phí thực tế cho từng hồ sơ: $$Cost(model)=\sum_{i=1}^{N}y_i(1-c_i)Amount_i + c_iC_a$$
    • $y_i$ = lớp thực của quan sát $i$
    • $c_i$ = lớp dự đoán cho quan sát $i$
cost_model = function(predicted.classes, true.classes, amounts, fixedcost) {

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

    return(cost)
}
Phát hiện gian lận với R

Chi phí thực của phát hiện gian lận

## Tổng chi phí khi không dùng SMOTE:
cost_model(predicted_class1, test$Class, test$Amount, fixedcost = 10)
10061.8
## Tổng chi phí khi dùng SMOTE:
cost_model(predicted_class2, test$Class, test$Amount, fixedcost = 10)
7431.93
  • Tổn thất giảm 26%!
Phát hiện gian lận với R

Ayo berlatih!

Phát hiện gian lận với R

Preparing Video For Download...