Top Banner
による分類木 入門
28

Rによる分類木 入門

Apr 21, 2017

Download

Data & Analytics

Hiro47
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Rによる分類木 入門

による分類木 入門

Page 2: Rによる分類木 入門

による分類木 入門

※いろいろなサイト・本を  自分なりにまとめてみました。

Page 3: Rによる分類木 入門

What’s classification tree? •  結果を分類するためにそのほかの値を見比べ、最もきれいに2分割できる条件を探していく手法

•  分岐の過程を図示することができるため,  分析結果の可読性が高い

•  分類木と回帰木がある

3

Page 4: Rによる分類木 入門

生成・生長 剪定

枝を伸ばす いらない枝を切り落とす

What’s classification tree?

Page 5: Rによる分類木 入門

生成・生長 剪定

枝を伸ばす いらない枝を切り落とす

What’s classification tree?

Page 6: Rによる分類木 入門

Example…

商品を サイズ 色 見た回数

買った M 普通 10

買った L 好き 5

買わない M 嫌い 3

買った M 好き 6

買わない L 好き 3

買わない M 普通 10

買わない M 嫌い 4

買った L 好き 6

目的変数がカテゴリカル(質的)な場合

6

Page 7: Rによる分類木 入門

Example…

生成・生長

7

Page 8: Rによる分類木 入門

・今回はCART(Classification And Regression Trees)という  目的変数を2つの集合に分岐させる方法を紹介する ・具体的にはジニ係数(GI : Gini index)やエントロピー(entropy)                という分類の不純度を計算する

How to classify.

8

Page 9: Rによる分類木 入門
Page 10: Rによる分類木 入門

Example…

商品を サイズ 色 見た回数

買った M 普通 10

買った L 好き 5

買わない M 嫌い 3

買った M 好き 6

買わない L 好き 3

買わない M 普通 10

買わない M 嫌い 4

買った L 好き 6

目的変数がカテゴリカル(質的)な場合

10

Page 11: Rによる分類木 入門

ex.)

M L 好き 普通・嫌い

≧4.5 <4.5

見た回数

ジニ係数(不純度)の一番低い分岐点を採用

データ   買った   買わない

説明変数

サイズ

ジニ係数

0.48 0.375 0.375 0.32 0.0 0.44

0.465 0.375 0.2

加重平均 加重平均 加重平均

11

Page 12: Rによる分類木 入門

生成・生長 剪定

枝を伸ばす いらない枝を切り落とす

What’s classification tree?

Page 13: Rによる分類木 入門

つまり

っていう枝を探すってこと

Page 14: Rによる分類木 入門

交差検証法(cross validation) How to prune?

⑴データをテストデータと    トレーニングデータに分ける  

⑵トレーニングデータだけで    モデルをつくる  

⑶できたモデルとテストデータを比較し、答え合わせをして、精度を求める  

⑷⑴〜⑶をn回繰り返し、平均する  

14

Page 15: Rによる分類木 入門

交差検証法(cross validation) How to prune?

⑴データをテストデータと    トレーニングデータに分ける  

⑵トレーニングデータだけで    モデルをつくる  

⑶できたモデルとテストデータを比較し、答え合わせをして、精度を求める  

⑷⑴〜⑶をn回繰り返し、平均する  

これを各ノードで行い、 制度の低いところを剪定する

15

Page 16: Rによる分類木 入門

Demonstration with

16

Page 17: Rによる分類木 入門

③ ②

⑥ ⑦

⑫ ⑬

>  library(mvpart)  >  #  決定木のplot  >  iris.rp  <-­‐  rpart(Species~.,  data=iris)  >  iris.rp  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)                  12)  Petal.Length<  4.95  48      1  versicolor  (0.00000000  0.97916667  0.02083333)  *              13)  Petal.Length>=4.95  6      2  virginica  (0.00000000  0.33333333  0.66666667)  *            7)  Petal.Width>=1.75  46      1  virginica  (0.00000000  0.02173913  0.97826087)  *  >  plot(iris.rp,uniform=T,branch=0.6,margin=0)  >  text(iris.rp,uniform=T,use.n=T,all=T)    

剪定前

17

Page 18: Rによる分類木 入門

もう少しシンプルにきれいにしたかったら・・・ >  library(partykit)  >  plot(as.party(iris.rp),uniform=T,branch=0.6,margin=0.5)

18

Page 19: Rによる分類木 入門

過学習してないか調べる >  printcp(iris.rp)    Classification  tree:  rpart(formula  =  Species  ~  .,  data  =  iris)    Variables  actually  used  in  tree  construction:  [1]  Petal.Length  Petal.Width      Root  node  error:  100/150  =  0.66667    n=  150              CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

>  plotcp(iris.rp)

19

Page 20: Rによる分類木 入門

過学習してないか調べる >  printcp(iris.rp)    Classification  tree:  rpart(formula  =  Species  ~  .,  data  =  iris)    Variables  actually  used  in  tree  construction:  [1]  Petal.Length  Petal.Width      Root  node  error:  100/150  =  0.66667    n=  150              CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

>  plotcp(iris.rp)

20

Page 21: Rによる分類木 入門

 CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

21

Page 22: Rによる分類木 入門

 CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

22

Page 23: Rによる分類木 入門

 CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

23

Page 24: Rによる分類木 入門

 CP  nsplit  rel  error  xerror          xstd  1  0.50            0            1.00      1.21  0.048367  2  0.44            1            0.50      0.74  0.061232  3  0.02            2            0.06      0.11  0.031927  4  0.01            3            0.04      0.11  0.031927

どちらかの値で剪定

24

Page 25: Rによる分類木 入門

③ ②

⑥ ⑦ >  iris.rp2_1  <-­‐  prune(iris.rp,cp=0.02)  >  iris.rp2_1  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)  *  >  plot(iris.rp2_1,uniform=T,branch=0.6,margin=0)  >  text(iris.rp2_1,uniform=T,use.n=T,all=T)  

剪定後

25

Page 26: Rによる分類木 入門

③ ②

⑥ ⑦ >  iris.rp2_2  <-­‐  prune(iris.rp,cp=0.094)  >  iris.rp2_2  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)  *  >  plot(iris.rp2_2,uniform=T,branch=0.6,margin=0)  >  text(iris.rp2_2,uniform=T,use.n=T,all=T)  

剪定後

26

Page 27: Rによる分類木 入門

上と下の剪定基準値の間に両方あるから

結局、結果は同じ・・・

27 ※詳細はよくわかりません m(_ _)m

Page 28: Rによる分類木 入門

分類木の精度を測りたいなら・・・

28

最後に

>  iris.tre  <-­‐  iris[2*(1:75)-­‐1,]  #  奇数行  >  iris.test  <-­‐  iris[-­‐(2*(1:75)-­‐1),]  #  偶数行  #  奇数行だけで分類木の生成  >  iris.tre  <-­‐  rpart(Species~.,  data=iris.tre,method="class")  >  pred  <-­‐  predict(iris.tre,  iris.test,  type="class")  #  偶数行でテストしてみる  >  table(pred,  iris.test$Species)                            pred                  setosa  versicolor  virginica      setosa                  25                    0                  0      versicolor            0                  24                  3      virginica              0                    1                22