=== 今回のお題 ===
* [[dmb:2011:q2|前回の課題で行った3種類の学習機械(線形,加法,ロジスティック加法)の比較]]に,決定木も加えて,比較し直す.(レポートは[[dmb:2011:q2|前回の課題]]と同じ部分は,前回の内容をそのまま用いてよい)
* レポートの送付先 mailto:data.mining.finale@gmail.com
* レポートファイルの名前の先頭に,半角で学籍番号を付けること.例:0000000_データマイニング_2.doc
* 期限は1月16日(月)の1限
=== 前提 ===
今回の演習を行うパソコンでは,前回の演習が実行済みであることを前提とする.
前回とは別のパソコンで行う場合には,[[https://appl.stat.inf.uec.ac.jp/doku.php?id=r:how_to:internet_proxy|Rのプロクシの設定]]や[[http://stat.inf.uec.ac.jp/dokuwiki/doku.php?id=dmb:2011:q2|データの読み込みなど]]を実行しておくこと.
=== Rの準備 ===
今回はrpartパッケージを使うので,以下の1行を実行して,インストールしておく.
これは,1台のパソコンでは1度だけ実行すれば良い.
install.packages(c("tree", "rpart"), dependencies=TRUE)
rpartパッケージの読み込みは,Rを起動する度に毎回,実行する必要がある.
library(rpart)
=== データの準備 ===
tic.sub中の変数V86を,0と1の2値から,「契約あり(contract)」と「契約なし(no contract)」という文字列に変換しておく.
tic.sub.2 <- tic.sub
tic.sub.2$V86 <- as.character(tic.sub$V86)
tic.sub.2$V86[tic.sub$V86==0] <- "no contract"
tic.sub.2$V86[tic.sub$V86==1] <- "contract"
tic.sub.2$V86 <- as.factor(tic.sub.2$V86)
=== 決定木分析 ===
決定木分析の実施にはrpart()という関数を用いる.
tic.rpart <- rpart(V86~.,
data=tic.sub.2)
結果を表示すると,
tic.rpart
次のように,何も分割されないはずである.
n= 5822
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 5822 348 no contract (0.05977327 0.94022673) *
このデータは,
table(tic.sub.2$V86)
により"contract"と"no contract"を数えさせると,
contract no contract
348 5474
と,契約数が6%弱である.そのため,デフォルトの決定木分析の設定では,これ以上は分割しない.
そこで,rpartの制御変数を,幾つか変更して,更に分割させることを試みる.
tic.rpart <- rpart(V86~.,
data=tic.sub.2,
control=c(cp=0.002))
summary(tic.rpart)
par(cex=0.8)
plot(tic.rpart, uniform=T, branch=0.6, margin=0.05)
text(tic.rpart, all=T, use.n=T)
par(cex=1.0)
これは,cpという複雑さを指定する制御変数をデフォルトの0.05から,0.002まで小さくしてみた場合である.
{{ :dmb:2011:tic-rpart-0.002.jpg?400 |}}
この描き方では,ノードには囲みはないが,分割点に左右の条件が示され,分割の下には契約あり(contract)と契約なし(no contract)のヒストグラムと,
数字(contract/no contract)が記されている.それぞれのノードの「契約成功率」もしくは「契約成功のオッズ」は,各自で検討すること.
途中の行のcex=0.8は,プロットの中の文字の大きさを変更している.
cex=1.0がデフォルトで,0.8は少し小さめ,という指定になる.
グラフを作成し終えたら,1.0に戻しておく.
分割を決める制御変数には
^rpart.controlの引数^意味^デフォルト値^
|minsplit|ノードの分割を試みる最小のレコード数|20|
|minbucket|終端ノードのレコード数の最小値|round(minsplit/3)|
|cp|決定木の複雑さを調整するパラメータ|0.05|
|maxdepth|決定木の最大の深さ|30|
などがある.他にも,
^rpart.controlの引数^意味^デフォルト値^
|maxcompete|the number of competitor splits retained in the output|4|
|maxsurrogate|the number of surrogate splits retained in the output|5|
|usesurrrogate|how to use surrogates in the splitting process|2|
|xval|number of cross-validations|10|
|surrogatestyle|controls the selection of a best surrogate|0|
などがあるが,このデータの分析では使わない.
さて複雑度を0.001に小さくすると,より複雑な木が得られる.
ノード数が増えるので,字が小さくなる.
tic.rpart <- rpart(V86~.,
data=tic.sub.2,
control=c(minsplit=5,
cp=0.001))
summary(tic.rpart)
par(cex=0.5)
plot(tic.rpart, uniform=T, branch=0.6, margin=0.05)
text(tic.rpart, all=T, use.n=T)
par(cex=1.0)
など.