はじめに
機械学習の分類モデルを使うとき、クラスの不均衡は非常に厄介な問題です。
特にCatBoostのような勾配ブースティングモデルでは、多数派クラスに引きずられてしまい、少数クラスの検出性能が著しく低下することがあります。
この記事では、CatBoostを使った分類問題でクラス不均衡を扱う代表的な5つの方法をランキング形式で紹介します。すべて筆者自身の実験結果に基づいており、実践的な内容となっています。
🔥ランキング:CatBoostのクラス不均衡対処法ベスト5
🥇第1位:class_weightsパラメーターの活用(最も簡単で効果的!)
概要:
CatBoostClassifierのclass_weights
引数を使い、少数クラスに重みを持たせます。
実装例:
pythonコピーする編集するmodel = CatBoostClassifier(
iterations=1000,
learning_rate=0.05,
class_weights=[1, 10], # 例えばクラス0:1、クラス1:10の重み
eval_metric='F1',
verbose=100
)
おすすめ理由:
- ワンライナーで導入可能
- 精度指標(F1, AUC)の向上が明確
- 事前にクラス比率がわかっていれば設定が簡単
注意点:
- 重みの設定を誤ると過学習を招く可能性あり
F1
やPrecisionRecall
系の評価指標と一緒に使うのがベスト
🥈第2位:少数クラスのオーバーサンプリング(SMOTEなど)
概要:
データ前処理段階で、少数クラスを合成的に増やす手法です。
ライブラリ:
imbalanced-learn
のSMOTE
、ADASYN
など
おすすめ理由:
- 学習データに対して柔軟な調整が可能
- CatBoost以外のモデルとの併用にも強い
注意点:
- 時系列データでは使用できない
- 合成データが実態と乖離することもある
🥉第3位:多数クラスのアンダーサンプリング
概要:
多数クラスのデータを一部削除し、クラスバランスを整える手法です。
おすすめ理由:
- データサイズを減らせるので高速化にも有効
- 学習時間が短縮される
注意点:
- 情報量が減り、過学習を招く可能性
- 少数データでモデルを作ることになり、汎化性能に影響が出ることも
🏅第4位:評価指標をF1スコアやROC-AUCに変更する
概要:eval_metric
でAccuracy
以外の指標を設定し、学習中のモデル評価を変更します。
例:
pythonコピーする編集するmodel = CatBoostClassifier(
iterations=500,
eval_metric='F1',
class_weights=[1, 5],
verbose=100
)
おすすめ理由:
- モデルのチューニング方針を少数クラス寄りにできる
Accuracy
に惑わされない設計ができる
注意点:
- 評価指標を変えても学習データの偏り自体は変わらない
🏅第5位:カスタムメトリックでの最適化(上級者向け)
概要:
CatBoostのcustom_metric
で独自のメトリクスを定義し、目的に合わせて最適化を行う手法です。
おすすめ理由:
- 精密な業務要件に対応できる
- 損失関数ベースで戦略的に制御可能
注意点:
- Pythonでの関数設計が必要
- 実験や検証に時間がかかる
🧠補足:どれを選ぶべきか?
状況 | 推奨手法 |
---|---|
とにかく簡単に試したい | class_weights |
時系列じゃない | SMOTE などのオーバーサンプリング |
データ量が大きすぎる | アンダーサンプリング |
評価指標でだまされたくない | F1やAUCの明示的指定 |
高度なチューニングを行いたい | カスタムメトリクス設計 |
まとめ
CatBoostは優れた分類モデルですが、クラス不均衡のままでは本来の性能を引き出せません。
「class_weights」を起点に、必要に応じてデータ前処理や評価指標の見直しも検討してみましょう。
オンラインコミュニティ
こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。