(続)Rとデータマイニング入門
前回(グラフプロット迄)の続き
データ解析は複雑なデータを扱うので視覚情報に頼る事が多い。
(模様的にいい感じ!といった具合)
Rはグラフ出力が優秀で助かる!!
データマイニング
rpart(決定木)
150件全部のデータで学習させ、決定木を作ってみる。
グラフを見ると色々解る
- "setosa"は単純にPetal.Lengthで分離できる。
- "versicolor","virginica"はPetal.Widthで大体分離できるが少しは混ざる(エラー)
rpart.r
#!/usr/bin/evn Rscript library(rpart.plot) data(iris) # Learn and create tree tree <- rpart(Species~.,data=iris,method="class") # Dump tree tree # Plots rpart.plot(tree,yesno=F,extra=101,type=4,faclen=15,varlen=15) rpart.plot(tree,yesno=F,extra=101,type=4,faclen=15,varlen=15,fallen.leaves=T) rpart.plot(tree,branch.type=4,yesno=F,faclen=15,varlen=15,extra=101)
単純な木だからDumpでもソコソコ理解できる
n= 150 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 150 100 setosa (0.33333333 0.33333333 0.33333333) 2) Petal.Length< 2.45 50 0 setosa (1.00000000 0.00000000 0.00000000) * 3) Petal.Length>=2.45 100 50 versicolor (0.00000000 0.50000000 0.50000000) 6) Petal.Width< 1.75 54 5 versicolor (0.00000000 0.90740741 0.09259259) * 7) Petal.Width>=1.75 46 1 virginica (0.00000000 0.02173913 0.97826087) *
予測
木を作れば、未知のデータに対しても予測ができる。
predict.r
150件のデータ中半分(75件)をサンプリングして学習し残りのデータを予測する。
#!/usr/bin/evn Rscript library(rpart) library(rpart.plot) data(iris) d<-iris # Sampling s <- sample(nrow(d),nrow(d)*0.5) d.sample <- d[s,] d.test <- d[-s,] # Create tree tree <- rpart(Species~.,data=d.sample,method="class") tree rpart.plot(tree,yesno=F,extra=101,type=4,faclen=15,varlen=15,fallen.leaves=T) # Predict predtree <- predict(tree,d.test,type="class") # Results table(d.test$Species,predtree)
横軸が『正解』縦軸が『予測』を表している。
つまり本当は"virginica"なのに"versicolor"と予測してしまったモノが3件ある
上のTreeの結果の通り"versicolor"と"virginica"の分離は難しい模様・・・
n= 75 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 75 46 versicolor (0.28000000 0.38666667 0.33333333) 2) Petal.Length< 2.45 21 0 setosa (1.00000000 0.00000000 0.00000000) * 3) Petal.Length>=2.45 54 25 versicolor (0.00000000 0.53703704 0.46296296) 6) Petal.Width< 1.65 28 1 versicolor (0.00000000 0.96428571 0.03571429) * 7) Petal.Width>=1.65 26 2 virginica (0.00000000 0.07692308 0.92307692) * predtree setosa versicolor virginica setosa 29 0 0 versicolor 0 21 0 virginica 0 3 22
random forest(決定木)
やっと今回の目的まで来た!!
そう。大体のデータはまずrandom forestにかけるベシ!
random forestでは上の様な決定木を幾つも作り、多角的に評価する。
上の単純な決定木では拾いきれない連中を助ける事ができる。(ハズ)
randomForest.r
#!/usr/bin/evn Rscript library(randomForest) data(iris) d<-iris s <- sample(nrow(d),nrow(d)*0.5) d.sample <- d[s,] d.test <- d[-s,] forest <- randomForest(Species~.,data=d.sample,ntree=500,importance=T) forest plot(forest) varImpPlot(forest) importance(forest) predforest <- predict(forest,d.test,type="class") table(d.test$Species,predforest)
あれれ?あまり変わんなぁ
3/75 = 4%
学習のサンプリング数が少ないし、random forest君もサンプリングのエラー率が6.67%と言ってる。
まあ予測精度ってのはこんなモノである。
randomForest 4.6-6 Type rfNews() to see new features/changes/bug fixes. Call: randomForest(formula = Species ~ ., data = d.sample, ntree = 500, importance = T) Type of random forest: classification Number of trees: 500 No. of variables tried at each split: 2 OOB estimate of error rate: 6.67% Confusion matrix: setosa versicolor virginica class.error setosa 26 0 0 0.00000000 versicolor 0 22 3 0.12000000 virginica 0 2 22 0.08333333 setosa versicolor virginica MeanDecreaseAccuracy Sepal.Length 2.929630 0.06475861 3.383496 1.8000081 Sepal.Width 1.140845 0.13359321 1.432476 0.8392769 Petal.Length 5.436318 5.38457538 6.160392 3.4376186 Petal.Width 5.171155 5.61849111 6.673574 3.5327468 MeanDecreaseGini Sepal.Length 5.264504 Sepal.Width 1.676426 Petal.Length 20.868405 Petal.Width 21.441419 predforest setosa versicolor virginica setosa 24 0 0 versicolor 0 25 0 virginica 0 3 23
少し解説するとMeanDecreaseGiniは変数の重要度。
つまりコノ部分はこう言っている
『幾ら多角的に評価してもPetal.LengthとPetal.Widthが圧倒的に重要である』
rpartと結果が変わらないのも納得
MeanDecreaseGini Sepal.Length 5.264504 Sepal.Width 1.676426 Petal.Length 20.868405 Petal.Width 21.441419
クラスタリング
サンプリングで学習するのでは無く、データの集合から同じ特徴を持つグループを見つけ出す手法。
アルゴリズムは色々あるのだが、難しい話は抜きにして色々試してみた。
それでも詳しい話が気になる人向けに・・・
- http://www.kamishima.net/jp/clustering/
- http://www.slideshare.net/hamadakoichi/webr-r
- http://www1.doshisha.ac.jp/~mjin/R/28/28.html
- http://www1.doshisha.ac.jp/~mjin/R/29/29.html
機械学習:Random Forest
全データでサンプリングして、同じデータをテストしているので、完全に特徴を掴めている。
=== RandomForest === predforest setosa versicolor virginica setosa 50 0 0 versicolor 0 50 0 virginica 0 0 50
機械学習:Rpart
やはり"versicolor" "virginica" の部分がとり切れない。
データプロットで見ると致し方ない事がよく解る。
=== Rpart === predtree setosa versicolor virginica setosa 50 0 0 versicolor 0 49 1 virginica 0 5 45
ソフト:Cmeans (fuzzy k-means)
ソフトクラスタリングは複数のクラスタに所属する事ができる。(比重付)
比重が60%を下回っているモノは(11,12,13)としてtable出力した。(setosaは完璧に分離出来たので13は無い)
プロットでは比重は色分けによって表現した。(RGB)
境目の状態が良く解る
=== Cmeans === c 1 2 3 11 12 setosa 0 0 50 0 0 versicolor 42 2 0 5 1 virginica 9 35 0 4 2
ソフト:Cmeans (extends UFC)
UFCの拡張らしい。詳しい事は良く解らない!!
cmeansとの違いはなんだろう?
=== Ufcl === c 1 2 3 11 13 setosa 0 50 0 0 0 versicolor 1 0 42 2 5 virginica 35 0 11 1 3
k-means
hartigan-wongが一番良い結果が出るらしいのだが・・・
実際の答えとは外れているが、プロット的には綺麗だ。
きっちり特徴を捉えているとも言える。
=== Kmeans hartigan-wong === 1 2 3 setosa 50 0 0 versicolor 0 48 2 virginica 0 14 36
階層型:average
階層型クラスタリング
次元が大きく(変数が多く)なったり、乱れが大きいデータでは役にたたない。
ユークリッド距離を平方距離とした場合(下):
なるほど!確かにそこで分けても良いよな!!
=== average === 1 2 3 setosa 50 0 0 versicolor 0 50 0 virginica 0 14 36 1 2 3 setosa 50 0 0 versicolor 0 50 0 virginica 0 38 12
階層型:complete
確かにソコで分けても良さそう!
=== complete === 1 2 3 setosa 50 0 0 versicolor 0 23 27 virginica 0 49 1 1 2 3 setosa 50 0 0 versicolor 0 23 27 virginica 0 49 1