新はてブ正式リリース記念ということで。もうリリースから何週間も経っちゃったけど。

新はてなブックマークではブックマークエントリをカテゴリへと自動で分類しているが、このカテゴリ分類に使われているアルゴリズムはComplement Naive Bayesらしい。今日はこのアルゴリズムについて紹介してみる。

Complement Naive Bayesは2003年のICMLでJ. Rennieらが提案した手法である。ICMLというのは、機械学習に関する（たぶん）最難関の学会で、採択率はここ数年は30%を切っている。2003は119/371で、32.1%の採択率だったようだ。

Complement Naive Bayesの位置づけは

実装が簡単

学習時間が短い

性能もそこそこよい

という感じで、2003年段階にあっても、絶対的な性能ではSVMに負けていた。しかし、学習が早いというのは実アプリケーションでは非常に重要で、SVMは昔の実装だと学習にかなり時間がかかる。というか、データが大規模になってくると、場合によっては使えない。私も前職でデータを作ってたときに、SVMではデータを増やしていくと学習時間が平気で数時間とかになって、焦ったことがある。

いきなりComplement Naive Bayesを説明してもたぶんわけがわからないと思うので、まずNaive Bayesを説明し、それからComplement Naive BayesがNaive Bayesとどう違うのかを説明したい。最初は真面目に全部説明しようと思ったんだけど、まじめに説明するとどうしてもベイズの定理とかを出さざるを得ないしわかりにくいので、今回は妥協して少し不正確な説明にしてしまった。もっと正確な情報を知りたい人は、教科書を読むかおうちの人に質問してね。もしくは朱鷺の杜Wikiの単純ベイズの項を参照してね。

Naive Bayesでは（というか、ほぼ全ての機械学習アルゴリズムでは）、処理は学習とテストの2つのフェーズに分けられる。この場合、学習というのは、あらかじめカテゴリ分けされたデータを使って下準備を行うフェーズで、テストというのは(カテゴリが)未知の文書に対してカテゴリを推定するフェーズである。

Naive Bayesの学習フェーズ 学習のフェーズでは、カテゴリ毎にあらかじめ文書を用意しておき、それを使ってカテゴリ毎に単語の出現確率を学習しておく。出現確率、と書くとなんだかぎょうぎょうしいけど、実際のところ、全体中でその単語が何回出現したか、その割合を記録しておくだけでよい。たとえば、カテゴリ「社会」に全部で150個の単語があった場合に、そのうち3回が「社長」という単語だったとしよう。この場合、「社長」という単語の出現確率は3 ÷ 150 × 100 = 2%となる。（学習データに含まれない単語の事を考慮したりするともっと複雑になるけど、そこは今回は省略する。）

Naive Bayesのテストフェーズ テストフェーズではカテゴリを推定したい文書に対して、それぞれのカテゴリでの単語の出現確率を使って、文書の出現確率を計算する。もっとも出現確率が高いカテゴリを、分類結果として返す。文書の出現確率だなんて抽象的なものは正しく求めようがないので、文章中の単語の出現確率の積で近似する。

例として、「私は社長」という文章がカテゴリ「社会」とカテゴリ「おもしろ」のどちらに分類されるかを考える。この文章が「私/は/社長」の3つの単語に区切られたとし、カテゴリ「社会」でのそれぞれの単語の出現率が1%, 5%, 2%で、カテゴリ「おもしろ」でのそれぞれの単語の出現率が1%, 4%, 3%だったとしよう。すると、「私は社長」の出現確率は、カテゴリ「社会」では 0.01×0.05×0.02×100=0.001% となる。また、カテゴリ「おもしろ」では 0.01×0.04×0.03×100=0.0012% となる。0.001と0.0012を比べ、「おもしろ」での数値の方が大きいことが分かる。このため、「私は社長」はカテゴリ「おもしろ」に分類される事になる。