2014-10-10
ビジネス側の人がデータ分析できるようになるために最初に読むべき一冊
我らが TJO 氏の初の単著が Amazon で酷評を受けていると聞いてやってきました。
- 作者: 尾崎隆
- 出版社/メーカー: 技術評論社
- 発売日: 2014/08/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
難解な専門用語が多すぎるとか、後半は読者を置いてけぼりだとか、さんざんな言われようです。
今回、実際にこの本を読んでみて、Amazon のレビューは正しい面もあるが、悪い面ばかりをとらえすぎていると思いました。
評価の良いレビューもあるのに、悪評価だけが上に上がっているのもおかしいです。
この本が役に立ったという人の意見にも耳を傾けるべきです。
まず、私がこの本を通して読んでみて思ったのは、マーケターのようなビジネス側の人間がデータ分析を学ぶのにいいなあということです。
説明は平易だし、出てくるプログラムも簡単です。
if も for も出てこないので、プログラミングできない人が最初に読むのにいいなと思いました。
私なら、マーケターでちゃんとしたデータ分析やりたいと思っている人にお勧めします。
著者である TJO 氏は「エンジニアのスキルのある人に限る」とおっしゃっていましたが*1、若い人なら吸収力があるので、その辺は大丈夫だろうと思います。
しかし、Amazon のレビューにあるように、この本にはいくつか罠がひそんでいます。
この記事では、ビジネス側の人間がどのようにこの本を読めば役に立つのか、各章について補足的な説明していこうと思います。
第 1 章 データマイニングとは
この章は導入ですが、「1-3 これだけは覚えておきたい基礎知識」で、ばらつきと可視化の話をしているのがいいですね。
データ分析とそうでないものを分ける境界線は、分布の形を見ているかどうかだと私は思っています。
うちのマーケターだと、平均値しか見ていない(それで意思決定している)ので、これではとても分析とは言えません。
この節では、平均値以外の代表値(中央値、最頻値)に加え、ヒストグラム、箱ひげ図、分散・標準偏差など、ばらつきと分布の見かたという、データ分析に最も重要な項目を説明していて、とても大事なところです。
第 2 章 R を使ってみよう
この章は R のインストール方法と、ちょっとした文法の説明です。
昔は R は日本語でインストールしようとすると文字化けしたものですが、今はそんなこともなくすんなりとインストールできると思います。
文法で、if とか for が難しいと感じた人は安心してください。
この本ではこれ以降 if も for も使いません。
第 3 章 仮説検定
ビジネスデータ分析で重要な A/B テストの話は理解しておいた方がいいです。
とくに、データ数を考慮せずに、コンバージョン率の差だけ見て、効果のありなしを判定することはできないというのは重要です。
第 4 章 重回帰分析
オーソドックスな分析手法、重回帰分析の話。
データ分析と聞いてこれをまず思い出す人が多いのではないかと。
ビールの売上高のデータで平易に説明されています。
第 5 章 クラスタリング
「何かの基準に基づいて似た者同士をまとめる」=クラスタリング
ということで、最初の説明が直感的で分かりやすいです。
混合分布クラスタリングとか、私も知らなかったので勉強になりました。
第 6 章 ロジスティック回帰
ここからちょっと難しくなってきます。
私の感覚では、不要な用語を出しすぎているように感じます。
- 一般化線形モデル ← 忘れて下さい
- ロジットリンク関数 ← 忘れて下さい
- 最尤法 ← こういう言葉があるということだけ覚えておく
ここら辺に注意して読んでみてください。
第 7 章 決定木
ビジネスデータ分析で最もよく使う機械学習手法です。
説明はちゃんと読めば難しくないはずです。
第 8 章 SVM/ランダムフォレスト
この章は難解かつ専門用語のオンパレードなので読まなくていいです。
必要な方は別の本で学ぶことをお勧めします。
第 9 章 アソシエーション分析
「ビールとおむつ」で有名なデータマイニング手法です。
ここでは、支持度、信頼度、リフトといった新しい用語がいくつか出てきて難解のように思えるかもしれません。
しかし、アソシエーション分析を使えるようになるには、これらの用語を正しく理解する必要があります。
6 章で無駄に出てきた用語とはわけが違いますのでしっかりと読み込んで理解してください。
第 10 章 その他の分析メソッドについて
基本的に読まなくてもいいです。
興味のある人はさらっと眺めてみるのもいいでしょう。
ちなみに Stan が出てくるのはこの章の一番最後です。
たぶん日本語で出版された書籍では初めて Stan の説明をしているのではないでしょうか。
ただ、Stan 目的にこの本を買うのはクレイジーです。
まとめ
というわけで最後に、Amazon 書評に対する反論を書いておきます。
難解な専門用語が多すぎるという件について
確かに後半(6章以降)は専門用語が多くなっていると感じます。
しかし、個別に見ていけば、
- 6 章は上で紹介した用語に注意すれば読めます。
- 8 章は難しすぎるので読む必要はありません。
- 9 章の専門用語は分析を理解するために必要です。
- 10 章はアドバンストな内容なので、仕方ないかと。
という感じで、8 章を除けばこんなもんかなと思います。
後半は読者を置いてきぼりという件について
後半は確かに難しくなっています。
また、不要な専門用語も多くなっていると感じます。
しかし、逆に言えば前半は非常に平易かつわかりやすく書かれています。
何も知らない 0 から学ぶ人には、前半だけでも価値があるのではないでしょうか。
以上です。
追記
2011-06-18
交差検定の k の値はどれくらいにすればいいのか
分類器(識別器)のモデルを評価する手法に交差検定(クロスバリデーション)があります。
交差検定を行うには、データをいくつに分割するかを表す k の値を決めてあげなければなりません。
SVM のチューニングのしかた(1) において、交差検定の k の値を決めるとき、僕は個人的に
k = 1 + log(n)/log(2)
という式を用いていると書きました。
この式は、知っている人ならわかると思いますが、スタージェスの公式です。
スタージェスの公式は、ヒストグラムを描く際にサンプル数から階級数を決めるのに便利な公式です。
しかし、この公式を交差検定の k を決める際に使用するのは、はっきりいって根拠がありません。
そこで、今日は交差検定の k の値をどのくらいにすれば良いのかについて考えてみたいと思います。
準備(予備知識)
k の値は大きければ大きいほど、正確にモデルを評価できます。
k の最大値はサンプル数ですので、「k = サンプル数」とした場合が最も正確な評価だと言えます*1。
というわけで、できれば「k = サンプル数」でやりたいところですが、k が大きければそれだけ実行に時間がかかるので、k はなるべく小さい値にしなければなりません。
交差検定の原理上、「k = サンプル数」とした場合、モデルの評価値(正答率)は、交差検定を繰り返したとしても常に同じ値になります。
逆に、「k < サンプル数」の場合は、交差検定を何度かやると、そのたびに違った値が返ってきます。
この違いのばらつき具合(分散)は、k が小さいほど顕著になると考えられます。
そこで、k をいろいろ変えてみて、一つの k に対して交差検定を繰り返し、そのときの分散を調べてみると何かがわかるのではないかと思いました。
シミュレーション
上で書いた実験を、下記のような R のコードでシミュレーションしてみました。
library(e1071) data(iris) sds <- c() means <- c() cat("k-fold", "Mean", "SD", "\n", sep="\t") range <- seq(5, 150, by=5) for(k in range) { accs <- c() for(j in 1:100) { model <- svm(Species ~ ., data = iris, cross=k) accs <- c(accs, model$tot.accuracy) } mean <- mean(accs) sd <- sd(accs) cat(k, mean, sd, "\n", sep="\t") means <- c(means, mean) sds <- c(sds, sd) }
データとしては以前に使った iris を使用しました。k の値を 5, 10, 15, ... というように増やしていって、150(iris のサンプル数)まで調べています。
一つの k に対して、交差検定を 100 回繰り返し、正答率の平均(mean)と標準偏差(sd)を出しています。
結果は下記のような感じで出てきます。
k-fold | Mean | SD |
---|---|---|
5 | 94.73333 | 1.005038 |
10 | 95.86 | 0.6162411 |
15 | 96.18 | 0.4910421 |
20 | 96.27333 | 0.435207 |
25 | 96.43333 | 0.3834395 |
... | ... | ... |
150 | 96.66667 | 0 |
グラフ
さて、標準偏差のグラフを描いてみます。
plot(range, sds) sp <- smooth.spline(range, sds) pred <- predict(sp, seq(5, 150, length=20)) lines(pred) abline(v=(1+log2(150))*4, col="red")
やはり k が小さいほど標準偏差は大きいことが見て取れます。
また、標準偏差は k が大きくなるにつれ減少していきますが、k の小さい範囲での減少率と k がある程度大きくなってからの減少率では違いが見えます。
グラフ中に赤い線を引いてありますが、これは
k = (1 + log(n)/log(2)) * 4
のところに引いています。僕が思うに、ここら辺が減少率の境目かなーというところです。
もうひとつ、グラフを作ってみましょう。
plot(range, means, ylim=c(93, 97)) sp <- smooth.spline(range, means) pred <- predict(sp, seq(5, 150, length=100)) lines(pred) pred <- predict(sp, range) ucl <- pred$y + sds lcl <- pred$y - sds segments(range, ucl, range, lcl) abline(v=(1+log2(150))*4, col="red")
これは、正答率の平均値に、エラーバーとして標準偏差を付け加えたものです。
このグラフからも、k が小さい間は正確な評価ができていないのに対し、ある程度大きくなると横ばいになっている様子が見て取れます。
まとめ
上で見たように、サンプル数に対して k が小さすぎると、正答率の誤差が大きくなります。
モデル比較の際には、この誤差に気をつける必要があります。
安易に「こっちのモデルの方が正答率が 1% 高かったので採用する」などというのはナンセンスです。
なぜなら k が小さすぎて誤差が 1% 以上あるかもしれないからです。
常に k = 10 などと固定せずに、サンプル数に合わせた k の値を採用するのが賢明に思います。
よくわからないという人は、k を決める際に次の式をお勧めしときます*2。
k = (1 + log(n)/log(2)) * 4
これは、スタージェスの公式に 4 をかけたものです(上のグラフの赤ライン)。
ちなみに、僕がなぜスタージェスの公式にこだわっているかというと、k の値を「サンプル数の5分の1」などとすると、サンプル数が 1000 のように大きかった場合に、すぐに k = 200 などとなってしまうからです。
なので、k の最適値を出す公式には必ず log(n) が入っているだろうと思っています。
以上です。
2011-03-25
SVM のチューニングのしかた(2)
さて、前回は交差検定の説明で終わってしまいましたが、今回はちゃんと SVM のチューニングの話をします。
チューニングの手順としては、
- グリッドサーチで大雑把に検索する。
- 最適なパラメータがありそうなところを絞って再びグリッドサーチを行う。
という2段階のグリッドサーチを行います。
1段階目:グリッドサーチで大雑把に検索する
SVM のチューニングは tune.svm() という関数を用いて行います。
チューニングのやり方は、単純にグリッドサーチを行っているだけです。
パラメータの値をいろいろ変えてみて、正答率の一番いい値をベストパラメータとして出力します。
プログラムは下記のようになります。
gammaRange = 10^(-5:5) costRange = 10^(-2:2) t <- tune.svm(Species ~ ., data = iris, gamma=gammaRange, cost=costRange, tunecontrol = tune.control(sampling="cross", cross=8)) cat("- best parameters:\n") cat("gamma =", t$best.parameters$gamma, "; cost =", t$best.parameters$cost, ";\n") cat("accuracy:", 100 - t$best.performance * 100, "%\n\n") plot(t, transform.x=log10, transform.y=log10)
まずはグリッドサーチするために、gamma と cost の範囲を決めています。ここでは gamma は 〜
まで、cost は
〜
までを指定しています。
次に tune.svm() でグリッドサーチを行います。svm() と同じような使い方ですが、交差検定を行うために tunecontrol = tune.control(sampling="cross", cross=8) と指定しています。これで 8-交差検定で評価を行うということになります。
あとはグリッドサーチの結果としてベストパラメータを出力しています。上記のプログラムを実行すると、結果は下記のように出ました。
- best parameters:
gamma = 0.1 ; cost = 1 ;
accuracy: 97.33187 %
gamma=0.1, cost=1 の組合せのとき、正答率 97.3 % を出していることがわかります。
ただし、1段階目ではベストパラメータの値はそれほど重視しません。
重要なのは最後の行、plot() 関数でグリッドサーチの結果を等高線図にしています。
等高線図は次のようになりました。
この図の中で色の濃い部分に最適なパラメータがありそうです。
そこで、gamma=,cost=
のあたりと gamma=
,cost=
のあたりを再びグリッドサーチで調べてみましょう。これが2段階目となります。
2段階目:最適なパラメータがありそうなところを絞って再びグリッドサーチ
まずは gamma=,cost=
のあたりをグリッドサーチしてみましょう。
gamma <- 10^(-1) cost <- 10^(0.5) gammaRange <- 10^seq(log10(gamma)-1,log10(gamma)+1,length=11)[2:10] costRange <- 10^seq(log10(cost)-1 ,log10(cost)+1 ,length=11)[2:10] t <- tune.svm(Species ~ ., data = iris, gamma=gammaRange, cost=costRange, tunecontrol = tune.control(sampling="cross", cross=8)) cat("[gamma =", gamma, ", cost =" , cost , "]\n") cat("- best parameters:\n") cat("gamma =", t$best.parameters$gamma, "; cost =", t$best.parameters$cost, ";\n") cat("accuracy:", 100 - t$best.performance * 100, "%\n\n") plot(t, transform.x=log10, transform.y=log10, zlim=c(0,0.1))
around [gamma = 0.1 , cost = 3.162278 ]
- best parameters:
gamma = 0.06309573 ; cost = 5.011872 ;
accuracy: 97.33187 %
gamma, cost, 正答率が出ました。
次は、gamma=,cost=
のあたりをグリッドサーチしてみましょう。
gamma <- 10^(-1.5) cost <- 10^(1.5) gammaRange <- 10^seq(log10(gamma)-1,log10(gamma)+1,length=11)[2:10] costRange <- 10^seq(log10(cost)-1 ,log10(cost)+1 ,length=11)[2:10] t <- tune.svm(Species ~ ., data = iris, gamma=gammaRange, cost=costRange, tunecontrol = tune.control(sampling="cross", cross=8)) cat("[gamma =", gamma, ", cost =" , cost , "]\n") cat("- best parameters:\n") cat("gamma =", t$best.parameters$gamma, "; cost =", t$best.parameters$cost, ";\n") cat("accuracy:", 100 - t$best.performance * 100, "%\n\n") plot(t, transform.x=log10, transform.y=log10, zlim=c(0,0.1))
around [gamma = 0.03162278 , cost = 31.62278 ]
- best parameters:
gamma = 0.05011872 ; cost = 5.011872 ;
accuracy: 98.64766 %
こうして2回グリッドサーチをやりましたが、1回目の正答率は 97.3%、2回目の正答率は 98.6% と2回目の方が高いです。
というわけで、最適なパラメータとして、gamma = 0.05011872, cost = 5.011872 を選ぶことにします。
おわりに
以上で、SVM のチューニングが終わりました。上記のパラメータで SVM を作成するには下記のようにします。
gamma = 0.05011872 ; cost = 5.011872 ; model <- svm(Species ~ ., data = iris, gamma=gamma, cost=cost)
これで、学習データを判別してみると
pred <- predict(model, iris) table(pred, iris[,5])
pred setosa versicolor virginica setosa 50 0 0 versicolor 0 49 1 virginica 0 1 49
本に載っているより、判別精度が上がっていることもわかります。
以上です。
2011-03-24
SVM のチューニングのしかた(1)
「Rによるバイオインフォマティクスデータ解析 第2版」という本を買いました。
Rによるバイオインフォマティクスデータ解析 第2版 ?Bioconductorを用いたゲノムスケールのデータマイニング?
- 作者: 樋口千洋
- 出版社/メーカー: 共立出版
- 発売日: 2011/01/08
- メディア: 単行本
- 購入: 4人 クリック: 106回
- この商品を含むブログ (8件) を見る
これ、買って損したと思いました。
なんていうかね、説明が中途半端なんですよ。解析に使えるパッケージの紹介に留まっていて、実際に解析を行うには情報が足りなさすぎる。
「こういう解析がしたい」と思ったときに R のパッケージ名を調べるような、逆引き辞書として使うには便利なんだろうけど、それだけのために 4,830円出したのかって思うとね、やっぱり損した気分になるわけですよ。
まあ、そんなことをグチグチ言っても仕方ないので、今日はもうちょっと建設的なことをしようと思います。
僕は機械学習を少しかじっているので、この本の SVM の節がこれだけでは実用に足りないことが分かります。
そこで、僕の知っている実用的な知識をここに記しておくことにします。
この本に足りない情報を補完することで、みんなが幸せになればいいと思います。
SVM のチューニング
SVM(Support Vector Machine) はみなさん御存じ機械学習の手法です。
この本の SVM の項(7.15)では、デフォルト設定でモデルを作って、学習データを判別して、ハイ終わりです。
これだけの情報では実際の解析は絶対にできません。
一番足りないなと感じたのは、SVM のチューニングについてです。
SVM はデフォルト設定でモデルを作ってもしょうがないです。gamma と cost というパラメータがあるので、これらの値に最適値を設定しなければなりません。R の SVM の Help にもこう書いてあります。
Parameters of SVM-models usually must be tuned to yield sensible results!
(訳) SVM でいい結果出したかったらチューニングしろよな!
というわけで、SVM のチューニングのしかたについて説明したいと思います。
交差検定
おっと、その前に、交差検定の話をしなければなりません。
SVM モデルをチューニングする際、二つのパラメータでグリッドサーチをします。
すなわち、パラメータをいろいろ変えてみて、一番いい SVM モデルとなる組合せを選ぶのです。
この「一番いい SVM」というのはどうやって評価すればよいでしょうか?
この SVM の評価方法として良く使われるのが交差検定です。
交差検定を説明するために、SVM を評価する単純な方法から順を追って説明していきたいと思います。
単純な方法
まず考えられるのは、SVM を作るのに使った学習データを再び評価にも用いるという方法です。*1
学習に使ったデータを判別してみて、うまく判別できた割合(正答率)を出します。
しかし、これはうまいやり方ではありません。
学習に使ったデータがうまく判別できるのは、当たり前のことだからです。
我々がやりたいことは、SVM で学習データ(既知データ)を判別したいのではなく、まだ手元に無いデータ(未知データ)をうまく判別できるかどうかで SVM を評価したいのです。
そこで、次の方法が考えられます。
ホールドアウト検定
ホールドアウト検定は、SVM の評価方法としてはかなり単純です。
学習に使用するために集めたデータのうち、何割かを評価専用のデータにするのです。
このとき、評価に使うデータは学習データに含めてはいけません。
つまり、集めたデータを学習専用と評価専用の二つに分け、学習用データで SVM を作成し、評価用データで評価する、ということです。
これにより、作成した SVM が、どのくらい未知データを判別できるのかが評価できます。
これがホールドアウト検定です。
ただし、ホールドアウト検定には次のような欠点があります。
- 集めたデータを学習専用と評価専用に分けるため、学習に使えるデータの量が減る。
- データを学習用と評価用に分ける際、分け方に偶然偏りができた場合にはうまく評価ができない。
これら二つの欠点をうまく解決しているのが、次に説明する交差検定という手法です。
交差検定
交差検定では、学習に使うために集めたデータをいくつかに分割します。
いま、例えば 150サンプルのデータを集めたとします。これを 50サンプルづつ、3個のグループに分割したときのことを考えてみましょう。
まず、第1グループと第2グループの合計 100 サンプルを学習データとして SVM を作成します。
そして、残りの第3グループの 50 サンプルを評価用データとして正答率を出します。
次に、第1グループと第3グループを学習データ、第2グループを評価用データとして正答率を出します。
最後に、第2グループと第3グループを学習データ、第1グループを評価用データとして正答率を出します。
これを表にすると次のようになります。
第1グループ | 第2グループ | 第3グループ | |
1回目 | 学習 | 学習 | 評価 |
2回目 | 学習 | 評価 | 学習 |
3回目 | 評価 | 学習 | 学習 |
こうして出された3つの正答率の平均値を、150サンプル全体を学習データとして作成したときの SVM の正答率とみなすのが交差検定という手法です。
3つのグループに分けたということを明示したいときは、3-交差検定といいます。
一般に、k個のグループに分割する交差検定のことを k-交差検定といいます。
この手法には次の特徴があります。
- 未知データに対して正答率を出している。
- 最終的な正答率は学習データ全体を使用して作成された SVM に対するものである。
- 学習用データと評価用データに偶然偏りができても、平均を取ることによって影響を小さくできる。
ホールドアウト検定の欠点をうまく解決していることがわかると思います。
実際にやってみよう
さて、R で交差検定をやるのは、実に簡単です。実際にやってみましょう。
library(e1071) data(iris) model <- svm(Species ~ ., data = iris, cross=3) summary(model)
とまあ、svm の引数に cross=3 と入れれば、3-交差検定が行われ、結果を summary() で見ることができます。
3-fold cross-validation on training data:
Total Accuracy: 94.66667
Single Accuracies:
98 90 96
ちなみに、cross-validation が交差検定、accuracy が正答率です。Single Accuracies がそれぞれの試行の正答率で、Total Accuracy がそれらの平均値になっているのがわかりますね。
ところで、iris は 150 サンプルあるので、グループ 3つでは少ない気がします。
いくつのグループに分けるかで評価も変わってくるので、ここは重要です。
僕がいつも使っているのは次の数式です*2。サンプル数を n とすると、
k = 1 + log(n)/log(2)
iris は 150 サンプルあるので、
k = 1 + log(150)/log(2) = 8.2288...
というわけで、k = 8 でやってみることにします。
model <- svm(Species ~ ., data = iris, cross=8) summary(model)
8-fold cross-validation on training data:
Total Accuracy: 95.33333
Single Accuracies:
94.44444 89.47368 100 89.47368 100 94.73684 94.73684 100
これで、iris データに対して、SVM のデフォルト設定での正答率は 95.3 ということが求まりました。
次回は、この正答率を上げるべく、SVM をチューニングしていきたいと思います。
2010-08-03
パターン認識における識別手法のてきとーなまとめ
- Nearest Neighbor 法(Wikipedia)
- 最も単純な方法。区分的線形分離。精度は悪い。
- パーセプトロン(Wikipedia)
- 学習データが線形分離可能な場合のみ有効。
- Widrow-Hoff
- 学習データが線形分離不可能な場合に、誤差が最小になるように線形分離。
- 学習データが線形分離可能な場合でも、誤識別なく分類できる保証はないのが欠点。
- SVM(Support Vector Machine)(Wikipedia)
- マージン最大になるように線形分離する。
- 線形分離不可能な場合はカーネルを使って高次元で線形分離。
- 精度は良いが、速度が遅い。
- ニューラルネットワーク(Wikipedia)
- 非線形分離。
- うまくカスタマイズすればいくらでも精度が良くなるが、そのカスタマイズが難しい。
- ベイズ識別
- 背景となるデータ分布を推定し、未知データに対する誤識別の確率が最小になるようにする。
- 単純ベイズ法(Wikipedia)は、精度がそこそこ良く、速度も速い。
フリーソフトでつくる音声認識システム?パターン認識・機械学習の初歩から対話システムまで?
- 作者: 荒木雅弘
- 出版社/メーカー: 森北出版
- 発売日: 2007/10/01
- メディア: 単行本(ソフトカバー)
- 購入: 45人 クリック: 519回
- この商品を含むブログ (38件) を見る