=== 今回のお題 === * [[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) など.