バイオ・データ・マイニング/Rで決定木を使う
をテンプレートにして作成
開始行:
*はじめに [#l5c5557f]
『Rによるバイオインフォマティクスデータ解析』の7.13節「決...
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
*準備 [#l6dbc2a1]
Rのインストールと基本的な使い方については,次のページを見...
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]
-[[Rの基本>バイオ・データ・マイニング/Rの基本]]
最初は,標準で使用できる''irisデータセット''を使います.
#geshi(rsplus){{
data(iris)
}}
このデータセットは,アヤメの種類(Species)をがく片の長さ...
長さと幅は連続値,種類はsetosa, versicolor, virginicaのい...
このデータセットには,150個のデータが含まれています.
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
iris[sort(sample(1:150,10)),]
}}
#geshi(rsplus){{
Sepal.Length Sepal.Width Petal.Length Petal.Width ...
4 4.6 3.1 1.5 0.2 ...
22 5.1 3.7 1.5 0.4 ...
65 5.6 2.9 3.6 1.3 ver...
97 5.7 2.9 4.2 1.3 ver...
100 5.7 2.8 4.1 1.3 ver...
108 7.3 2.9 6.3 1.8 vi...
116 6.4 3.2 5.3 2.3 vi...
122 5.6 2.8 4.9 2.0 vi...
136 7.7 3.0 6.1 2.3 vi...
146 6.7 3.0 5.2 2.3 vi...
}}
ここでは,''tree''パッケージ((Breiman L., Friedman J. H.,...
''install.packages''コマンドを入力すると,パッケージをダ...
#geshi(rsplus){{
install.packages("tree")
library(tree)
}}
*決定木を学習する [#fdfa0f93]
''決定木学習''は,説明変数に対する条件を用いて事例集合を...
実物を見た方が理解しやすいので早速決定木を学習します.
まず,''tree''コマンドを用いて決定木を学習します.
#geshi(rsplus){{
iris.tree <- tree(Species ~ ., iris)
}}
ここで,第1引数の「Species ~ .」はモデル式,第2引数の「ir...
モデル式は「目的変数 ~ 説明変数」という形で表現し,説明変...
したがって,ここでは,irisデータセットのSpeciesを目的変数...
次に,学習された決定木を表示します.
#geshi(rsplus){{
iris.tree
}}
#geshi(rsplus){{
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.0...
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.0000...
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.0000...
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.0...
24) Sepal.Length < 5.15 5 5.004 versicolor ( 0....
25) Sepal.Length > 5.15 43 0.000 versicolor ( 0...
13) Petal.Length > 4.95 6 7.638 virginica ( 0.000...
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000...
14) Petal.Length < 4.95 6 5.407 virginica ( 0.000...
15) Petal.Length > 4.95 40 0.000 virginica ( 0.00...
}}
テキストでは分かりにくいので,図にします.
#geshi(rsplus){{
plot(iris.tree)
text(iris.tree)
}}
#ref(iris_decision_tree.png,nolink,50%)
一番上が''根''(root)と呼ばれます.
根から''枝''(branch)が下へと伸び,''節''(node)で分岐...
節は''条件''に対応します.
枝の先端が''葉''(leaf)で,葉はカテゴリー(ラベル)に対...
最初に,根の条件「Petal.Lengthの値が2.45より小さいか」に...
Petal.Lengthの値が2.45よりも小さい事例は左に,そうでない...
右に振り分けられた事例は,次に,2番目の条件「Petal.Width...
Petal.Widthの値が1.75よりも小さい事例は左に,そうでない事...
ここで右に振り分けられた事例は,「Petal.Lengthの値が2.45...
このように,決定木は,''論理積''(かつ)で結合した条件を...
先に表示したテキストで見てみましょう.
最初の条件で分割する前の集合は ''1)'' です.
最初のrootのところは条件を表しますが,ここでは条件がない...
150はこの集合に含まれる事例の数,239.600はこの集合に含ま...
そしてsetosaはこの集合に振り分けられた事例に対する予測ラ...
( 0.33333 0.33333 0.33333 )は,setosa, versicolor, virgin...
最初の条件は「Petal.Length < 2.45」です.
この条件に当てはまる事例の集合が ''2)'' で,そうでない事...
このような分割が葉に至るまで続きます.
ここで,図の右下の条件を見ると,「Petal.Length < 4.95」と...
同じように,左下の条件でも左右ともversicolorになっていま...
前者の集合は 7),後者の集合は 12) です.
そこで,この条件を決定木から取り除きます.
これを''枝刈り''といいます.
枝刈りをするには,''snip.tree''関数を使って,nodeオプショ...
#geshi(rsplus){{
iris.tree.snip <- snip.tree(iris.tree, nodes=c(7,12))
plot(iris.tree.snip)
text(iris.tree.snip)
}}
#ref(iris_decision_tree_pruned.png,nolink,50%)
#geshi(rsplus){{
iris.tree.snip
}}
#geshi(rsplus){{
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.0...
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.0000...
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.0000...
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.0...
13) Petal.Length > 4.95 6 7.638 virginica ( 0.000...
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000...
}}
これで完成です.
*テスト・データのカテゴリーを予測する. [#w08f2068]
学習した決定木を使って,カテゴリー(Species)が未知のデー...
まず,''data.frame''関数を用いてデータ・フレームを作成し...
#geshi(rsplus){{
testdata <- data.frame(
Sepal.Length=c(6.2,7.0,5.0),
Sepal.Width=c(3.3,3.3,3.5),
Petal.Length=c(6.0,4.5,1.4),
Petal.Width=c(2.4,1.4,0.3)
)
testdata
}}
#geshi(rsplus){{
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 6.2 3.3 6.0 2.4
2 7.0 3.3 4.5 1.4
3 5.0 3.5 1.4 0.3
}}
次に,''predict''関数を用いてカテゴリーを予測します.
#geshi(rsplus){{
predict(iris.tree, testdata)
}}
#geshi(rsplus){{
setosa versicolor virginica
1 0 0 1
2 0 1 0
3 1 0 0
}}
1番目の事例はvirginicaに,2番目の事例はversicolorに,3番...
また,枝刈りされた決定木を用いて予測すると次のようになり...
#geshi(rsplus){{
predict(iris.tree.snip, testdata)
}}
#geshi(rsplus){{
setosa versicolor virginica
1 0 0.02173913 0.97826087
2 0 0.97916667 0.02083333
3 1 0.00000000 0.00000000
}}
1番目の事例は97.8%の確率でvirginicaに,2.2%の確率でversic...
同様に,2番目の事例は97.9%の確率でversicolorに,2.1%の確...
3番目の事例は枝刈りしなかったときと同様に100%の確率でseto...
*まとめ [#hc64abbf]
決定木は,目的変数が離散値(カテゴリー値)のときに用いら...
決定木のrootからそれぞれの葉(ラベル)に到達するまでの条...
「学習されたルールがとてもわかりやすい」という点が特徴で...
*参考文献 [#p06ba47a]
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
終了行:
*はじめに [#l5c5557f]
『Rによるバイオインフォマティクスデータ解析』の7.13節「決...
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
*準備 [#l6dbc2a1]
Rのインストールと基本的な使い方については,次のページを見...
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]
-[[Rの基本>バイオ・データ・マイニング/Rの基本]]
最初は,標準で使用できる''irisデータセット''を使います.
#geshi(rsplus){{
data(iris)
}}
このデータセットは,アヤメの種類(Species)をがく片の長さ...
長さと幅は連続値,種類はsetosa, versicolor, virginicaのい...
このデータセットには,150個のデータが含まれています.
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
iris[sort(sample(1:150,10)),]
}}
#geshi(rsplus){{
Sepal.Length Sepal.Width Petal.Length Petal.Width ...
4 4.6 3.1 1.5 0.2 ...
22 5.1 3.7 1.5 0.4 ...
65 5.6 2.9 3.6 1.3 ver...
97 5.7 2.9 4.2 1.3 ver...
100 5.7 2.8 4.1 1.3 ver...
108 7.3 2.9 6.3 1.8 vi...
116 6.4 3.2 5.3 2.3 vi...
122 5.6 2.8 4.9 2.0 vi...
136 7.7 3.0 6.1 2.3 vi...
146 6.7 3.0 5.2 2.3 vi...
}}
ここでは,''tree''パッケージ((Breiman L., Friedman J. H.,...
''install.packages''コマンドを入力すると,パッケージをダ...
#geshi(rsplus){{
install.packages("tree")
library(tree)
}}
*決定木を学習する [#fdfa0f93]
''決定木学習''は,説明変数に対する条件を用いて事例集合を...
実物を見た方が理解しやすいので早速決定木を学習します.
まず,''tree''コマンドを用いて決定木を学習します.
#geshi(rsplus){{
iris.tree <- tree(Species ~ ., iris)
}}
ここで,第1引数の「Species ~ .」はモデル式,第2引数の「ir...
モデル式は「目的変数 ~ 説明変数」という形で表現し,説明変...
したがって,ここでは,irisデータセットのSpeciesを目的変数...
次に,学習された決定木を表示します.
#geshi(rsplus){{
iris.tree
}}
#geshi(rsplus){{
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.0...
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.0000...
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.0000...
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.0...
24) Sepal.Length < 5.15 5 5.004 versicolor ( 0....
25) Sepal.Length > 5.15 43 0.000 versicolor ( 0...
13) Petal.Length > 4.95 6 7.638 virginica ( 0.000...
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000...
14) Petal.Length < 4.95 6 5.407 virginica ( 0.000...
15) Petal.Length > 4.95 40 0.000 virginica ( 0.00...
}}
テキストでは分かりにくいので,図にします.
#geshi(rsplus){{
plot(iris.tree)
text(iris.tree)
}}
#ref(iris_decision_tree.png,nolink,50%)
一番上が''根''(root)と呼ばれます.
根から''枝''(branch)が下へと伸び,''節''(node)で分岐...
節は''条件''に対応します.
枝の先端が''葉''(leaf)で,葉はカテゴリー(ラベル)に対...
最初に,根の条件「Petal.Lengthの値が2.45より小さいか」に...
Petal.Lengthの値が2.45よりも小さい事例は左に,そうでない...
右に振り分けられた事例は,次に,2番目の条件「Petal.Width...
Petal.Widthの値が1.75よりも小さい事例は左に,そうでない事...
ここで右に振り分けられた事例は,「Petal.Lengthの値が2.45...
このように,決定木は,''論理積''(かつ)で結合した条件を...
先に表示したテキストで見てみましょう.
最初の条件で分割する前の集合は ''1)'' です.
最初のrootのところは条件を表しますが,ここでは条件がない...
150はこの集合に含まれる事例の数,239.600はこの集合に含ま...
そしてsetosaはこの集合に振り分けられた事例に対する予測ラ...
( 0.33333 0.33333 0.33333 )は,setosa, versicolor, virgin...
最初の条件は「Petal.Length < 2.45」です.
この条件に当てはまる事例の集合が ''2)'' で,そうでない事...
このような分割が葉に至るまで続きます.
ここで,図の右下の条件を見ると,「Petal.Length < 4.95」と...
同じように,左下の条件でも左右ともversicolorになっていま...
前者の集合は 7),後者の集合は 12) です.
そこで,この条件を決定木から取り除きます.
これを''枝刈り''といいます.
枝刈りをするには,''snip.tree''関数を使って,nodeオプショ...
#geshi(rsplus){{
iris.tree.snip <- snip.tree(iris.tree, nodes=c(7,12))
plot(iris.tree.snip)
text(iris.tree.snip)
}}
#ref(iris_decision_tree_pruned.png,nolink,50%)
#geshi(rsplus){{
iris.tree.snip
}}
#geshi(rsplus){{
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.0...
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.0000...
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.0000...
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.0...
13) Petal.Length > 4.95 6 7.638 virginica ( 0.000...
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000...
}}
これで完成です.
*テスト・データのカテゴリーを予測する. [#w08f2068]
学習した決定木を使って,カテゴリー(Species)が未知のデー...
まず,''data.frame''関数を用いてデータ・フレームを作成し...
#geshi(rsplus){{
testdata <- data.frame(
Sepal.Length=c(6.2,7.0,5.0),
Sepal.Width=c(3.3,3.3,3.5),
Petal.Length=c(6.0,4.5,1.4),
Petal.Width=c(2.4,1.4,0.3)
)
testdata
}}
#geshi(rsplus){{
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 6.2 3.3 6.0 2.4
2 7.0 3.3 4.5 1.4
3 5.0 3.5 1.4 0.3
}}
次に,''predict''関数を用いてカテゴリーを予測します.
#geshi(rsplus){{
predict(iris.tree, testdata)
}}
#geshi(rsplus){{
setosa versicolor virginica
1 0 0 1
2 0 1 0
3 1 0 0
}}
1番目の事例はvirginicaに,2番目の事例はversicolorに,3番...
また,枝刈りされた決定木を用いて予測すると次のようになり...
#geshi(rsplus){{
predict(iris.tree.snip, testdata)
}}
#geshi(rsplus){{
setosa versicolor virginica
1 0 0.02173913 0.97826087
2 0 0.97916667 0.02083333
3 1 0.00000000 0.00000000
}}
1番目の事例は97.8%の確率でvirginicaに,2.2%の確率でversic...
同様に,2番目の事例は97.9%の確率でversicolorに,2.1%の確...
3番目の事例は枝刈りしなかったときと同様に100%の確率でseto...
*まとめ [#hc64abbf]
決定木は,目的変数が離散値(カテゴリー値)のときに用いら...
決定木のrootからそれぞれの葉(ラベル)に到達するまでの条...
「学習されたルールがとてもわかりやすい」という点が特徴で...
*参考文献 [#p06ba47a]
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
ページ名: