サマリ
- sklearn.tree.DecisionTreeClassifierは最初に木を成長させてから、枝刈りをするという手順で決定木を作成する。
- 木を成長させるときは、不純度が小さくなるような頂点を新たに生成することによって行う。
- 枝刈りは、「最弱リンク枝刈り」という手法を用いて行う。sklearn.tree.DecisionTreeClassifierの
ccp_alpha
はこの手法に関連したパラメータである。ccp_alpha
の値が小さい場合、出力される決定木は大きくなり、ccp_alpha
の値が大きい場合、出力される決定木は小さくなる。
sklearn.tree.DecisionTreeClassifierの説明
sklearn.tree.DecisionTreeClassifierについて説明されている記事は世の中に多くあるので、ここでは割愛します。公式サイトは下記です。
木を成長させる方法
木を成長させる方法については、下記のQiitaの記事がわかりやすかったです。
ポイントとしては、木を成長させる際に、不純度が小さくなるように頂点を分割することです。Qiitaの記事よりも厳密に数式で表現すると下記のようになります。
- 変数の設定
- サンプルに対する添え字:
- 特徴量に対する添え字:
- 特徴量:
- 目的変数:
- 分割後の頂点の左側の領域:
- 分割後の頂点の右側の領域:
- 分割後の頂点の左側の領域に含まれるサンプルの個数:
- 分割後の頂点の右側の領域に含まれるサンプルの個数:
- 分割後の頂点の左側の領域に含まれる観測値の割合:
- 分割後の頂点の右側の領域に含まれる観測値の割合:
以上のような設定で、下記の式を最小化するように頂点を分割します。
上記の式に出てくるは不純度と呼ばれる式で、誤分類率、ジニ指数、交差エントロピーなどが使われます。それぞれ下記の式です。
DecisionTreeClassifierにおいては、引数criterion
によって任意の不純度を設定することができます。
最弱リンク枝刈り
理論
上述した方法で木を成長させたあとに、木の枝刈りを行います。これは、過学習を防ぐために行う作業です。DecisionTreeClassifierにおいては、「最弱リンク枝刈り」という手法を用いて枝刈りを行います。
「最弱リンク枝刈り」とは、下記の式を最大にするように枝を刈る手法です。
ただし、は木の終端頂点の個数です。上記の式のは、DecisionTreeClassifierにおいては、引数ccp_alpha
によって設定できます。 が0に近いと終端頂点の個数が大きい木(深い木)が選択され、大きい値だと終端頂点の個数が小さい木(浅い木)が選ばれます。
の値を変えて、木の深さを確認
- 使用データ: https://github.com/oreilly-japan/ml-security-jp/raw/master/ch02/dataset.csv。(「セキュリティエンジニアのための機械学習」という本で紹介されているフィッシングサイトに関するデータです。)
- ccp_alphaの値:0~0.1まで0.001の幅で刻んだ100個の値。
スクリプトは下記の通りです。
スクリプト中の「ccp_alphaと木の深さの関係を図示」を見ると、ccp_alphaが大きくなると浅い木が出力されていることが分かります。