*はじめに [#l5c5557f]

『Rによるバイオインフォマティクスデータ解析』の7.13節「決定木」を参考にして,決定木を学習します.

#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
}}


*準備 [#l6dbc2a1]


Rのインストールと基本的な使い方については,次のページを見てください.
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]
-[[Rの基本>バイオ・データ・マイニング/Rの基本]]


最初は,標準で使用できる''irisデータセット''を使います.
#geshi(rsplus){{
> data(iris)
}}

このデータセットは,アヤメの種類(Species)を花びらの長さ(Sepal.Length),幅(Lepal.Width),がくの長さ(Petal.Length),幅(Petal.Width)によって分類する問題です.
長さと幅は連続値,種類はsetosa, versicolor, virginicaのいずれかをとる離散値です.

このデータセットには,150個のデータが含まれています.
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
> iris[sort(sample(1:150,10)),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
4            4.6         3.1          1.5         0.2     setosa
22           5.1         3.7          1.5         0.4     setosa
65           5.6         2.9          3.6         1.3 versicolor
97           5.7         2.9          4.2         1.3 versicolor
100          5.7         2.8          4.1         1.3 versicolor
108          7.3         2.9          6.3         1.8  virginica
116          6.4         3.2          5.3         2.3  virginica
122          5.6         2.8          4.9         2.0  virginica
136          7.7         3.0          6.1         2.3  virginica
146          6.7         3.0          5.2         2.3  virginica
}}

ここでは,''tree''パッケージ((Breiman L., Friedman J. H., Olshen R. A., and Stone, C. J. (1984) Classification and Regression Trees. Wadsworth.))((Ripley, B. D. (1996) Pattern Recognition and Neural Networks. Cambridge University Press, Cambridge. Chapter 7.))を使います.
''install.packages''コマンドを入力すると,パッケージをダウンロードするサーバーを聞かれますので,リストからJapanを選択します.
#geshi(rsplus){{
> install.packages("tree")
> library(tree)
}}



*決定木を学習する [#fdfa0f93]

''決定木学習''は,説明変数に対する条件を用いて事例集合を分割することによってラベル(カテゴリー)を予測するための''決定木''を学習するものです.
実物を見た方が理解しやすいので早速決定木を学習します.

まず,''tree''コマンドを用いて決定木を学習します.
#geshi(rsplus){{
> iris.tree <- tree(Species ~ ., iris)
}}
ここで,第1引数の「Species ~ .」はモデル式,第2引数の「iris」は訓練データを表しています.
モデル式は「目的変数 ~ 説明変数」という形で表現し,説明変数が「.」(ドット)のときは,目的変数以外の全ての変数を表します.
したがって,ここでは,irisデータセットのSpeciesを目的変数とし,それ以外のすべての変数(Spepal.Lenght, Sepal.Width, Petal.Length, Petal.Width)を説明変数としています.

次に,学習された決定木を表示します.
#geshi(rsplus){{
> iris.tree
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.00000 0.00000 ) *
   3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )  
     6) Petal.Width < 1.75 54  33.320 versicolor ( 0.00000 0.90741 0.09259 )  
      12) Petal.Length < 4.95 48   9.721 versicolor ( 0.00000 0.97917 0.02083 )  
        24) Sepal.Length < 5.15 5   5.004 versicolor ( 0.00000 0.80000 0.20000 ) *
        25) Sepal.Length > 5.15 43   0.000 versicolor ( 0.00000 1.00000 0.00000 ) *
      13) Petal.Length > 4.95 6   7.638 virginica ( 0.00000 0.33333 0.66667 ) *
     7) Petal.Width > 1.75 46   9.635 virginica ( 0.00000 0.02174 0.97826 )  
      14) Petal.Length < 4.95 6   5.407 virginica ( 0.00000 0.16667 0.83333 ) *
      15) Petal.Length > 4.95 40   0.000 virginica ( 0.00000 0.00000 1.00000 ) *
}}

テキストでは分かりにくいので,図にします.
#geshi(rsplus){{
> plot(iris.tree)
> text(iris.tree)
}}
#ref(iris_decision_tree.png,nolink,50%)

この図は上から順に読みます.
最初にPetal.Lengthの値が2.45より小さいか大きいかによって事例を分けます.
Petal.Lengthの値が2.45よりも小さい事例は左に,そうでない事例は右に振り分けます.

先に表示したテキストと対応させます.

最初の条件で分割する前の集合は ''1)'' です.
最初のrootのところは条件を表しますが,ここでは条件がないのでrootと書かれています.
150はこの集合に含まれる事例の数,239.600はこの集合に含まれる事例のバラツキの度合いです.
そしてsetosaはこの集合に振り分けられた事例に対する予測ラベルです.
( 0.33333 0.33333 0.33333 )は,setosa, versicolor, virginicaの出現確率を表しています.

最初の条件は「Petal.Length < 2.45」です.
この条件に当てはまる事例の集合が ''2)'' で,そうでない事例の集合が ''3)'' です.

このような分割が続きます.

ここで,図の右下の条件を見ると,「Petal.Length < 4.95」という条件で分割していますが,どちらに振り分けられてもvirginicaと予測されています.
同じように,左下の条件でも左右ともversicolorになっています.
前者の集合は 7),後者の集合は 12) です.

そこで,この条件を決定木から取り除きます.
これを''枝刈り''といいます.
枝刈りをするには,''snip.tree''関数を使って,nodeオプションに枝刈りする(条件分岐を止める)節番号のベクトルを指定します.
#geshi(rsplus){{
> iris.tree <- snip.tree(iris.tree, nodes=c(7,12))
> plot(iris.tree)
> text(iris.tree)
}}
#ref(iris_decision_tree_pruned.png,nolink,50%)
#geshi(rsplus){{
> iris.tree
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.00000 0.00000 ) *
   3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )  
     6) Petal.Width < 1.75 54  33.320 versicolor ( 0.00000 0.90741 0.09259 )  
      12) Petal.Length < 4.95 48   9.721 versicolor ( 0.00000 0.97917 0.02083 ) *
      13) Petal.Length > 4.95 6   7.638 virginica ( 0.00000 0.33333 0.66667 ) *
     7) Petal.Width > 1.75 46   9.635 virginica ( 0.00000 0.02174 0.97826 ) *
}}

これで完成です.


*テスト・データのカテゴリーを予測する. [#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
  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)
  setosa versicolor virginica
1      0          0         1
2      0          1         0
3      1          0         0
}}

1番目の事例はvirginicaに,2番目の事例はversicolorに,3番目の事例はsetosaと予測されました.


*まとめ [#hc64abbf]

ここではtreeパッケージを用いた決定木学習を行いました.

決定木学習はやはりQuinlanのC4.5アルゴリズムが基本なので,C4.5アルゴリズムを実装したパッケージがあれば是非そちらも試してみたいです.


*参考文献 [#p06ba47a]
#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
}}
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS