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

最近では機械学習の認知度も上がってきていて専門家でなくてもナイーブベイズ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章を読みきるだけでも随分、力はつくと思われる。