読者です 読者をやめる 読者になる 読者になる

勾配ブースティング落穂拾い - マルチクラス分類について

機械学習 XGBoost

勾配ブースティングに特有の問題という訳ではないですが、それはマルチクラス分類をone-vs-allで解いていることに留意しましょうというのが今回の記事です。

マルチクラス分類について

ここではマルチクラス分類の問題を対象に、アンサンブル学習として代表的なランダムフォレストと勾配ブースティングとを比較します。

ランダムフォレスト

ランダムフォレストによるマルチクラス分類では学習器に分類木を用いています。 scikit-learnではDecisionTreeClassifierです。

コード

分類木はマルチクラスを自然に扱えるので、n_estimatorsと同じ数だけ木を作れば求めるモデルが構築できます。

勾配ブースティング

勾配ブースティングでは弱学習器に回帰木を用いているので事情が変わってきます。 マルチアウトプットの回帰木は一般的ではありませんので、問題をone-vs-allに変換して解くことになります。 そのため勾配ブースティングでは指定したn_estimatorsとクラス数の積の数だけ木を作る必要があります。

コード

勾配ブースティングは速度と精度を高いレベルで両立していますが、マルチクラス分類では

  • クラス数と比例して計算時間が増加する
  • Dark knowledge的なものを利用できない

という欠点が出てくるので、勾配ブースティングのメリットがスポイルされていないか留意する必要がありそうです。

数値例

勾配ブースティング(というかone-vs-all)が苦手そうな例を考えてみました。 セルの中は(クラスAの割合, クラスBの割合)を示しています。

sex/height
(5%, 10%) (15%, 10%) (20%, 20%)
(15%, 15%) (5%, 15%) (20%, 30%)
(20%, 25%) (20%, 25%)

この例にone-vs-allを使うと、クラスBについてsexで分割する以上のものが出てきません。 一方で分類木を使った場合は、クラスBについてsexで分割した後でクラスAの濃い部分を抽出するheightでの分割を発見できます。

マルチクラス分類をXGBoostのみで取組むのは微妙な感じがしますね。 あまり業務でスタッキングしたくないのですが、それも避けられないように思われます。 もしくはDeep Learningするか。

参考

ブースティングやDeep Learningが一般化した時代におけるマルチクラス分類の解き方についてはOtto Group Product Classification ChallengeのForumで盛んな議論があったようです。 実戦的なテクニックも数多いようなので、関心のあるかたはそちらで調査されるのが良いと思われます。