Xử lý dữ liệu mất cân bằng

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

Bart Baesens

Professor Data Science at KU Leuven

Bộ dữ liệu mất cân bằng

  • Thách thức chính: gán nhãn giao dịch là gian lận hay không
    • Bài toán lớn cho phân loại & phát hiện bất thường
  • Bộ phân loại thiên về lớp đa số (= không gian lận)
    • lỗi phân loại lớn ở các ca gian lận
  • Mô hình học tốt hơn với phân phối cân bằng

đống rơm và cây kim_v2

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

Bộ dữ liệu mất cân bằng

  • Thách thức chính: gán nhãn giao dịch là gian lận hay không
    • Bài toán lớn cho phương pháp phân loại & kỹ thuật phát hiện bất thường
  • Bộ phân loại thiên về lớp đa số (= không gian lận)
    • lỗi phân loại lớn ở các ca gian lận
  • Mô hình học tốt hơn với phân phối cân bằng
  • Giải pháp khả dĩ: điều chỉnh phân phối lớp bằng các phương pháp sampling

đống rơm và cây kim_v1

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

Mất cân bằng ban đầu

class_barplot_orig.png

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

Over-sampling lớp thiểu số...

class_barplot_over

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

... hoặc under-sampling lớp đa số ...

biểu đồ cột lớp_under

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

... hoặc kết hợp cả hai!

biểu đồ cột lớp_both

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

Kết quả sau khi sampling...

kết quả biểu đồ cột lớp_2

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

... hoặc như thế này

kết quả biểu đồ cột lớp_1

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

Random over-sampling (ROS)

dữ liệu_gốc_v0

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

dữ liệu_gốc_train_test

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

random_oversampling_v0

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

random_oversampling_v1

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

Thực hành random over-sampling

  • Tập dữ liệu Phát hiện gian lận thẻ tín dụng trên Kaggle
    • ~300K giao dịch thẻ đã ẩn danh, gán nhãn gian lận hoặc hợp lệ
  • Về dữ liệu...
    • Biến số (đã ẩn danh): V1, V2, ... , V28
    • Time = số giây từ mỗi giao dịch đến giao dịch đầu tiên trong tập
    • Amount = số tiền giao dịch
    • Class = biến phản hồi: 1 nếu gian lận, 0 nếu không
Phát hiện gian lận với R

creditcard_V2vsV1

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

Kiểm tra mức mất cân bằng

head(creditcard)
  Time         V1         V2  ...            V27         V28 Amount Class
1    0  1.1918571  0.2661507  ...  -0.0089830991  0.01472417   2.69     0
2   10  0.3849782  0.6161095  ...   0.0424724419 -0.05433739   9.99     0
3   12 -0.7524170  0.3454854  ...  -0.1809975001  0.12939406  15.99     0
4   17  0.9624961  0.3284610  ...   0.0163706433 -0.01460533  34.09     0
5   34  0.2016859  0.4974832  ...   0.1427572469  0.21923761   9.99     0
prop.table(table(creditcard$Class))
   0    1 
0.98 0.02
Phát hiện gian lận với R

ovun.sample trong gói ROSE

n_legit <- 24108
new_frac_legit <- 0.50
new_n_total <- n_legit / new_frac_legit ## = 24108 / 0.50 = 48216

library(ROSE) oversampling_result <- ovun.sample(formula = Class ~ ., data = creditcard, method = "over", N = new_n_total, seed = 2018)
oversampled_credit <- oversampling_result$data prop.table(table(oversampled_credit$Class))
  0   1 
0.5 0.5
Phát hiện gian lận với R

creditcard_V2vsV1_oversampled

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...