不均衡データへの対処

Rで学ぶ不正検知

Bart Baesens

Professor Data Science at KU Leuven

不均衡データセット

  • 重要な課題: 事象を不正/非不正にラベル付け
    • 分類や異常検知での大きな課題
  • 分類器は多数クラス(= 非不正)を選びがち
    • 不正クラスで誤分類が大きい
  • 分類器はバランスの取れた分布から学習しやすい

干し草の山と針 v2

Rで学ぶ不正検知

不均衡データセット

  • 重要な課題: 事象を不正/非不正にラベル付け
    • 分類や異常検知での大きな課題
  • 分類器は多数クラス(= 非不正)を選びがち
    • 不正クラスで誤分類が大きい
  • 分類器はバランスの取れた分布から学習しやすい
  • 可能な解決策: サンプリングでクラス分布を変更

干し草の山と針 v1

Rで学ぶ不正検知

元の不均衡

元の不均衡の棒グラフ

Rで学ぶ不正検知

少数クラスをオーバーサンプリング…

少数クラスのオーバーサンプリングの棒グラフ

Rで学ぶ不正検知

…または多数クラスをアンダーサンプリング…

多数クラスのアンダーサンプリングの棒グラフ

Rで学ぶ不正検知

…または両方!

両方のサンプリングの棒グラフ

Rで学ぶ不正検知

サンプリング後の結果…

サンプリング後の結果の棒グラフ2

Rで学ぶ不正検知

…またはこのように

サンプリング後の結果の棒グラフ1

Rで学ぶ不正検知

ランダムオーバーサンプリング(ROS)

元データの散布図 v0

Rで学ぶ不正検知

学習・テスト分割後の元データ

Rで学ぶ不正検知

ランダムオーバーサンプリング v0

Rで学ぶ不正検知

ランダムオーバーサンプリング v1

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で学ぶ不正検知

Ayo berlatih!

Rで学ぶ不正検知

Preparing Video For Download...