thriftとかhadoopなど,何やらいろいろと手を出してしまい,ここのところブログの更新が滞ってしまっていますが,今日は前から書きたかったトピックについて自分へのメモの意味も含めて記しておきたいと思います.
はじめに
最近,といっても結構前からなのですが,海外のブログなどで「機械学習の勉強を始めるガイドライン」についてのエントリーがいくつか見られ,かつ,議論も少し盛り上がっています.僕は機械学習が好きなだけで,専門というにはほど遠いのですが,僕も一利用者としてはこのトピックに関してはとても興味があります.
機械学習というと,色々な数学的な知識が必要であったり,統計学や人工知能の知識も必要になったりしまったりと,専門的に学ぶ機会が無かった人にとっては興味が湧いてもなかなか始めるには尻込みしてしまうことかと思います.今日紹介するエントリーは,そんな方々にヒントになるような内容になっていると思います.基本的なことを体系的に説明しているのでとても質が高いです.
紹介するエントリー : Guide to Getting Started in Machin Learning.
要約になりますが,上記のエントリーでは機械学習の勉強を始める流れを以下のように説明しています.
The Elements of Statistical Learning Data Mining, Inference, and Prediction.を読む
- なんとこの本はPDFが公開されていますので参照してください.
- この本は有名な教科書なのですが,これのチャプター1のIntroductionを読んで概要をつかむと良いと言っています.
- Introductionには統計学習がどのような分野で応用されているかなどがまとめられています.
- 医療分野や,マーケティング,画像処理,e-mailのスパムフィルタリングなど
Rで試す
- The Elements of Statistical Learning Data MiningのIntroductionを読んだら,Rをダウンロードしましょう.
- GoogleやFacebookではRがどのように活用されているかを記したエントリーのリンクがありおもしろかったです.How Google and Facebook are using R
Googleの場合
The typical workflow that Bo thus described for using R was: (i) pulling data with some external tool, (ii) loading it into R, (iii) performing analysis and modeling within R, (iv) implementing a resulting model in Python or C++ for a production environment.
上記を意訳で要約すると,GoogleのBoさんはRを以下のように使っているようです.
- 何らかの抽出ツールでデータを取得する
- Rに読み込ませる
- Rを使って解析したりモデルを作ったりする
- 結果のモデルをPythonやC++で実装する
といった感じで,つまりプロトタイプの段階でRを使って実験するようですね.
データを使う
Rで何かしらので機械学習の手法を使うには,データが必要となります.学習やテスト(分類)に使うデータをよくデータセットというのですが,これを集めるのは容易ではありません.以前にここのサイトでも紹介したデータセット集(Classicicationにおけるデータセット)をこのエントリーでも紹介しています.
UCI Machine Learning Repository: Data Sets
ここのデータセットを使ってRで遊んでみると良いでしょう.エントリーでは,先ほど示したThe Elements of Statistical Learning Data Miningを読み進めてRで実装してみると良いと言っています.
個人的には直感的に学ぶにはWekaもいいと思っています.wekaについては後述します.
Bishop本を読む
他にも機械学習の教科書は山ほどあるのですが,以下の本がおすすめだと言っています.
Pattern Recognition and Machine Learning (Information Science and Statistics)
Christopher M. Bishop

この本はかなり評判がいいですよね.実は僕は図書館で必要な箇所を読んだことしかないのですが,よくまとまっていた記憶があります.これは和訳が販売されていて,これもかなり評判がいいですね.結構色々なところで読書会とかもされているようですね.僕も買わなくちゃ.Bishop先生が書いた本ということで,一部ではBishop本と呼ばれているようです.
C. M. ビショップ

