追記(2017年7月12日)
こちらの記事がGoogle検索結果でかなり上位に来ているようですが、投稿から既に4年以上が経過しており内容としては非常に古いものになっております。よろしければ「機械学習」カテゴリの比較的新しい記事もご参照ください。
もう、記事タイトル見たまんまです。そして、カテゴリ名見たまんまです。ぶっちゃけ、糞コードしか書けない僕が機械学習アルゴリズムのお手軽Python実装を目指して頑張るシリーズです。
どうして機械学習なのか
「データマイニング」について語る際に、「統計学」と並んでどうしても欠かせないもののひとつが「機械学習」。
ITデータサイエンス業界での、その重要性はとうてい語り尽くせません。どこからどこまでを機械学習と呼ぶかにもよりますが、例えば以下のバックエンドシステムや分析フレームワークはすべて機械学習のたまものと言って良いでしょう*1。
- ページランク(代表例はもちろんGoogle Page Rank)
- レコメンドエンジン(recommender system: 最近ならGunosy、OSSでの実装ベースならMahout on Hadoopが有名かと)
- SPAMフィルター(Akismetなんかは有名ですね)
- ユーザー行動嗜好分析
- ユーザー行動未来予測
機械学習はパッケージ・ライブラリの整備が進んでいる手法が多く、バックエンドシステムでの自動化処理(バッチ・オンライン問わず)に使われることがメインですが、最近ではオフラインでのデータサイエンティストによるデータ分析でも用いられるケースが増えてきています。
・・・ところで、そもそも馴染みのない人にとって、「機械学習」という言葉は結構ゴツく聞こえるんじゃないでしょうか。ものすごーく難しいアルゴリズムの、ものすごーく難しい数学的表現が並んでいて、これをものすごーく難しい言語でものすごーく難しくコードする、みたいな。
・・・そんなことでは、データサイエンスの必要性だの、データマイニングの重要性だの訴えたところで、そのデータマイニングの代表格たる「機械学習」への理解を、多くの人々から得られるわけがないじゃないですかー。
だったら、糞コードしか書けない僕が、とことん機械学習を分かりやすく理解する(してもらう)ことを目指して、初心者の気持ちになってやってみようじゃないか!というのが今回から始まるシリーズのポイントです。いつまで続くかは自分でも心許ないんですが。
ちなみに卑下でも何でもなくて、僕は本当に糞コードしか書けません。理由は簡単で、そもそもコード書くのが専門の仕事でもなかったし*2、そのトレーニングも受けてこなかったし、コードレビューしてもらう人もずっといなかったし、今の仕事に就いたら就いたで全然リファクタリングとかやったこともやってもらったこともなかったので・・・。
そうそう、僕のまどろっこしい説明すら読むのが面倒!という方のために、最初に僕が勉強のために拝読していたブログ記事の数々をここでご紹介しておきます。はっきり言ってこれから続くであろう、僕の自己満足のブログ記事よりもこちらの方が皆さんの参考になると思います。笑
d:id:echizen_tmさんのブログ『EchizenBlog-Zwei』
主にPerlでの実装について紹介していらっしゃいます。
- 機械学習超入門 ~そろそろナイーブベイズについてひとこと言っておくか~
- 機械学習超入門II ~Gmailの優先トレイでも使っているPA法を30分で習得しよう!~
- 機械学習超入門III ~機械学習の基礎、パーセプトロンを30分で作って学ぶ~
- 機械学習超入門IV ~SVM(サポートベクターマシン)だって30分で作れちゃう☆~
d:id:aidiaryさんのブログ『人工知能に関する断創録』
主にPythonでの実装を紹介していらっしゃいます。
d:id:nowokayさんのブログ『きしだのはてな』
主にJavaでの実装を紹介していらっしゃいます。
(あまりにも記事が多岐に渡るので一覧にて失礼します)
機械学習とは何ぞや
Wikipediaにはこう書いてあります。
機械学習(きかいがくしゅう、Machine learning)とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。
これだけだと素っ気なさ過ぎるんですが、これ以上突っ込むとどんどん話が長くなるのでやめておきます。笑 僕が機械学習と言った時にイメージするのは、
- コンピューターでアルゴリズムを構築し、学習データを読み込ませることで、自動的に今あるデータを分類&まだ見ぬデータを予測できるようにするもの
- ヒトの情報処理能力を超えて、複雑なデータを分類&予測できるようにするもの
の2点です。1つ目は元の定義の言い直しに過ぎませんが、2つ目は非常に重要だと思ってます。というのは、「データが少なければ人手で地道に分類すればいいじゃん♪」という話に堕しやすいからです。
以前の記事でも挙げましたが、ある程度のサンプルサイズであればExcelだけ使ってチマチマ集計したり割合を出せば色々分かることもあります。
けれども、例えばwebコンテンツプラットフォーム上にある100個以上ものエンタメアプリのうち、「どれとどれを使うとそのユーザーは来月も来てくれるか?」「どれとどれとどれを使うとそのユーザーは有料コンテンツをお買い上げになるか?」なんてことを突き止めようと思ったら、人手ではもう無理です。だって、100個以上の説明変数見比べるとか人力じゃ無理でしょ? それが100万UUとかいたら尚更でしょ?
ということで、機械学習も覚えた方が絶対いいですよ!・・・という話になったところでざっくり機械学習の種類について書いてみます*3。確実にどこかしら間違ってると思うので、間違いに気付いた方ぜひご指摘ください。m(_ _)m
教師あり学習
分類したいラベル(A群 vs. B群とか)を学習データに事前に与えておいた上で、分類するためのモデルをアルゴリズムに学習させる方法論。一般に精度は高め、ただし学習データが必要なのでwebデータ分析では主にコンバージョンを設定した上でやる必要がある。
識別関数
とにかく「A群 vs. B群」「グループ1, 2, 3...」というように、目の前にあるデータを分類ラベルに従って振り分ける。算出方法にもよるが、「とにかく分ける」ためのものなので「どうやって分けたか」は事実上分からない。よって、webデータ分析では「予測(昨日までのデータに基づいて今日の売り上げを予測する)」に向いていると考えられる。以下が代表例。
- 単純パーセプトロン
- サポートベクターマシン (SVM)
- 関連ベクターマシン (RVM)
- Passive-Aggressive (PA) 法
識別モデル
「A群 vs. B群」のように目の前にあるデータを分類ラベルに従って振り分けるが、その分類の事後確率をモデル化する。よって、ある程度ではあるが「どうやって分けたか」もモデリングできる。以下が代表例。
- ロジスティック回帰
- ニューラルネットワーク(誤差逆伝播則)
- 決定木 / 回帰木*4
- ランダムフォレスト*5
生成モデル
ベイズ的手法に基づいて、「A群 vs. B群」のような分類自体の同時分布を完全にモデリングして、要するに学習データ~予測データ全体の入出力関係そのものをモデル化して算出できてしまうようにするもの。結果は「あるデータがA群に分類される確率」でのみ表される。
ある意味最も理想的な機械学習だけれども、計算負荷であったり実装・適用面での問題だったり、はたまた向き不向きの問題があったりして、適用にはそれなりに制限がある。ただし広大なベイジアンの世界全体に膨大な関連手法群が広がっており、何かwebデータ分析で困ったことがあったらここにソリューションを求めるのは悪くない選択とも言える。以下代表例。
但し書き
僕が知っている範囲のことしか書いていませんので、正確性は保証しません。どうしても気になる人は、ちゃんとした資料に当たることをお薦めします。例えば↓この辺とか。
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/05
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 33回
- この商品を含むブログ (19件) を見る
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/02/29
- メディア: 単行本
- 購入: 6人 クリック: 14回
- この商品を含むブログを見る
ただし、先に書いておきますがこれらの本はさらに勉強会での解説本が出回るぐらい難解なので、初学者には全くお薦めできません。もう少し簡単な本が色々なところで紹介されているので、そちらをどうぞ。
と、いうことで
次回からPythonの糞コード書いていきます。今回は導入だけで長くなり過ぎたので分けました、ってことで。。。