[機械学習] データのクラス分布に偏りがある場合の手法

 異常検出でほとんど正常系だったり、特定のクラスだけほとんど出てこないということ、結構あると思います。

 そのようなデータの偏りに対する対処法を紹介します。

アンダーサンプリング


 少ないクラスのデータ数に近づけるように、多いクラスのデータを切り捨てるという手法です。

 例えば異常検出の異常が少ない場合、異常データと正常系の一部のみを使ってモデルを学習させる方法です。 

 少ないデータのクラスに他のクラスのデータ数を合わせるようなイメージです。

 「データ減ったら精度落ちるのでは?」と思うかもしれませんが、場合によりますがそこまで精度は落ちません。データ数削減のため計算効率が上がり、捨てるデータもアンサンブル学習と合わせることで有効利用ができ精度の上昇が期待できます。

 また、特徴量作成についてはアンダーサンプリングせずすべてのデータを使用するのが一般的に良いとされています。

オーバーサンプリング


 アンダーサンプリングの逆で、多いクラスのデータ数に合わせるように、少ないクラスのデータを複製して増やすアプローチです。

 DCGANなどで水増ししたデータを追加すると精度が上がったなどの例があります。

クラスごとに重みづけを行う


 少ないクラスのデータに対しては学習時に重みを上げる、Loss算出時に少ないクラスのLossが大きくなるように重みづけするといった方法です。

 ライブラリの機能で設定できることもありますが、そうでない場合実装が困難の場合があります。

 scikit-learnの決定木系アルゴリズムは標準で重みづけができるようです。

モデル・パラメータの調整


 クラスの偏りにも頑強なモデルを使用する、分類時の閾値を調整するなどの方法です。

 なかなかそのようなモデルもなく、閾値調整もシビアなので難しいアプローチかもしれません。

コメントを残す

メールアドレスが公開されることはありません。