データ分類とか学習器について、ぬるプログラマーによるぬるプログラマ向けまとめ

SVMという、使い方によってはすごいモノがあります(唐突)

誤解を恐れず、パッと簡単に説明すると
ラベル付けをしたデータを教師データとして、学習器に与えると、学習モデルを吐いてくれて、評価器にデータを与えると、学習モデルを使って

inputはaなのかbなのか?(二値分類)

という回答を返してくれる便利ツールですSVM自体はアルゴリズムですが、その実装は一杯あるのでそれに頼れば、ということ)
ベイズ分類器とか使ったスパムフィルタとかを想像してもらえると、動作結果のイメージは間違ってないと思います。

で、SVMの仕組みを細かく説明するとそれだけで結構ボリューミーで、
マク○ナルドのクダブル○ーズクォーター▼ウンダー並に胃がもたれてしまうので、がっつり割愛させていただくとして…
とにかく、SVMの仕組みが仕組みなだけに、2次元上では分類が非常に難しいようなデータの分類にとても向いているモノです。

世の中には複雑な因果関係を持った問題ってたくさんありますよね。

…ありますよね、いっぱい。

…そういうのをなんかごねごねして、
「こんな感じが一番「っぽい」だろ! そぉぃ! 」(スパーン

ってな感じに分類してくれるものがSVMだとしたら、
それはすなわち、使いこなせたら割と幅広い分野で使えて、大きな力になる分類器ということになりませんか?

簡単に試してみたい場合は、まず以下のツールをlinux環境にインストールして、チュートリアルをやってみると、ピンとくるんじゃないかと思います。
http://code.google.com/p/broomie/wiki/broomie_turorial_ja

ちなみに、SVMは基本二値分類しかできません。
one vs oneか、one vs restという手法を用いれば、多値に分類しなければならない問題にも適用できるようですが、めんどくさそうなのでやだなー…。

でも、ご安心ください。

このbroomieならone vs restが組み込まれていますので、
安心して、このデータはaで、こっちはbで、そっちはcで…
と、複数のラベルを貼って気軽に実験できます。

適当にlinux形態素解析インストールして、
適当な文書データを分解させて、特徴が多く出るよう、ノイズが少なくなるよう、調整を加えて、出現回数や頻度などで、単語に重みを振って、一行にまとめて、頭にラベルを貼って…

ってな感じに、教師データを作ったら、brmtrainってコマンドに食わせて、modelファイルを出力させて、分類したいものを教師データを作った時と同じようにデータ加工して、それをbrmclassifyで評価。ってな感じです。(大雑把すぎる

ひとくちにSVMといっても、派生?が色々あるらしく、
最近、僕が使ってみたがっているのは、
Confidence Weighted(以下CW)ってアルゴリズムです。
学習時の「ごねごね」の仕方がだいぶ違うようです。(えー

ちなみにSVMにはバッチ学習ってのとオンライン学習ってタイプに分けられて、違いをぬるプログラマー的イメージに表すと、

ファイルをひらいて全てのデータをメモリに載せて処理するパターン(バッチ学習)
ファイルをひらいて一行づつ読み込んで処理して結果を書いてメモリから破棄するパターン(オンライン学習)

って感じです(わかりづれ
「オンライン?Web向きのがあるんだー!」とか思ってたら全然違ったので。
いやまぁ、確かにオンライン学習の方がウェブサービスに向いてる場合も多いですが、バッチ学習で十分なケース(一ヶ月に一回、まる一日かかっても、学習しなおせれば間に合うとか)もあるので オンライン学習=ウェブのオンライン で結び付けないでください。

CWはオンライン学習アルゴリズムの一つなのですが、
欠点としてラベル付けに間違ったデータ(ノイズ)に非常に脆弱で、教師データの精度が悪いと汎化能力が極端に落ちるみたいです。

そこで、CWにラベルノイズ対策を施したアルゴリズムとして、

AROW(Adaptive Regularization of Weights)
NAROW(Narrow Adaptive Regularization Of Weights)

というものがでてきたらしいのだけれど NAROW に関する文献が少なすぎる…。
http://webee.technion.ac.il/people/koby/publications/adaptive_nips10.pdf

ちなみにAROWの実装なら既存。
http://cl.naist.jp/~tetsuo-s/software/arowpp/
多値分類には未対応だけど、Planned Featuresの記述によると、対応予定らしい。wktk。

ちなみに、CWとAROWの違いとか関係性については以下のスライドが明快。
http://www.r.dl.itc.u-tokyo.ac.jp/~oiwa/upload/AROW.pdf

あ、あと、最初に言っておくべきでしたが、私は専門家でもなんでもなく、ただのぬるプログラマーです。
SVMを知ってから色々調べて、自分なりに解釈して、使ってみて手応えがあったので、もっとたくさんの人に使ってみてもらいたかったのです。(そして教えて欲しい)

要するに、この記事は、独学による曖昧な認識に基づいていますので、間違いやら勘違いやらひどい!ってのがあったら、是非ツッコんでください。