不均衡データ対応(SMOTE)

正例が極端に少ない不均衡データへの3つの対処法。SMOTEの仕組みを実コードで学びます。

正例が極端に少ない不均衡データ。アンダー/オーバーサンプリングと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)の特徴として正しいのはどれか。

  1. 多数クラスを削除する
  2. 少数クラスを単純に複製する
  3. 少数クラスを k近傍を使って線形補間で合成する
  4. 全データを正規化する
こたえを見る

正解: 3. 少数クラスを k近傍を使って線形補間で合成する

少数クラスをk近傍を使って線形補間で合成するのがSMOTEの特徴です。 単純複製より過学習しにくく、不均衡データ対策の定番手法です。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。