01.8.1
SMOTE
k_neighbors=5)を選び、その点と近傍を結ぶ線分上のランダムな位置に新しい点を合成して、少数派を多数派と同じ数まで増やす手法です。同じ点を複製する Random Over-sampling と違い、特徴空間を補間した点を足すので、決定境界が少数派の既存点を丸暗記する過学習を抑えられます。このページでは 95:5 の 2 クラス 2,000 件を imblearn.over_sampling.SMOTE で 1:1 に揃え、RandomForestClassifier の classification_report を SMOTE なし/ありで比べます。カテゴリ特徴量が混ざるデータでは SMOTENC を使います。直感 #
クレジットカード不正検知では、正常取引が 99%・不正が 1% というデータが典型的です。そのまま学習すると「全部正常」と予測するだけで正解率 99% になり、不正をまったく見つけられないモデルが「高精度」に見えてしまいます。SMOTE は少数派の各点について近い少数派の点を 5 個探し、そのどれかと結んだ線分上の適当な位置に新しい点を置く、という操作を少数派が多数派と同数になるまで繰り返します。少数派の点が密になるので、モデルは少数派の領域を「例外」ではなく「ひとつのクラス」として境界を引けるようになります。
何が起きているか(ステップで見る) #
コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。
見るポイント:新しい点は少数点どうしを結ぶ線分上に作る。コピーではないので境界が少し滑らかになる。6 点しかなかった少数クラス(橙)が、薄い橙の合成点で領域として広がる。
詳細な解説 #
ライブラリとデータ #
SMOTE は scikit-learn 本体には入っておらず、pip install imbalanced-learn で入る imblearn パッケージから読み込みます。
| |
不均衡データの作成 #
次のコードは多数派 95%・少数派 5% の 2,000 件を作り、クラス比を保ったまま訓練 7 割・テスト 3 割に分けます。
| |
SMOTE の適用 #
次のコードは訓練データだけに SMOTE をかけます。少数派 70 件が、多数派と同じ 1,330 件まで合成で増えます。
| |
効果の比較 #
次のコードは同じ設定の RandomForestClassifier を、元の訓練データと SMOTE 後の訓練データでそれぞれ学習し、同じテストデータで classification_report を比べます。
| |
SMOTE の派生手法 #
| 手法 | 特徴 | 使いどころ |
|---|---|---|
| SMOTE | k近傍の線分上に合成 | 基本手法 |
| Borderline-SMOTE | 境界付近のサンプルのみ補間 | 決定境界の改善 |
| ADASYN | 学習困難な領域を重点的に補間 | 密度適応 |
| SMOTENC | カテゴリ特徴量に対応 | 混合データ |
| SMOTE + Tomek Links | オーバーサンプリング + ノイズ除去 | クリーンな境界 |
注意点 #
SMOTE は訓練データにのみ適用し、テストデータには使いません。交差検証と組み合わせるときは imblearn.pipeline.Pipeline に SMOTE とモデルを入れると、各 fold の訓練側だけに合成が走り、検証側への漏れを防げます。特徴量が 10 を超えて多くなると、近傍距離がどの点でも似た値になる次元の呪いで、線分上の合成点が少数派の分布から外れやすくなります。RandomForestClassifier(class_weight="balanced") のようにモデル側で少数派の重みを上げる方法もあり、合成点を作りたくない場合の代替になります。
- Balanced Accuracy — 不均衡データに適した評価指標
- 適合率・再現率 — コスト非対称な評価
- Random Forest — class_weight でも不均衡に対応可能