Lこんにちは、ぐぐりら(@guglilac)です。ナイーブベイズは自然言語処理の分類タスクで、実装がシンプルで高速でそれなりに精度が出るということで、はじめに試すモデルだよという方も多いかも知れません。learnにも実装があるので、サクッと試せて便利ですが、もう少し時間がかかってもいいので精度が欲しい!となった場合にナイーブベイズではどうするのが良いのでしょうか。ナイーブベイズについてあまり詳しくなかったので、調べてみたところ、いくつか亜種があるそうです。Estimators)について興味を持ったので、論文を読みつつ実装し、軽く実験もしてみました。ここで説明されているので、詳しくはこちらを参照していただきたいです。ナイーブベイズ(NB)はその名の通りナイーブ、つまりクラスを条件付けた時の文章生成の確率を単語の生成確率の積に分解できるという単純な仮定を置いています。本当は、単語同士は独立ではないはずなので、その仮定の部分を緩めて性能を向上させよう、というアイデアがAODEの元となっています。AODEのAはaveragedで、実際はこの$x_k$として「$m$個以上の文章に含まれている単語」すべてに対して上のスコアを計算して平均して、一番高いクラスと予測するという流れです。通常のNBでは$P(x_i|y)$をどのような分布でモデリングするかに自由度があり、有名なものにベルヌーイ分布や多項分布を使ったものがあります。learnにも実装がありますね。ベルヌーイ分布を仮定しているようで、$x_i$の値自体は使っていなさそうでした。なり、$P(x_i,x_k|y)$の部分をどうモデリングすればいいかわからず断念しました。P(x_i|y)P(x_k|y)$としてしまうとNBと同じなので分解できず。元の論文では$x_i$と$x_k$が両方含まれている文章の個数を全体で割る、みたいなことをしている(もちろんスムージングはしている)ので$x_ix_k$がベルヌーイ分布に従うとして推定していると考えられます。この辺りの問題について取り組まれた研究とかあるんでしょうか。いうわけで、ベルヌーイ分布を仮定して、2値分類のAODEを実装しました。この記事の実装を参考にしましたが、一部論文の方を参照して修正して試しています。ラプラススムージングや対数とるところなども気をつけて実装しています。ラベルが0,1のデータに絞って用いました。テストデータでAccuracyを算出しました。ベルヌーイよりは改善していますが、MNBには負けてしまっています。同じモデリングをしているベルヌーイNBよりは改善しているので、ひとまず効果はありそうです。NBのあやふやだった部分も含めて復習して、論文も読んで再現したので勉強になりました。ラプラススムージングについてあまり良くわかっていなかったのですが、上の記事ですっきり理解できたので良かったです。NBは他にも改良版があるみたいなので、調べてみようと思います。ありがとうございました。Blogger.ぐぐりらにっきQooQ。