正例が極端に少ない不均衡データ。アンダー/オーバーサンプリングとSMOTEで対処します。
詐欺検知のデータセットって、99%が正常で1%が詐欺、みたいにめっちゃ偏ってるんだよね。
そうそう、不均衡データの典型例ね。 そのまま学習させると『全部正常』と予測するだけのモデルになりやすいのよ。
対策は大きく3つで、(1)アンダーサンプリングで多数クラスを減らす、(2)オーバーサンプリングで少数クラスを増やす、(3)クラス重みを調整する、が基本ですね。
from imblearn.under_sampling import RandomUnderSampler from imblearn.over_sampling import RandomOverSampler, SMOTE from sklearn.linear_model import LogisticRegression # X, y は元データ (yが極端に偏っているとする) # 元: y=0 が9900件、y=1 が100件 # (1) アンダーサンプリング rus = RandomUnderSampler(random_state=42) X_under, y_under = rus.fit_resample(X, y) # 多数クラスを少数に合わせて減らす → y=0が100件、y=1が100件 # (2) オーバーサンプリング(単純複製) ros = RandomOverSampler(random_state=42) X_over, y_over = ros.fit_resample(X, y) # 少数クラスを多数に合わせて複製 → y=0が9900件、y=1が9900件 # (3) SMOTE: 少数クラスを合成データで増やす smote = SMOTE(random_state=42) X_smote, y_smote = smote.fit_resample(X, y) # SMOTEは k-近傍を使って合成サンプルを生成 # (4) クラス重みで対処 (ライブラリ機能を使う) model = LogisticRegression(class_weight='balanced') model.fit(X, y)
SMOTEって、ただコピーするんじゃなくて、新しいデータを作っちゃうんですかぁ?
そう、SMOTE(Synthetic Minority Over-sampling Technique)は少数クラスのサンプル同士を線形補間して、合成サンプルを作るの。 単純複製より過学習しにくいんだよ。
で、結局どれを使えばいいの?
(1)データ量が十分あるならアンダーサンプリング、(2)少数クラスをそのまま増やすならROS、(3)合成で増やすならSMOTE、(4)サンプリングを使わず学習側で重みを調整するならclass_weight='balanced'ね。 それぞれトレードオフがあるから、複数試してみるのが定石ということね。
重要な注意点: サンプリングは{kw('訓練データのみ')}に適用すること。 テストデータには適用しない(本番分布と一致させる必要がある)。
リーク防止のためですねぇ♪
DS検定★では『不均衡データの問題』『SMOTEは合成データ生成』『サンプリングは訓練データのみ』が頻出。
確認クイズ
SMOTE(Synthetic Minority Over-sampling Technique)の特徴として正しいのはどれか。
- 多数クラスを削除する
- 少数クラスを単純に複製する
- 少数クラスを k近傍を使って線形補間で合成する
- 全データを正規化する
こたえを見る
正解: 3. 少数クラスを k近傍を使って線形補間で合成する
少数クラスをk近傍を使って線形補間で合成するのがSMOTEの特徴です。 単純複製より過学習しにくく、不均衡データ対策の定番手法です。