授業の動画ライブラリを見る
昨今は本当に便利な時代になって,スタンフォード大学の機械学習の授業を見ることができます.
以下が授業で使っているハンドアウトになります.
CS229 Machine Learning Course Materials
実は,これは僕もジムで筋トレしながらこつこつと見ていたのですが,とてもおもしろいです.でも,音声が英語ということもあって,英語力も要求されるため,機械学習に関して全く知識が無いと聞き取りが大変かもしれないので,英語が得意ではない方は一通り勉強し終わってから復習の意味で見ると良いかもしれません.
以上が上記のエントリーに記述されていた,機械学習の初学者のためのガイドラインとなります.
で,自分はどう思うか
で,自分もまだまだ初学者の一員ではあるのですが,自分なりに機械学習を勉強する事始めとして良いのではないかと思っていることをまとめておきます.もちろん,これは賛否両論あると思いますし,人によって効率の良い学習方法は違うと思いますので,これは一アイデアとして読んでいただけたらと思います.
まずは,興味を持った手法を徹底的に学び尽くす
私は機械学習の全体の知識をいきなりつけようとすると挫折してしまう可能性が高いと思っています.特に昨今のアルゴリズムはとても複雑なモデルを使うようになっており,理解に時間がかかるものが多くあります.そこで,私としては(当時の私は)自分がやりたいことが達成できそうなアルゴリズムを1つに絞って勉強するというスタンスをとりました.そして,そのアルゴリズムは初学者であれば単純なものが良いと思います.例えば,機械学習の分野(明確には機械学習の分野とは言えませんが)で単純なアルゴリズムで,威力があるものでは,Naive Bayesや,decision tree,KNNなどがあります.これらのアルゴリズムはデータマイニングや,パターン認識などですぐに使うことができます.人によっては式だけ眺めてうなっているよりも,作りながら悩んだ方が理解が早いことがあります.動かしながらだと直感的に理解できるんですね.もちろん,人それぞれ学習の仕方があると思うので万人には通用するとは思っていません.
そして,一つのアルゴリズムを徹底的に学ぶといっても,実は全然一つでは収まらなくなります.例えばNaive Bayesを使ってみよう!と思ってNaive Bayesの論文などを読むと,その論文の中には細かい引用がたくさんされています.そして,その引用先の論文で言っている手法を理解していないと,その論文で言っていることがわからなかったりします.結局一つの論文を読むのに,10以上の論文を読むことになったりします.だから,簡単なアルゴリズムでもちゃんと理解しようするにはとても苦労するんですね.だけど,学ぶことがたくさんあるからそういうことをしているうちにだんだん幅広い知識がついてくる,と経験上思いました.
オープンソースのライブラリから学ぶ
僕がこれらの勉強を始めた当時は,実はあまりオープンソースのライブラリの情報がそこまで出回っていませんでした.しかし,今は本当に多くの,かつ質のいいオープンソースの機械学習のライブラリがあります.教科書を見ていてよくわからない!という方は人の実装を見ながら仕組みを理解するといいと思います.数式がものすごく難しく説明されていても,ソースを見ると意外に実装は簡単だったりするものもあります,自分の力だけで実装するのもいいし,人の実装を参照しながら自分の実装をするのも良いと思います.
一例ではありますが,最近では以下のようなものがあります.(全部細かくは調査していません)
- nltk
- http://code.google.com/p/nltk/
- Python
- 自然言語処理のライブラリなのですが,機械学習のアルゴリズムも多く実装されています.
- Pythonということもあって,処理は遅いですがコードは読みやすいのでプロトタイプとしてはおすすめです.
- クラスタリング・分類関係だと以下のような手法が実装されています
- decision tree
- maximam entropy
- naibe bayes
- kmeans
- weka
- http://www.cs.waikato.ac.nz/ml/weka/
- JAVA
- このサイトでもちょっと紹介したwekaですが,これはJAVAで実装されたData miningツールで多くの機械学習の手法が実装されています.
- 有名な手法はだいたい実装されています.スピードもそこそこ出るのでちょっと遊んだり実装を見るにはおすすめ.
- Mahout
- http://lucene.apache.org/mahout/
- JAVA
- Hadoop上で動く機械学習ライブラリです.これは初学のためにはお勧めできませんが,Hadoop上で動くということもあり,実用上使えると思って現在調査中です.
まとめ
今回は素人の素人による素人のための機械学習事始めということでエントリーを書かせていただきました.実は僕は勉強の仕方は「何が一番いい」っていうのは無いと思っています.でも,勉強するために手助けになるための情報は存在すると思っています.それを一度まとめておきたいなと思って,書かせていただきました.もし,こんな情報があるよ!とか,こうやると効率がいいよ!というアイデアがある方がいらっしゃいましたらご教授いただけたらと思います.
10/14 追記
shima_shimaさんより参考になるご意見をいただいたので追記しておきます。以下shima_shimaさんのコメントを整理して引用させていただきます。
- Bishop本のレベル表
http://ibisforest.org/index.php?PRML/course
- その他参考になる本
- 強化学習なども解説されているが古い部分もある
Machine Learning (Mcgraw-Hill Series in Computer Science)
Thomas Mitchell

- カーネル
カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)
赤穂 昭太郎

- マルコフ連鎖
計算統計 2 マルコフ連鎖モンテカルロ法とその周辺 (統計科学のフロンティア)
伊庭 幸人 | 種村 正美

- 入門で優しい内容
フリーソフトでつくる音声認識システム - パターン認識・機械学習の初歩から対話システムまで
荒木 雅弘

- Bishopレベル表の入門レベルの内容
パターン認識と学習の統計学―新しい概念と手法 統計科学のフロンティア 6
甘利 俊一 | 麻生 英樹 | 津田 宏治 | 村田 昇

- Bishopレベル表の入門レベルの内容
元田 浩 | 山口 高平 | 津本 周作 | 沼尾 正行
