「Machine Learning for hackers」読了


Machine Learning for Hackers
Machine Learning for Hackers
posted with amazlet at 12.06.06
Drew Conway John Myles White
Oreilly & Associates Inc
売り上げランキング: 543

Bit.lyのチーフサイエンティストの人もカンファレンスで推薦していた本だったのでバケーションやロングウィークエンドを利用して10日ほどで一気読みしました。

この本の良いところは全てのコードサンプルがRで提供されている点。他のマシーンラーニング系の本はPythonなどのスクリプト言語と併用している場合が多いのでRに興味がある人は「Pythonまで勉強するのはめんどくさい」
と思ってしまうので良いかもしれません。あとRの知識も統計学の知識も特に前提としていないので、そういう話題(例えば行列計算など)に出くわした場合は一から解説してくれます。そして理論の難しいところは「あんまり今は詳しく解説しないけど」とばっさり斬って捨てているところは、以前にRの本とかで統計の難しいことろが理解できずに挫折したような人(自分を含む)には良いかもしれません。

難点も「すべてのコードがR」というところでしょうか。今までRではちょっとしたヒストグラムぐらいしか書いたことがなかった身としては、メールから正規表現を使って日付情報などを抜き出したり、外部のWeb APIをたたいてJSONをパースしたりする例を見て「Rって本当に一人前のプログラミング言語なんだな」と感心はしましたが、一プログラミング言語として比較するとPythonRubyに比べて面倒なところも多いと思いました。実際のマシーンラーニングのアプリを書く時にはデータの摘出や整形はRubyなどでやった方が良いと思います。そう考えた場合、サンプルコードの中から「本当にRでやらなければいけない部分」は10%にも満たない(でもその1〜2行のコードがマシーンラーニングの要の部分なのですが)ので、そこの部分を後からレファレンス的に本書を見直すにはちょっと大変です。それに役立つための自分への忘備録な意味で各章の要約と、重要なコマンド等を以下に抜き出してみました。

1. Using R

Rや、Rで使われるパッケージのインストール方法を解説した後、アメリカで報告されたUFOのcsvデータを時系列オブジェクトに変換、州ごとに時系列グラフを描画するまでの過程を解説。

以下のコマンドの紹介が個人的には役にたちました。

  • ?package_name でパッケージのヘルプ画面を表示、??package_nameだとパッケージ名のサーチ
  • readコマンドでファイルをロードする際「stringsAsFactors=FALSE」というオプションを渡すことで、文字列データを文字列としてloadする
  • head/tailコマンドで大きいデータの一部分だけ表示
  • plotの変わりにggplotパッケージでグラフを描画


2. Data Exploration

データマイニングをする時にはExploration(データ内にある隠れたパターンやストラクチャーを探す)とConfirmation(打ち立てた仮説を検証する)過程があり、ここではExplorationの方法について解説。
まず最初にRでのデータは行列を扱うものと定義した後、行列の計算やデータの型(文字列、数字など)があることを紹介。その他にもMeans, Medians, Modes, Quantiles, Standard Deviations ,Variancesについての解説もあります。

データビジュアライゼーションに関しては、まずヒストグラムかdensityグラフをプロットし、正規分布を表示する重要性について述べています。
以下がggplotで描画するコマンド。

ggplot(heights.weights, aes(x = Height)) + geom_histogram(binwidth = 0.001)
ggplot(heights.weights, aes(x = Height)) + geom_density()

例題は慎重と体重の相関データを用いていますが、最初に表示したときはふたこぶラクダのような形になっていました。実はこれは性別ごとに相関が異なるためで、以下のように男女でグループ分けすることによって二つの正規分布図に切り分けていたのが「なるほど」という感じでした。

ggplot(heights.weights, aes(x = Weight, fill = Gender)) + geom_density() + facet_grid(Gender ~ .)

なおggplotでscatterplotを書く際にgeom_smoothレイヤーを追加可能です。

ggplot(heights.weights[1:20,], aes(x = Height, y = Weight)) + geom_point() + geom_smooth()

3. Classification: Spam Filtering

e-mailのスパムを検出する方法をナイーブベイズを使って実装する例を紹介。
データセットSpamassassin社の提供するスパムメール(とスパムでないメール)を利用。

term document matrix (TDM)を用いてスパムメールを構成する単語集(コーパス)を作成。tmというライブラリーを使用。以下が利用例

get.tdm <- function(doc.vec) {
    control <- list(stopwords = TRUE, removePunctuation = TRUE, removeNumbers = TRUE, 
        minDocFreq = 2)
    doc.corpus <- Corpus(VectorSource(doc.vec))
    doc.dtm <- TermDocumentMatrix(doc.corpus, control)
    return(doc.dtm)
}


4. Ranking: Priority Inbox

メールボックスに届くメールの優先度の判定方法。基本的にはスパムフィルターの判定方法に似ているが、スパムフィルターが「スパムか否か」のバイナリー判定を、スパムメールに頻出する単語の出現確率を元に検出していたのに比べ、こちらはより多くのパラメター(メールが何度返信されているか、返信までの反応時間)などいろいろなパラメターを用いて優先順序を決定する分より複雑な例となっています。データは3章のデータ(スパムでない方のメール)を使っている。章の半分くらいはどうやってRを使って文章からメタデータ(タイトル、送信日時)を抜き出すことができるかに費やされているが、そういうのは普通にRubyとかPythonでやったほうが手っ取り早い印象を受けました。

興味深かった点ですが、メールの頻出度などをグラフにしようとした場合、頻出度トップとボトムの差が激しい場合はグラフで全体を表示しづらい場合があるけれど、そういうときは対数(log)を施すことでデータを圧縮することが可能(A log-weighting scheme)。以下が一例。

from.weight <- transform(from.weight, Weight=log(Freq + 1))

5. Regression: Predicting Page Views

章のタイトルからすると過去のページビューから未来のページビューを予測する方法かと思いきや、Unique Viewなどとの相関を元に、Linear Regression (線形回帰)をもちいてPage Viewを求める方法について解説。
章のほとんどがLinear Regressionの解説。

出てきた用語、コマンドなど

  • mean squared error (MSE)
  • root mean squared error (RMSE)
  • lm() = Linear Model
  • cor() = Corelation
  • coef() = Coefficiency

6. Regularization: Text Regression

Linear Regression は本来、一次方程式で求められるような直線の相関に関してしか適応できないが、曲線を相関を持つものにたいしてどうするか(Polynomial Regression 多項回帰)についての解説。

ここでの前半はsummary()コマンドの解説。Residualとは何かについて多くの紙面がさかれていて、以前他の日本語の本で読んであまり理解できなかったものがすっきり理解できてよかったです。

後半はPolynomial Regressionについて詳しく解説。
Polynomial Regressionをするにはpolyというライブラリーがあるのだけれど、degreeにいれるパラメターの値が大きすぎるとoverfittingになってしまいます。

poly.fit <- lm(Y ~ poly(X, degree = 1), data = df)
df <- transform(df, PredictedY = predict(poly.fit))

じゃあoverfittingにならない適切な値をどうやって求めれば良いかについて cross-validation という方法と Regularizationと言う方法を紹介。

実例としてはOreilly社のトップ1000タイトルの要約を分析することで売り上げランキングをもとめるというもの。最初のRegressionだけで順位を求めるのは精度が悪かったので、「この書物は売り上げ上位50に入るか否か」という第3章のようなバイナリー問題に単純化することで精度をあげることに成功(こういうのをLogistic Regressionという?)。

7. Optimization: Breaking Codes

行列を使った組み合わせ問題を解く時に、行列計算をまともにしようとすると計算コストが馬鹿にならないので、Rシーザー暗号egressionを応用して計算コストを短縮(最適化=Optimization)するという話。
例題にはシーザー暗号を使用。

