<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>決定木 on Marketechlabo</title><link>https://www.marketechlabo.com/tags/decision-tree/</link><description>Recent content in 決定木 on Marketechlabo</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Mon, 05 Jun 2017 00:00:00 +0900</lastBuildDate><atom:link href="https://www.marketechlabo.com/tags/decision-tree/index.xml" rel="self" type="application/rss+xml"/><item><title>Rで決定木分析（rpartによるCARTとrangerによるランダムフォレスト）</title><link>https://www.marketechlabo.com/machine-learning/r-decision-tree/</link><pubDate>Mon, 05 Jun 2017 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/machine-learning/r-decision-tree/</guid><description>
&lt;h2 id="準備"&gt;準備&lt;/h2&gt;
&lt;p&gt;決定木（decision tree）分析をする際、まず目的変数の種類とアルゴリズムを決定する。&lt;/p&gt;
&lt;h3 id="アルゴリズム"&gt;アルゴリズム&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CART&lt;/li&gt;
&lt;li&gt;CHAID&lt;/li&gt;
&lt;li&gt;ID3 / C4.5 / C5.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="目的変数の型"&gt;目的変数の型&lt;/h3&gt;
&lt;p&gt;目的変数の型によって扱いが変わる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;質的変数（2値変数）：分類木→目的変数が0/1, T/Fの場合は&lt;code&gt;as.factor()&lt;/code&gt;でfactor型にデータ変換しておく&lt;/li&gt;
&lt;li&gt;量的変数：回帰木&lt;/li&gt;
&lt;li&gt;survivalオブジェクト&lt;/li&gt;
&lt;li&gt;（生起を表す2カラム）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CARTはすべて対応、C4.5/C5.0は質的変数のみ
ここではCARTアルゴリズムでツリーモデルを生成する&lt;code&gt;rpart&lt;/code&gt;と、ランダムフォレスト&lt;code&gt;ranger&lt;/code&gt;を中心に説明する。&lt;/p&gt;
&lt;h2 id="データセットと前処理"&gt;データセットと前処理&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.kaggle.com/datasets/uciml/default-of-credit-card-clients-dataset"&gt;Default of Credit Card Clients Dataset&lt;/a&gt;
データセットの主な留意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;30000行25変数&lt;/li&gt;
&lt;li&gt;最初の列が識別子（&lt;code&gt;ID&lt;/code&gt;）→除外&lt;/li&gt;
&lt;li&gt;3列目&lt;code&gt;SEX&lt;/code&gt;, 4列目&lt;code&gt;EDUCATION&lt;/code&gt;, 5列目&lt;code&gt;MARRIAGE&lt;/code&gt;がカテゴリ変数→factorに変換&lt;/li&gt;
&lt;li&gt;最終列&lt;code&gt;default.payment.next.month&lt;/code&gt;が目的変数で0/1の値をとる。&lt;/li&gt;
&lt;li&gt;それ以外は数値型変数なので型変換の必要なし&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上の処理をしたデータのうち80%を学習データ、20%をテストデータとして分割する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(data.table)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fread&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;UCI_Credit_Card.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,ID&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,SEX&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.factor&lt;/span&gt;(SEX)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,EDUCATION&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.factor&lt;/span&gt;(EDUCATION)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,MARRIAGE&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.factor&lt;/span&gt;(MARRIAGE)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nr &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(data.dt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sample&lt;/span&gt;(nr, nr&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; data.dt[train] &lt;span style="color:#75715e"&gt;# 学習データ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; data.dt[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;train] &lt;span style="color:#75715e"&gt;# 検証データ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1回限りの決定木"&gt;1回限りの決定木&lt;/h2&gt;
&lt;h3 id="実行"&gt;実行&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(rpart)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train.dt &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default.payment.next.month &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.factor&lt;/span&gt;(default.payment.next.month &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;rpart&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; formula &lt;span style="color:#f92672"&gt;=&lt;/span&gt; default.payment.next.month &lt;span style="color:#f92672"&gt;~&lt;/span&gt; .,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parms &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(split&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;information&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; control &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rpart.control&lt;/span&gt;(minsplit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, cp&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.001&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; rpart_model
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;dplyrのパイプ内でdata.tableを渡す場合、&lt;code&gt;mutate&lt;/code&gt;の結果はtibble/data.frameになる。&lt;code&gt;rpart&lt;/code&gt;はdata.frameをそのまま受け付ける&lt;/li&gt;
&lt;li&gt;投入するデータテーブルの変数を絞っておくと変数指定が楽&lt;/li&gt;
&lt;li&gt;プロットしたときのラベルをわかりやすく変換しておくといい&lt;/li&gt;
&lt;li&gt;分類木の場合は目的変数をfactor型に変換しておく&lt;/li&gt;
&lt;li&gt;重要なパラメータ
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;method&lt;/code&gt;（通常は目的変数の型によって自動で最適なものが選択される）
&lt;ul&gt;
&lt;li&gt;&amp;lsquo;class&amp;rsquo;で分類木（目的変数がfactor型）&lt;/li&gt;
&lt;li&gt;&amp;lsquo;poisson&amp;rsquo;で生起（目的変数が2カラムの生起データ）&lt;/li&gt;
&lt;li&gt;&amp;rsquo;exp&amp;rsquo;で生存（目的変数がsurvivalオブジェクト）&lt;/li&gt;
&lt;li&gt;&amp;lsquo;anova&amp;rsquo;で回帰木（目的変数が上記のいずれでもない）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parms&lt;/code&gt;: &lt;code&gt;method = 'class'&lt;/code&gt;の場合、以下の指標に基づいて分割。&lt;code&gt;method = 'anova'&lt;/code&gt;の場合は指定しない
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;parms = list(split='gini')&lt;/code&gt;でジニ係数を使う（デフォルト）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parms = list(split='information')&lt;/code&gt;でエントロピーを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpart.control&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;minsplit&lt;/code&gt;は1ノードのサイズの下限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp&lt;/code&gt;は小さいほど細かく分岐する。あとで粗くできるので最初は細かく分けておくといい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="見る"&gt;見る&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;summary&lt;/span&gt;(rpart_model)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力&lt;/p&gt;</description></item></channel></rss>