02.2.11
【ベンチマーク】極端な不均衡データの分類
class_weight="balanced" を指定するだけで LogisticRegression と RandomForestClassifier の少数クラス検出が大きく改善し、追加パッケージなしで SMOTE と同等以上の効果を得られることが多いと分かります。読み終えると、「Accuracy 98 %」という数字を見た瞬間にクラス比率と混同行列を確認する習慣がつきます。不正検知・故障予測・希少疾患の診断など、「見つけたいクラスが圧倒的に少ない」問題は実務で頻出する。多数クラスを全部正解すればAccuracy 98%が出るため、Accuracyだけでは判断を誤る。ここでは不均衡データに特化した対策と評価指標の選び方を検証する。
1. データの特徴 #
n=5000 の 2 クラス分類で、多数クラスが 98 %、少数クラスが 2 %(100 サンプル)です。特徴量は 10 個で、うち 5 個がクラスを分ける情報を持ちます。「全部を多数クラスと答える」だけで Accuracy が 0.98 になるので、焦点は 100 件の少数クラスをどれだけ正しく検出できるかに置きます。
何が起きているか(ステップで見る) #
コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。
見るポイント:新しい点は少数点どうしを結ぶ線分上に作る。コピーではないので境界が少し滑らかになる。
2. 合成データの生成 #
次のコードは make_classification の weights=[0.98, 0.02] で不均衡データを作り、クラス数の棒グラフ、上位 2 特徴量の散布図、最重要特徴量の分布の 3 枚で「少数クラスがどこに埋もれているか」を見ます。
| |

3. 比較するパイプライン #
| 対策 | 分類器 |
|---|---|
| なし(デフォルト) | Logistic, SVM, KNN, RandomForest, GradientBoosting |
| class_weight=“balanced” | Logistic, SVM, RandomForest |
| ランダムオーバーサンプリング | Logistic, SVM, KNN, RandomForest, GradientBoosting |
| ランダムアンダーサンプリング | Logistic, SVM, KNN, RandomForest, GradientBoosting |
4. 実験と結果 #
次のコードは、対策なしの 5 モデルと class_weight="balanced" の 3 モデルを同じ 5 分割で交差検証し、Accuracy・F1・MCC の 3 枚のヒートマップに並べます。3 枚を横に並べることで、「Accuracy では差がないのに F1 と MCC では差が出る」ことを一目で比べられます。
| |

読み方のポイント #
Accuracy は全モデルで 0.97〜0.99 に張り付いており、モデル間の差がほとんど見えません。F1 や MCC で見ると、class_weight="balanced" を指定しただけで LogisticRegression と RandomForestClassifier の少数クラス検出が大幅に改善します。KNeighborsClassifier は不均衡に弱く、近傍 5 点のほとんどが多数クラスで占められるため、少数クラスの票が多数決で埋もれます。
5. 誤差パターン分析 #
対策なしの Logistic、balanced の Logistic、balanced の RandomForest を同じ 70/30 分割で学習し、混同行列で「少数クラス 30 件のうち何件を見つけられたか」を比べます。
| |

デフォルトの Logistic は少数クラスをほぼ見逃す(False Negative 多)。class_weight="balanced" を指定すると少数クラスの再現率が上がり、多少の False Positive と引き換えに F1 が大幅に改善する。
6. よくある失敗パターン #
最初の失敗は、Accuracy だけで評価することです。多数クラスを全部正解するだけで 98 % に到達するため、モデルの実力が見えません。F1、PR-AUC、MCC を必ず確認してください。二つ目は、テストデータもリサンプリングすることです。オーバーサンプリングは学習データにのみ適用し、テストデータの分布を 98 対 2 のまま残さないと、本番で出会う比率と違う条件で評価することになり結果が歪みます。
まとめ #
少数クラスが 2 % のデータでは、Accuracy は全モデルで 0.98 前後に張り付き、F1 と MCC だけがモデルの差を映しました。class_weight="balanced" は少数クラス 1 件の損失を約 49 倍に重くするだけの指定ですが、LogisticRegression と RandomForestClassifier の少数クラス検出を大きく改善し、追加パッケージなしで SMOTE と同等以上の効果を出すことが多いです。KNeighborsClassifier は近傍の多数決が多数クラスに流されるため不均衡に弱く、class_weight も持ちません。評価では StratifiedKFold と stratify=y で少数クラスを均等に配り、リサンプリングは学習データだけに適用してください。