六本木で働くデータサイエンティストのブログ

元祖「銀座で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木

「機械学習とは何ぞや」をゆるーく説明してみる

追記(2017年7月12日)

こちらの記事がGoogle検索結果でかなり上位に来ているようですが、投稿から既に4年以上が経過しており内容としては非常に古いものになっております。よろしければ「機械学習」カテゴリの比較的新しい記事もご参照ください。

tjo.hatenablog.com

もう、記事タイトル見たまんまです。そして、カテゴリ名見たまんまです。ぶっちゃけ、糞コードしか書けない僕が機械学習アルゴリズムのお手軽Python実装を目指して頑張るシリーズです。

どうして機械学習なのか


データマイニング」について語る際に、「統計学」と並んでどうしても欠かせないもののひとつが「機械学習」。


ITデータサイエンス業界での、その重要性はとうてい語り尽くせません。どこからどこまでを機械学習と呼ぶかにもよりますが、例えば以下のバックエンドシステムや分析フレームワークはすべて機械学習のたまものと言って良いでしょう*1


機械学習はパッケージ・ライブラリの整備が進んでいる手法が多く、バックエンドシステムでの自動化処理(バッチ・オンライン問わず)に使われることがメインですが、最近ではオフラインでのデータサイエンティストによるデータ分析でも用いられるケースが増えてきています。


・・・ところで、そもそも馴染みのない人にとって、機械学習という言葉は結構ゴツく聞こえるんじゃないでしょうか。ものすごーく難しいアルゴリズムの、ものすごーく難しい数学的表現が並んでいて、これをものすごーく難しい言語でものすごーく難しくコードする、みたいな。


・・・そんなことでは、データサイエンスの必要性だの、データマイニングの重要性だの訴えたところで、そのデータマイニングの代表格たる「機械学習」への理解を、多くの人々から得られるわけがないじゃないですかー。


だったら、糞コードしか書けない僕が、とことん機械学習を分かりやすく理解する(してもらう)ことを目指して、初心者の気持ちになってやってみようじゃないか!というのが今回から始まるシリーズのポイントです。いつまで続くかは自分でも心許ないんですが。


ちなみに卑下でも何でもなくて、僕は本当に糞コードしか書けません。理由は簡単で、そもそもコード書くのが専門の仕事でもなかったし*2、そのトレーニングも受けてこなかったし、コードレビューしてもらう人もずっといなかったし、今の仕事に就いたら就いたで全然リファクタリングとかやったこともやってもらったこともなかったので・・・。


そうそう、僕のまどろっこしい説明すら読むのが面倒!という方のために、最初に僕が勉強のために拝読していたブログ記事の数々をここでご紹介しておきます。はっきり言ってこれから続くであろう、僕の自己満足のブログ記事よりもこちらの方が皆さんの参考になると思います。笑


d:id:echizen_tmさんのブログ『EchizenBlog-Zwei
主にPerlでの実装について紹介していらっしゃいます。


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データ分析では「予測(昨日までのデータに基づいて今日の売り上げを予測する)」に向いていると考えられる。以下が代表例。

  1. 単純パーセプトロン
  2. サポートベクターマシン (SVM)
  3. 関連ベクターマシン (RVM)
  4. Passive-Aggressive (PA) 法
識別モデル

「A群 vs. B群」のように目の前にあるデータを分類ラベルに従って振り分けるが、その分類の事後確率をモデル化する。よって、ある程度ではあるが「どうやって分けたか」もモデリングできる。以下が代表例。

  1. ロジスティック回帰
  2. ニューラルネットワーク誤差逆伝播則)
  3. 決定木 / 回帰木*4
  4. ランダムフォレスト*5
生成モデル

ベイズ的手法に基づいて、「A群 vs. B群」のような分類自体の同時分布を完全にモデリングして、要するに学習データ~予測データ全体の入出力関係そのものをモデル化して算出できてしまうようにするもの。結果は「あるデータがA群に分類される確率」でのみ表される。

ある意味最も理想的な機械学習だけれども、計算負荷であったり実装・適用面での問題だったり、はたまた向き不向きの問題があったりして、適用にはそれなりに制限がある。ただし広大なベイジアンの世界全体に膨大な関連手法群が広がっており、何かwebデータ分析で困ったことがあったらここにソリューションを求めるのは悪くない選択とも言える。以下代表例。

  1. ナイーブベイズ(単純ベイズ)分類器
  2. その他ベイジアン全体

教師なし学習

事前に特に「どう分類したい」というような学習データなしで、アルゴリズムが自動的に学習して分類するためのモデルを算出する方法論。仮説の決めようがなくて、発見的にwebデータを分析したい時には有用。コンバージョンの情報なしで色々分かるので便利だけれども、何らかの事前仮説なしで結果を眺めても一般には何も分からないので、使いどころを考える必要がある。

クラスタリングなど

主にデータ点同士の「距離」(簡単に言えば素性ベクトルを座標として見た時のユークリッド距離など)に基づいて、近い・遠いなどで分類する。要は「似たもの同士」をまとめる方法論。以下代表例。

  1. 階層的クラスタリング
  2. k-meansクラスタリング
  3. モデルベースクラスタリング
信号分離など

主にデータ点同士の線形代数的な性質(固有値固有ベクトルなど)に基づいて、「独立or従属」に基づいて分類する。これも基本的には「似たもの同士」をまとめる方法論。以下代表例。

  1. 主成分分析 (PCA)*6
  2. 独立成分分析 (ICA)

但し書き


僕が知っている範囲のことしか書いていませんので、正確性は保証しません。どうしても気になる人は、ちゃんとした資料に当たることをお薦めします。例えば↓この辺とか。

パターン認識と機械学習 上

パターン認識と機械学習 上

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習 下 (ベイズ理論による統計的予測)


ただし、先に書いておきますがこれらの本はさらに勉強会での解説本が出回るぐらい難解なので、初学者には全くお薦めできません。もう少し簡単な本が色々なところで紹介されているので、そちらをどうぞ。


と、いうことで


次回からPythonの糞コード書いていきます。今回は導入だけで長くなり過ぎたので分けました、ってことで。。。

*1:学術的には実はここで挙げた例は厳密に機械学習に該当するもの、厳密には当てはまらないものとに分かれるんですが、ここでは十把一絡げにまとめておきます

*2:もうこの際なのではっきり書いてしまいますが、アカデミック業界で専門的にコード書かない分野の人たちが書くコードの大半は、正真正銘の糞コードです

*3:猛烈にざっくりなので厳密性はいつも通り度外視(笑)

*4:厳密には異なるが、「どうやって分けたか」を知ることは可能

*5:これまた同じく厳密には異なるが、「どうやって分けたか」を知ることは可能

*6:KL展開は数学的には同じもの