Hatena::ブログ(Diary)

EchizenBlog-Zwei このページをアンテナに追加 RSSフィード

2011-01-14

機械学習超入門 〜そろそろナイーブベイズについてひとこと言っておくか〜

最近では機械学習の認知度も上がってきていて専門家でなくてもナイーブベイズSVMなどの名前を知っている人も増えてきたように思う。

そんなわけでちょっと機械学習をはじめてみようかな、と思っている人も多いのではないだろうか。とはいえ「数式よくわからない」「確率嫌い」といった理由で尻込みしているケースも多いのでは。

そこで予備知識ゼロでもわかるような機械学習の入門記事を書いてみたよ。


機械学習を「作りたい」のか「使いたいのか」

まず最初に確認したいのがこれ。使いたいだけならまずはSVMを使ってみれば良い。世の中にはlibsvmやsvmlightという良いツールがあるのでそれを使おう。以下の記事は機械学習を「作りたい」「仕組みを知りたい」人向けの内容になっている。

「最も簡単な機械学習はナイーブベイズ」という幻想

機械学習といえばナイーブベイズという話がよくある。ナイーブ(単純)という名前からいかにも簡単そうだけれど実はそんなに簡単でもない。ナイーブベイズは確率モデルなので確率を勉強しないといけない。具体的には

- ベイズの法則
- 事前確率
- 事後確率
- 尤度関数
- スムージング

などを理解する必要がある。これは大変。が、実は機械学習は確率を知らなくても大丈夫なことも多い。なので確率を知らないと話にならないナイーブベイズは忘れてしまおう。

じゃあ何がイケてるの?

ナイーブベイズが駄目なんだったら何を勉強すればいいの?という話。実は機械学習には大雑把に言って識別関数、識別モデル、生成モデルという3種類ある。これらには

[単純]                     [複雑]
識別関数 < 識別モデル < 生成モデル

という関係がある。それぞれ種類の代表的なアルゴリズムを挙げてみると

識別関数  : SVM
識別モデル: CRF
生成モデル: ナイーブベイズ

となっている。というわけで最も単純な識別関数を最初に学ぶのが良い。ついでに識別関数の初歩を学ぶとSVMの基礎が身につくので一石二鳥ともいえる。

そもそも機械学習は何をするものか

先ほど識別関数が最も単純な機械学習だと言った。すると単純なもので大丈夫か。どうせなら一番良いものを学びたい、という向きがあるかもしれない。そこで機械学習のそもそもの目的に立ち返りたい。機械学習でできることは色々あるが、一般的には識別(classification)を目的とする場合が多い。識別ができるとスパム判定や自動タグ付け、レコメンドエンジンなどが作れる。そして識別をするだけなら識別関数で充分ということ。識別能力で生成モデルが識別関数よりも優れているというわけではない。

最も単純な識別関数を学ぶ

本題はここ。最も単純な識別関数は線形識別器と呼ばれるもので、今回はこれを説明する。メールのスパム判定を例に説明する。以下に示すような5通のメールがあったとする。先頭に×が付いているのがスパムで、○が付いているのが非スパム

×  1: 特別価格☆今月だけ50%OFF
○  2: 【勤怠】明日休みます。
○  3: 給与振込について
×  4: 特別セール!全品30%OFF
○  5: 特別賞与振込について

ここから識別に使えそうな情報を取り出す。今回は単純に名詞を取り出してみる。

×  1: 特別, 価格, 今月, 50%, OFF
○  2: 勤怠, 明日
○  3: 給与, 振込
×  4: 特別, セール, 全品, 30%, OFF
○  5: 特別, 賞与, 振込

このように識別に使う情報の事を素性(そせい, feature)という。各素性には重みを与える。機械学習は与えられたデータ(今回はメール)を使って、新しいデータを上手く識別できるような重みを学習する。どのような重みの学習をするか、という部分が機械学習の肝となる。最も単純な学習方法は頻度(出現回数)を集計すること。なのでスパムと非スパムで素性の出現回数を集計する。

×  1: 特別:2, 価格:1, 今月:1, 50%:1, OFF:2, セール:1, 全品:1, 30%:1
○  2: 勤怠:1, 明日:1, 給与:1, 振込:2, 特別:1, 賞与:1

これが学習されたモデル。各素性に対して出現数を重みとして学習した。新しいメールが来た場合にこの学習結果を使ってスパムかどうかを識別する。

?  6: 【勤怠】今月から勤怠報告を変更します。明日から実行してください。

新しいデータ(メール)に対しても素性を取り出す。

?  6: 勤怠:2, 今月:1, 報告:1, 変更:1, 明日:1, 実行:1

