处理类别不平衡数据集

R 中的欺诈检测

Bart Baesens

Professor Data Science at KU Leuven

类别不平衡数据集

  • 关键难点:将事件标注为欺诈或非欺诈
    • 对分类方法与异常检测都是重大挑战
  • 分类器偏向多数类(= 非欺诈)
    • 对欺诈样本误差较大
  • 分类器从平衡分布中学得更好

草堆与针示意

R 中的欺诈检测

类别不平衡数据集

  • 关键难点:将事件标注为欺诈或非欺诈
    • 对分类方法与异常检测都是重大挑战
  • 分类器偏向多数类(= 非欺诈)
    • 对欺诈样本误差较大
  • 分类器从平衡分布中学得更好
  • 可行方案:用采样方法调整类别分布

草堆与针示意

R 中的欺诈检测

原始不平衡

原始不平衡柱状图

R 中的欺诈检测

对少数类过采样…

少数类过采样柱状图

R 中的欺诈检测

…或对多数类进行欠采样…

多数类欠采样柱状图

R 中的欺诈检测

…或两者兼用!

两者兼用柱状图

R 中的欺诈检测

采样后的结果…

采样后结果柱状图2

R 中的欺诈检测

…或如下所示

采样后结果柱状图1

R 中的欺诈检测

随机过采样(ROS)

原始数据示意

R 中的欺诈检测

原始数据划分示意

R 中的欺诈检测

随机过采样示意1

R 中的欺诈检测

随机过采样示意2

R 中的欺诈检测

随机过采样的实践

  • Kaggle 信用卡欺诈检测数据集
    • 约 30 万条匿名信用卡转账,标注为欺诈或正常
  • 关于数据…
    • 数值(匿名)变量:V1, V2, …, V28
    • Time:与数据集中首笔转账的秒数差
    • Amount:交易金额
    • Class:响应变量;欺诈为 1,否则为 0
R 中的欺诈检测

数据子集散点图

R 中的欺诈检测

检查不平衡程度

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
R 中的欺诈检测

ROSE 包的 ovun.sample

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
R 中的欺诈检测

过采样后散点图

R 中的欺诈检测

开始练习!

R 中的欺诈检测

Preparing Video For Download...