盆暗の学習記録

データサイエンス ,エンジニアリング,ビジネスについて日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

NGBoostの理論のまとめ

NGBoost: Natural Gradient Boosting for Probabilistic Predictionの論文を読んだのでメモしておきます。

ざっくり要約すると以下のような感じでした。

  • NGBoostは予測を点ではなく分布で予測するための機械学習アルゴリズム
  • 勾配ブースティングの枠組みで最尤推定する
  • 最適化にはニュートン法を改良したフィッシャーのスコア法をベースにしており、指数分布族以外の分布や特殊なパラメータを仮定する指数分布族でも使えるよう一般化している
  • 予測を点で推定した場合の精度はRandom Forestに匹敵するが通常の勾配ブースティングに劣るくらい

もう少し詳しい話は以下に述べていきます。

理論の概要

私の考察を交えつつ、NGBoostの理論の概要を述べます。

解きたいタスク

機械学習を使うタスクでは、予測の不確実性が評価できると嬉しい場合が結構あります。

例えば「この予測対象については訓練データにも類似する事例がないので、この予測値の信頼性は低いです」みたいな情報を予測器が述べてくれると、その予測結果を使う人間にとって便利だったりします。

そこで、予測を点ではなく分布で行いたいとします。

NGBoostでは扱う分布をパラメータで規定される分布のみに限定することで分布の推定問題をパラメータの推定問題へ緩和します。例えば予測分布が正規分布であると仮定する場合、平均μと分散σの2つのパラメータの推定問題になります。

ただし、このパラメータはxの関数です。通常の勾配ブースティングで誤差関数がMSEのときはxの条件付き平均E[y|x]を推定するわけですが、NGBoostではそれに加えてxの条件付き分散も求める、という感じです。

スコア関数

パラメータ推定のためには通常の機械学習アルゴリズムの誤差関数に相当するものを定義する必要があります。

ただし、今回は分布を推定したいので、真の分布との距離を測れるような関数を定義する必要があります。

具体的には対数尤度関数や、尤度を拡張したCRPSという関数がスコア関数にあたります。

自然勾配

勾配はパラメータを微小に変化させたときに目的関数を最も変化させる方向です。しかし、本当は分布を微小に変化させたときの目的関数を最も変化させる方向が知りたいため、NGBoostでは勾配をより一般化した自然勾配を使います。

自然勾配(natural gradient)はリーマン計量の逆行列を勾配に乗じたものです。

f:id:nigimitama:20210529145206p:plain

スコア関数が対数尤度の場合、このリーマン計量はフィッシャー情報行列(符号を反転させたヘッセ行列の期待値をとったもの)になります。

つまり、最尤推定法におけるフィッシャーのスコア法(Fisher's scoring method)に相当することを勾配ブースティングでやっているのだと思われます

ニュートン法との違い

フィッシャーのスコア法を使うメリットはなんなのか?という点について、NGBoostの論文では

確率分布が指数分布族のものであり、分布のパラメータ化をその族の自然なパラメータで行うとき、Newton-Raphson stepはnatural gradient descent stepと等しい。

という感じのことが書かれております。

NGBoostは一般化のために自然勾配を使っていますが、逆に言うと、指数分布族の分布で通常のパラメータを使うのであればニュートン法で十分なのかなと思います。

例えばXGBoostやLightGBMはニュートン法による勾配ブースティングを行っているはずなので、それらのアルゴリズムでも誤差関数を尤度関数にすればNGBoostと同じような結果が得られて分布での予測ができそうな感じがします。

実用に関する考察

NGBoostは通常の機械学習のように点推定で結果を出した場合の予測精度がscikit-learnの勾配ブースティングの実装にも劣るようなので、使用上はそこがネックになりそうな感じがします。「多少精度を落としてでも予測の不確実性が評価できるような予測を行いたい」というニーズがある状況では活きるかもしれません。

NGBoostはライブラリが公開されているのですが、XGBoostのように正則化をしたりといった精度向上のための細かなパラメータ調整ができなかったり、LightGBMのような計算の高速化がなくて大規模データへの対応がしにくかったりする欠点があります。これらの点については先述のようにLightGBMを使って最尤推定することで解決できるかもしれません。

参考

詳しい理論の解説はこちらのブログがわかりやすいかと思います。

NGBoostを読んで、実装する。 - nykergoto’s blog