lmよりももっと低次元なoptimコマンドを使用することで自分の回帰モデルを作る方法について述べています。実際の解読コード生成はメトロポリス法という乱数を元にした方法を使用。


8. PCA: Building a Market Index

主成分分析(principal components analysis PCA)についての解説。
実際にはprincompというコマンドを使います。
例題にはアメリカの企業数十社のストックプライス情報をもとにマーケットインデックス値を作成する方法を解説。

9. MDS: Visually Exploring US Senator Similarity

クラスター分析について。

  • 行列のかけ算の方法
  • multidimensional scaling (MDS)
  • cmdscaleコマンドの使い方

例題にはアマリカ議員の過去の議案への賛否投票によって似た議員にグループ化する方法について解説。データは http://www.voteview.com/

10. kNN: Recommendation Systems

k-Nearest Neighbors (k近傍法)の解説。Rにはそのものずばりのknnというコマンドがあるのでそれを使用。
例題には自分のインストールしているRパッケージと類似のユーザーのインストールしているバッケージからお勧めパッケージを探し出す方法について。

11. Analyzing Social Graphs

ソーシャルネットワークの可視化について。まずグラフの基本であるnodeやedgeについて説明した後、ツイッターからのソーシャルグラフ情報を所得するサンプルがあるのだけれどちょっとつまずいてしまいます。というのも
TwitterAPIを使わずGoogle Social Graph API経由でデータを撮ろうとしているのだけれどSGA自体がすでにサービスを終了してしまっているので、サンプルコードの前半は使えずじまい。まあでもこの部分はあえてRを使わずとも自分の使いなれた言語をつかえば良いのでどうでも良いかも。

サンプルコードには作者達のソーシャルグラフがGraphML形式で提供されているのでそれをRに読み込んだあとigraphライブラリーで解析、shortest.pathsコマンドでノード間の最短経路を計算したりneighborsコマンドで隣のノードにアクセスしたりする。この辺りはNode4jなどのグラフデータベースを使ったことがあれば概念を理解するのは簡単そう。ほかにもhclustというRにそなわっているコマンドでノードを樹系列にクラスター化するコマンドは非常にお手軽に使えるっぽいということがわかった。ビジュアライゼーションは普通にplotコマンドを使うだけでも良いのだけれど、Gephiという他のツールを使って、いろいろ可視化してみる。

最後はツイッターでだれをフォローするかのレコメンデーションロジックの実装。「友達の友達間でたくさんフォローしている順」だと別にR使わなくてもできそうだけれど「各クラスターの中で重要度の高い友人をレコメンド」は多様なジャンルの友人をレコメンドできるという点で興味深かったです。


12. Model Comparison

第6章でLinear Regression で解けない問題をPolynomial Regressionで解いていたけれど、ここでは他の手法としてSVM(The Support Vector Machine)を紹介。
そしてこれまでの総復習として第3章のスパムフィルタリング問題をLinear Regression, SVM, KNNで解いてみてエラー率を比較。この問題ではLinear Regressionモデルがダントツの性能を見せていたけれど、どのモデルがあうかはデータ構造に依存するので問題を解く時には常に複数のモデルを試して比較することが重要とのこと。


まとめ
300ページで多くのアルゴリズムを駆け足紹介してくれます。多くのマシーンラーニング用のコマンドがRのパッケージとして提供されているので、それらのパッケージにインプットの形で落とし込むことができれば多くのアルゴリズムをつかう敷居は結構ひくいということが分かりました。ただ理論の部分は結構すっ飛ばしているところも多いし、Rのサンプルコードの量も多いので「サンプルコードを利用してじゃあ実際になんか作ってみようか」というにはちょっとこれ一冊では不十分な気もします(もちろんサンプルコードを何度もRのヘルプを見返しながら復習すれば別でしょうが)。それよりもこの本を踏み台に「今まで挫折していたような本にもう一度挑戦」とか
モチベーションを高めてくれる本です。