そして学習されたモデルの対応する素性の重みとかけ合わせてスコアを計算する。

[スパム(×)のスコア]
     モデル   新データ
今月      1 ×       1 = 1
==========================
合計                     1

[非スパム(○)のスコア]
     モデル   新データ
勤怠      1 ×       2 = 2
明日      1 ×       1 = 1
==========================
合計                     3

というわけで非スパムのほうがスコアが大きいのでこのメールは非スパムであることがわかる。

実は機械学習の多くは線形識別器

ここまでの説明で線形識別器が単純なものだというのはわかったと思う。ここで「でも実用性のある機械学習ってもっと難しいんでしょ」と思われるかもしれない。が、実はそんなことは無く多くの機械学習アルゴリズムは線形識別器だったりする。有名なSVM(Support Vector Machine)やGmailの優先トレイの学習に使われているPA(Passive Aggressive)も線形識別器。重要なのは重みの学習で、本記事では単純な頻度カウントをしたが、SVMPAのような高度な手法では高精度に未知のデータを識別するために工夫がされているよ、という話。

さらに学ぶためのオススメ書籍

参考までに機械学習を学ぶためのオススメな書籍をピックアップしておく。


  • 初心者向け:情報検索と言語処理(徳永 健伸)

初心者にオススメなのが徳永本。タイトル通り情報検索と言語処理について書いてある。恐らく多くのエンジニア機械学習を使ってやりたいことについて書いてある。機械学習をはじめる前に読んでおきたい。


機械学習で何をやりたいかがわかってきたら具体的なアルゴリズムを学びたい。本書はSVMだけでなくパーセプトロンという単純だが性能のよい識別関数についても書いてある。誤訳が多いのが難点だが読む価値はある。初心者は2章あたりまで読めれば充分。


  • 中級者向け:言語処理のための機械学習入門(高村 大也)

通称高村本。私が機械学習を学び始めた頃に是非欲しかった!という良書。実装を踏まえた解説が特徴。他所では触れられないような実装時の罠について解説が豊富。あまり言語処理という感じの本でもないのだが、それを補って余りあるほどの利点がある。今から機械学習をやる人は本書が最初から使えるという点で非常に恵まれている。


程度は高いけれど機械学習をやるなら是非読んでおきたい。識別モデルや生成モデルについても深く解説している良書。高額だが値段以上の価値がある。1章を読みきるだけでも随分、力はつくと思われる。

