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

毒キノコかどうかを分類する

機械学習の分類問題の基本的な考え方を理解する上で、「毒キノコ」の問題が分かりやすいため紹介したい。

非常に単純な問題で、下記のような8種類のキノコの情報が分かっている際に、9番目のキノコは毒キノコであるか、そうでないかを見分けるものだ。判断する上での手がかりの情報を素性とよび、ここでは色、笠の形、柄の長さ、発見場所の4種類である。

これは言い換えると、あるキノコはこのような素性の束(素性ベクトル)で表現されるということである。また、毒キノコかそうでないかという事例を既に知っているが、これはいわゆる教師データと呼ばれるものだ。

このような教師データを用いて新たな未知のキノコを毒があるかないか分類する方策(分類器)を学習する。単にこの計算式のみ示しても面白くないためその背景を簡単に説明したい。

f:id:IPQuest:20160620183154p:plain

言語モデル

言語モデルとは、文や表現が使われる確からしさを与えるものである。特に、後述するn-gram言語モデルが一般的にイメージされるだろう。これは、n-1語を文脈として次の語を予測するというものである。例えば、「私は本を買った」という一文を「私/は/本/を/買った」と形態素解析を行い、「私」が文頭に現れる確率、「私」の後に「は」が出てくる確率、、、を求めて全体として「私は本を買った」という一文が生成される確率を求める、という考え方である。

マルコフモデル

言語モデルを考える準備として、マルコフモデルを頭に入れておきたい。

よくある例として、天気予報の問題がある。天気は一日単位で晴れ、曇り、雨のいずれかであり、過去の天気から明日の天気の確率を予想する。例えば、今日が曇りの時、明日が晴れである確率は、条件付き確率として次のように表す。

P( xt+1 = 晴れ | xt = 曇り)

ここで、xt+1、xtはそれぞれ今日と明日の天気を表す確率変数で、その値は晴れ、曇り、雨のいずれかである。明日の天気を予測するには過去のある程度の長い期間を考慮する方が正確だろうが、これを過去m日にしか依存しないと考えることにする。このようなモデルをm階マルコフモデルと呼び、上記は1階マルコフモデルで考えたものである。なお、通常の表記は確率変数が省略され、P(晴れ|曇り)と表される。

仮に1年間の毎日の天気データがあれば、最尤推定によって、以下のように計算できる。

P(晴れ|曇り)=C(曇り,晴れ)/C(曇り)

ここで、 C(曇り,晴れ)、C(曇り)はそれぞれ、「曇り、晴れ」、「曇り」が1年間に出現した数とする。例えば、曇りの天気が100回、曇りの次に晴れが出現した回数が20回とすると、P(晴れ|曇り)=20/100=0.2となる。

 n-gram言語モデル

上記の天気予報は、実は言語の並びについても適応できる。これをn-gram言語モデルという。

このモデルでは、単語の出現確率がその直前のn-1個の単語で決まる。上記の前日が曇りの場合に次の日が晴れである確率を求める方法と似ている。

例えば、直前の1単語のみを考慮する場合の確率は次の通りである。

P( wi | wi-1 ) = C( wi-1 , wi ) / C( wi-1 )

例えば、この言語モデルでは、K個の単語、w1からwkからなる文の出現確率は次のように求められる。

P( w1.....wk ) = Π P( wi | wi-1 ) 

 

では、先ほどの「私は本を買った」という文例を見てみよう。この出現確率を計算すると、次のような式になる。

P(私は本を買った) = P(私|文頭)×P(は|私)×P(本|は)×P(を|本)P(買った|本)

具体的な計算には触れないが、この中で「私」の次の「は」が出現する確率、「を」の次に他動詞「買う」が現れる確率などは相応に高いと考えられており、このようにして求まる一文の出現確率は自然な日本語文として妥当な値を持つことになる。

毒キノコ問題

さて、上記の自然言語処理の問題を毒キノコ問題に応用してみたい。ここでの問題は、2値の分類問題であり、ある条件xが与えられた際に、最も確率が高いラベルyに分類する、ということを考える。

y=arg max P (y | x)

これは、ナイーブベイズという手法であり、一般には十分高い精度を得る確率分類手法である。

 で、これをどう処理したらよいのだろう。このままでは、見たことのない素性ベクトルを分類できないため、ベイズの定理を利用してarg maxに関係しないP(x)を除去し、さらにラベルに対して各素性xiが独立であると近似して式変形を行う。

y=arg max P (y | x)

 

  =arg max P (x | y)P(y) / P (x)

  =arg max P (x | y)P(y)

  =arg max Π P (xi | y)P(y)

この式を、下記9番目のキノコに当てはめてみよう。

f:id:IPQuest:20160620183154p:plain

P(黄|有)P(丸|有)P(短|有)P(地|有)P(有)=2/3 * 1/3 * 2/3 * 2/3 * 3/8 = 3.7%

では、毒無しの方はどうだろうか。

P(黄|無)P(丸|無)P(短|無)P(地|無)P(無)=1/3 * 2/3 * 1/3 * 1/3 * 5/8 = 1.5%

 

つまり、この条件では毒有と分類されることになる。

上記のような考え方を言語処理に用いる場合は、単語そのものやその1文字目が大文字かどうか、前後でどのような単語があるか、などを素性として用いることになる。

参考:自然言語処理(黒橋禎夫)