Your SlideShare is downloading. ×
0
第34回R勉強会@東京(#TokyoR)

決定木

@gepuro
自己紹介
●

電気通信大学大学院修士一年

●

早川 敦士(@gepuro)

●

専攻:信頼性工学、品質管理

●

興味:マーケティング、生存時間解析、テキストマイニング

●

著作物:データサイエンティスト養成読本(技術評論社)
...
ブログをやってます

http://blog.gepuro.net
おなじみのirisデータを使います

setosa

versicolor

verginica

Sepal Length: がく片の長さ
Sepal Width: がく片の幅
Petal Length: 花びらの長さ
Petal Width...
決定木って?
決定節点:変数の値をチェックする
根節点:決定節点のうち最初の決定節点
葉節点:ラベルが割りあてられる。

根節点
節点にある条件を満たすと、
左側へ行く。
決定節点

葉節点

Pepal.Length<2.45は、
setos...
決定木の説明は以上です。
折角なので、もう少し詳しく勉強します。
まずは、描き方を
rpart()を利用します。
rpart(目的変数~説明変数)

グラフを描く時に、par(xpd=NA)を忘れずに

各ラベルのn数も表示しよう

これだけ簡単ならば、目をつぶっても出来る?
どうやって、決定節点を求めるの?
ジニ係数を用います。
決定節点

節点tにおける誤り率

誤り率が最小になるように、
決定節点を求める。
決定木の大きさは?

小さすぎる決定木では、
正しく分類できない。

小さい決定木

決定木が大きすぎると過学習
を起こす。
(訓練データに適応しすぎる)
剪定しよう
決定木の大きさ

(10

交
差
検
証
法

)

セ
ッ
ト
に
よ
る
誤
り
率

誤りの最小値とその点
の標準偏差を加えた値

決定木の複雑度

棒線を越えない最大の
CPが良いとされている。
(1標準偏差ルール)

p...
予測しよう
カテゴリデータの予測は、
type=”class”を
忘れずに

真値と予測結果

訓練データと検証データは同一で
あるが、そこそこの精度で分類出来
ていることが分かる。
決定木で回帰分析
●

決定木の回帰バージョンは、回帰木と呼ばれる。
サンプルデータ: スポーツテストデータ
説明: 中学生104人の運動能力テスト6種と体力測定5種の計測のデータ
データ数:104レコード
http://mo161.soci....
50m走のタイムを予測する

分岐後の50m走の
タイムの平均

走り幅跳びの成績の良さが50m走のタイム
に好影響を与えている。
枝きりタイム

大きな木を見て、剪定する。
残差のヒストグラム
hist(sports$X50mRun - predict(model, sports))

真の値と予測結果がどれほどズレているか。
決定木に親しもう
決定木の使い所は、予測だけじゃない!!
●

どの変数に注目すれば良いか?

●

目的変数と関係が深そうな変数は?

●

層別解析のヒントを得る。

予測モデルとしては精度が低い時もあるが、
分析のヒントを得られるかも!
分析のヒントとは?

疑問:50m走が早い人は、どんな人だろうか?
答え:走り幅跳びが得意な人
時間に余裕が出来たので、
●

Rでデータを加工する時の方法を紹介します。

●

独断と偏見のランキング形式で。
第十位
●

cumsum
累積和を求める

cumsum(iris$Sepal.Length)
第九位
●

colMeans,colSums, rowMeans, rowSums
列毎、行毎に平均や合計を求める

> colMeans(iris[,1:4])
Sepal.Length Sepal.Width Petal.Length P...
第八位
●

reshape
データを横に展開する
> iris$ID <- 1:150
> reshape(iris[,c(1,5,6)], idvar="ID", timevar="Species",
direction="wide")
I...
第七位
●

aggregate
集計を行う
> aggregate(iris[,1:4], by=list(iris$Species), mean)
Group.1 Sepal.Length Sepal.Width Petal.Length ...
第六位
●

apply
慣れれば便利。for文でも代用可
apply(iris[,1:4], 1, sum) # 行毎に合計を求める
apply(iris[,1:4], 2, sum) # 列毎に合計を求める
第五位
●

ifelse
条件分岐を一行で書く

ifelse(条件, 条件が真の時返す値, 偽の時返す値)
> ifelse(sports$X50mRun < 8, "1", "0")
第四位
●

rbind
テーブルを縦に結合する
> df3 <- data.frame(a=1:3, b=2:4)
> df4 <- data.frame(a=4:6, b=5:7)
> rbind(df3, df4)
ab
112
223
...
第三位
●

merge
テーブルを横に結合する。

> df1 <- data.frame(a=1:5, b=2:6)
> df2 <- data.frame(a=c(1,2,4,6), c=c(2,3,4,5))
> merge(df1, ...
第二位
●

table
クロス集計を作成する。
> table(iris$Species)
setosa versicolor virginica
50
50
50
> table(iris$Species, iris$Petal.Width...
第一位
●

subset
条件に一致するデータを抽出する

# 50m走が8秒未満のレコードを抽出
subset(sports, X50mRun < 8)
# setosaもしくはversicolorのレコードを抽出
subset(iris,...
●

●

気分を盛り上げるために、ランキングで紹介しまし
たが、深く考えた結果では無いです。
あまり気にしないでください。
参考
●

R-tips,http://cse.naro.affrc.go.jp/takezawa/r-tips/
r.html

●

はじめてのパターン認識,森北出版

●

入門 自然言語処理,オライリー
ご清聴ありがとう
ございました。
Upcoming SlideShare
Loading in...5
×

Decision tree

2,786

Published on

Transcript of "Decision tree"

  1. 1. 第34回R勉強会@東京(#TokyoR) 決定木 @gepuro
  2. 2. 自己紹介 ● 電気通信大学大学院修士一年 ● 早川 敦士(@gepuro) ● 専攻:信頼性工学、品質管理 ● 興味:マーケティング、生存時間解析、テキストマイニング ● 著作物:データサイエンティスト養成読本(技術評論社) ● 好きな物:ラーメン、りんごジュース、花火
  3. 3. ブログをやってます http://blog.gepuro.net
  4. 4. おなじみのirisデータを使います setosa versicolor verginica Sepal Length: がく片の長さ Sepal Width: がく片の幅 Petal Length: 花びらの長さ Petal Width: 花びらの幅 Species: 品種 品種毎に50レコードで、計150レコードの データセットを利用します。 画像データ:http://en.wikipedia.org/wiki/Iris_flower_data_set より
  5. 5. 決定木って? 決定節点:変数の値をチェックする 根節点:決定節点のうち最初の決定節点 葉節点:ラベルが割りあてられる。 根節点 節点にある条件を満たすと、 左側へ行く。 決定節点 葉節点 Pepal.Length<2.45は、 setosa,versicolor,virginic aがそれぞれ50,0,0となる。 Pepal.Length>2.45かつ Petal.Width>=1.75は、 setosa,versicolor,virginica がそれぞれ0,1,45となる。 教師あり学習の一つで、目的変数と説明変数を設定する必要がある。 木構造で表現される事から、決定木と呼ばれている。
  6. 6. 決定木の説明は以上です。
  7. 7. 折角なので、もう少し詳しく勉強します。
  8. 8. まずは、描き方を rpart()を利用します。 rpart(目的変数~説明変数) グラフを描く時に、par(xpd=NA)を忘れずに 各ラベルのn数も表示しよう これだけ簡単ならば、目をつぶっても出来る?
  9. 9. どうやって、決定節点を求めるの? ジニ係数を用います。 決定節点 節点tにおける誤り率 誤り率が最小になるように、 決定節点を求める。
  10. 10. 決定木の大きさは? 小さすぎる決定木では、 正しく分類できない。 小さい決定木 決定木が大きすぎると過学習 を起こす。 (訓練データに適応しすぎる)
  11. 11. 剪定しよう 決定木の大きさ (10 交 差 検 証 法 ) セ ッ ト に よ る 誤 り 率 誤りの最小値とその点 の標準偏差を加えた値 決定木の複雑度 棒線を越えない最大の CPが良いとされている。 (1標準偏差ルール) prune.rpart(model, cp=0.5) で剪定できる。
  12. 12. 予測しよう カテゴリデータの予測は、 type=”class”を 忘れずに 真値と予測結果 訓練データと検証データは同一で あるが、そこそこの精度で分類出来 ていることが分かる。
  13. 13. 決定木で回帰分析 ● 決定木の回帰バージョンは、回帰木と呼ばれる。 サンプルデータ: スポーツテストデータ 説明: 中学生104人の運動能力テスト6種と体力測定5種の計測のデータ データ数:104レコード http://mo161.soci.ous.ac.jp/@d/DoDStat/sports/sports_dataJ.xml でデータをダウンロード出来ます。
  14. 14. 50m走のタイムを予測する 分岐後の50m走の タイムの平均 走り幅跳びの成績の良さが50m走のタイム に好影響を与えている。
  15. 15. 枝きりタイム 大きな木を見て、剪定する。
  16. 16. 残差のヒストグラム hist(sports$X50mRun - predict(model, sports)) 真の値と予測結果がどれほどズレているか。
  17. 17. 決定木に親しもう 決定木の使い所は、予測だけじゃない!! ● どの変数に注目すれば良いか? ● 目的変数と関係が深そうな変数は? ● 層別解析のヒントを得る。 予測モデルとしては精度が低い時もあるが、 分析のヒントを得られるかも!
  18. 18. 分析のヒントとは? 疑問:50m走が早い人は、どんな人だろうか? 答え:走り幅跳びが得意な人
  19. 19. 時間に余裕が出来たので、 ● Rでデータを加工する時の方法を紹介します。 ● 独断と偏見のランキング形式で。
  20. 20. 第十位 ● cumsum 累積和を求める cumsum(iris$Sepal.Length)
  21. 21. 第九位 ● colMeans,colSums, rowMeans, rowSums 列毎、行毎に平均や合計を求める > colMeans(iris[,1:4]) Sepal.Length Sepal.Width Petal.Length Petal.Width 5.843333 3.057333 3.758000 1.199333
  22. 22. 第八位 ● reshape データを横に展開する > iris$ID <- 1:150 > reshape(iris[,c(1,5,6)], idvar="ID", timevar="Species", direction="wide") ID Sepal.Length.setosa Sepal.Length.versicolor Sepal.Length.virginica 1 1 5.1 NA NA 2 2 4.9 NA NA 3 3 4.7 NA NA 4 4 4.6 NA NA 5 5 5.0 NA NA 6 6 5.4 NA NA
  23. 23. 第七位 ● aggregate 集計を行う > aggregate(iris[,1:4], by=list(iris$Species), mean) Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width 1 setosa 5.006 3.428 1.462 0.246 2 versicolor 5.936 2.770 4.260 1.326 3 virginica 6.588 2.974 5.552 2.026
  24. 24. 第六位 ● apply 慣れれば便利。for文でも代用可 apply(iris[,1:4], 1, sum) # 行毎に合計を求める apply(iris[,1:4], 2, sum) # 列毎に合計を求める
  25. 25. 第五位 ● ifelse 条件分岐を一行で書く ifelse(条件, 条件が真の時返す値, 偽の時返す値) > ifelse(sports$X50mRun < 8, "1", "0")
  26. 26. 第四位 ● rbind テーブルを縦に結合する > df3 <- data.frame(a=1:3, b=2:4) > df4 <- data.frame(a=4:6, b=5:7) > rbind(df3, df4) ab 112 223 334 445 556 667
  27. 27. 第三位 ● merge テーブルを横に結合する。 > df1 <- data.frame(a=1:5, b=2:6) > df2 <- data.frame(a=c(1,2,4,6), c=c(2,3,4,5)) > merge(df1, df2, by=c("a")) # df1とdf2のaが共通 > merge(df1, df2, all.x=T, by=c("a")) # df1のaを残す abc 1122 2233 3454 > merge(df1, df2, all=T, by=c("a")) # 全てのaを残す a b c 11 2 2 22 3 3 3 3 4 NA 44 5 4 5 5 6 NA 6 6 NA 5 ab c 112 2 223 3 3 3 4 NA 445 4 5 5 6 NA
  28. 28. 第二位 ● table クロス集計を作成する。 > table(iris$Species) setosa versicolor virginica 50 50 50 > table(iris$Species, iris$Petal.Width) 0.1 0.2 0.3 0.4 0.5 0.6 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 setosa 5 29 7 7 1 1 0 0 0 0 0 0 0 0 0 versicolor 0 0 0 0 0 0 7 3 5 13 7 10 3 1 1 virginica 0 0 0 0 0 0 0 0 0 0 1 2 1 1 11 1.9 2 2.1 2.2 2.3 2.4 2.5 setosa 0 0 0 0 0 0 0 versicolor 0 0 0 0 0 0 0 virginica 5 6 6 3 8 3 3
  29. 29. 第一位 ● subset 条件に一致するデータを抽出する # 50m走が8秒未満のレコードを抽出 subset(sports, X50mRun < 8) # setosaもしくはversicolorのレコードを抽出 subset(iris, Species %in% c("setosa", "versicolor"))
  30. 30. ● ● 気分を盛り上げるために、ランキングで紹介しまし たが、深く考えた結果では無いです。 あまり気にしないでください。
  31. 31. 参考 ● R-tips,http://cse.naro.affrc.go.jp/takezawa/r-tips/ r.html ● はじめてのパターン認識,森北出版 ● 入門 自然言語処理,オライリー
  32. 32. ご清聴ありがとう ございました。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×