y_shindohy_shindoh 2011/01/15 21:07 サブタイトルから期待する内容と実際に書かれている内容が、正直あまり一致しませんでした。 ;(

echizen_tmechizen_tm 2011/01/15 21:23 記事を読んでいただきありがとうございます。ご期待に添えず申し訳ありません。今後のために具体的にどのあたりがタイトルとミスマッチだったか教えていただけると嬉しいです。
私の意図としては、機械学習をゼロからはじめる人がナイーブベイズからはじめるとあまり幸せにならないかなと思ったので、出発点として最低限知っておいたほうがよさそうな概念を並べて見通しを良くしてもらおう、というものでした。
期待されていたもの、というのはナイーブベイズについて知見が書いてあると思った、とかでしょうか。

y_shindohy_shindoh 2011/01/15 22:31 お返事、有り難うございます。
また、先のコメントで忘れていました (すみません) が、私のような初学者に向け貴重な記事を書いていただき、感謝いたします。

さて、ご質問の件ですが、ご想像の通り私は「ナイーブベイズについて知見が書いてあると思った」のです。
仮にサブタイトルが無ければ、内容的にとても興味深いこともあり、全く違和感なく読み終えたと思います。

echizen_tmechizen_tm 2011/01/15 23:18 補足ありがとうございます!
タイトルは「機械学習といえばナイーブベイズという考えが定着している件についてひとこと言っておくか」などとしたほうが良かったかもしれないですね。
音声の分野だと言語現象を確率モデルとして扱うのは自然だと思うのですが、全くの初心者が「識別問題」をやりたいという場合には、もうちょっと単純なアプローチもあるよ、というお話をしたかった。という感じです。
ナイーブベイズに関しては以前に記事を書いたことがあるので、よろしければ参考にしてください。
http://d.hatena.ne.jp/echizen_tm/20100216/1266333041

しましましましま 2011/01/17 20:08 場合にもよりますが,次のようにするとナイーブベイズも線形識別器と考えられるので,ナイーブベイズ⇔線形識別器という対立軸で分けるのは,ちょっと気になるのですが,どうでしょうか?

クラス C∈{C+,C-} 属性は A∈{0,1} だけ.ここで A+はA=1のときは1,A=0なら0,A-は逆にA=0なら1の変数を考える.
単純ベイズはP(C+)P(A|C+)>P(C-)P(A|C-)なら C+ に分類.
両辺の対数をとると
[log P(C+) - log P(C-)] + [log P(A|C+) - log P(A|C-)]>0

[log P(C+) - log P(C-)] + [log P(1|C+) - log P(1|C-)] A+ + [log P(0|C+) - log P(0|C-)] A- >0
という感じで A+ や A- などについて線形識別になるかと.

echizen_tmechizen_tm 2011/01/18 00:53 しましまさん。
ご意見ありがとうございます。
ナイーブベイズも線形識別器として考えることができるというご指摘は、そのとおりだと思いました。
識別問題を扱う場合に必ずしも確率として扱う必要はないという話をしたかったのですが、線形識別をすることとベイズ的に扱うことは対立してはいないですね。
誤解をまねくような書き方をしてしまいすみませんでした。

sleepy_yoshisleepy_yoshi 2011/01/18 02:11 とても興味深いエントリです.

判別関数,識別モデル,生成モデルの違いを一度わかったつもりになって以降,最近になって,なんだか気安く違うぞと言えなくなってしまいました.

SVMは事後確率を出力しないので判別関数ですが,出力をシグモイド関数に食わせて事後確率として扱う方法もあります.(Platt 2000)
(解説資料 http://www.csie.ntu.edu.tw/~cjlin/papers/plattprob.pdf)

基本的な識別モデルとしてよくロジスティック回帰も出てきますが,連続値を入力とするガウシアンNBとロジスティック回帰は訓練データが十分にあると同じものになるそうです.

Generative and Discriminative Classifiers: Naive Bayes and Logistic Regression by Tom Mitchell
http://www.cs.cmu.edu/~tom/mlbook/NBayesLogReg.pdf

NBは明示的に識別学習をしていないと思っていた (一般的にそう思われている) ので,なかなかここらへん奥が深いです.

しましましましま 2011/01/18 05:09 お返事をありがとうございます.

> 誤解をまねくような書き方をしてしまいすみませんでした。
批判したとかじゃなくて,ちょっと気になっただけなので… (^_^;

識別関数・識別モデル・生成モデルは本質的に違うかどうか,違っていそうで,やっぱちがってないんじゃないかとかいろいろありますよね.

echizen_tmechizen_tm 2011/01/18 23:50 sleepy_yoshiさん、しましまさん
コメントありがとうございます。
識別関数・識別モデル・生成モデルの違いは難しいですよね。私も最初にPRMLを読んだときは???と思いました。今でもですが。
sleepy_yoshiさんの指摘されたガウシアンNBとロジスティック回帰の例ですと、結果的に同じ学習をしていたとしても、前者を扱う人は生成モデルだと考えるでしょうし、後者の場合も同様な気がします。本質的に、というよりはモデルの分類は主観的な要素が強いのかな、と思ったりもしています。あまりわかっていなくて申し訳ないのですが。。
とりあえず初心者のうちは一般的に言われている分類で捉えておけばよいかな、とは思います。長く付き合えば嫌でも気になりだすでしょうし。

kyu9qkyu9q 2014/02/05 02:23 http://www.amazon.co.jp/Excelでスッキリわかる-ベイズ統計入門-涌井-良幸/dp/453404769X/ref=sr_1_5?s=books&ie=UTF8&qid=1391534416&sr=1-5&keywords=ベイズ%E3%80%80

今更感はありますがこちらの書籍は理解しやすく僕はそれまで機械学習なんて全然知らない領域だったんですが簡単なナイーブベイズを実装できました。事前確率や事後確率なども丁寧に説明していますのでベイズ統計学ならまだしもナイーブベイズのコンセプト自体なら難しいことは全然ないと思います。

けいけい 2015/08/06 10:47 こんにちは。
業務上、機械学習の知識が必要になり、勉強させていただいております。

[非スパム(○)のスコア]
のところで、勤怠 2×1となっていますが、2×2のような気がします。
理由は、新しいデータの「勤怠」には重み2が付与されているからです。

細かい点で恐縮ですが、不慣れな分野なので、精密に理解したいと思い、ご連絡させていただきました。

ご確認いただければ幸いです。

echizen_tmechizen_tm 2015/08/25 12:32 けいさん

ご指摘の通りデータの「勤怠」の重みが2でした。
一方でモデルの「勤怠」の重みが1なので
1×2が正しいと思います。(記事修正済み

ご連絡いただきありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証