scikit-learnで機械学習:決定木(1)

犯罪予測における時空間分析の研究にずいぶん時間を使っていてブログが放置状態でしたが、久々の更新。
だいぶ遠のいていた機械学習の進めます。

Scikit-learnで決定木やってみます。
参考にしたのは、scikit-learnの本家、Decision Treeの項目。

アルゴリズムの理解にはじパタ(p.176-183)を補助で活用。

はじめてのパターン認識

はじめてのパターン認識


ざっと眺めたところどうやってノードを分割するかと、どうやって木の大きさを決めるのかが分析において意味を持ちそうなので、
理論を追いかけながら、手を動かしてみます。

ノードの分割方法

ノード分割の基準になるのは不純度(impurity)と呼ばれる評価関数。
この関数は

\displaystyle
  I (t)= \phi(P(C_1|t),,,P(C_k|t))

を定義し、関数\phi(z_1,z_2,,,,z_K)\sum_{i=0}^n z_iに対して、
(1)\phi()は、すべてのi=1,...,Kにたいして、z_i = 1/Kのとき、すなわちどのクラスの事後分布も一様に等しいとき最大になる。
 ⇛どこで分割しても一緒やんってときが最大値。
(2)\phi()はあるiについてz_i=1となり、jiのとき、すべてz_j=0、すなわちただ一つのクラスに定まる時最小になる。
 ⇛ここで分割すれば良いよねということを最小値で示す
(3)\phi()は、(z_1,z_2,,,,z_K)について対象な関数である。
を満たせば何でも良いとのこと。

scikit-learnではGini impurity と information gainが選べる。
Information gainの方は具体的にどの関数を具体的につかってるかイマイチよくわかんなかったので、
とりあえず、デフォルトで使われてるジニ係数の方で進めてみることにします。

ジニ係数

はじパタ p.182より、

\displaystyle
  I (t)= \sum_{i=1}^K P(C_i|t)lnP(C_i|t))

\sum_{i=1}^K P(C_i|t)lnP(C_i|t)はノードtにおける誤り率。
この誤り率が一番下がる分割を選びたい。
従って、p_L=データがLに分類される確立、p_R=がRに分類される確率とすると、分割がsとしたとき、

\displaystyle
  \Delta I (s, t)= I(t) - (p_LI (t_L)+p_RI (t_R))

が最大になるsを求めることになる。

木の大きさを決める

木をどこまで成長させるかには、色々な方法論があるっぽいです。

scikit-learnにおいては、主に下記のパラメータによって制御する。
max_depth : 木の大きさ(深さ)の上限
min_split : ノードにおけるデータ数の下限

またはじパタの中では誤り率と木の複雑さから構成されるコストという概念が紹介され、
誤り率をR(T)終端ノード数を|T|とすると、

\displaystyle
 R_\alpha (T)=  \sum R (T) + \alpha|T|

という関数でコストが定義されています。
で、この関数は\alphaが正則化パラメータの役割を果たしていて、誤り率と木の複雑さのどちらに重きをおくかを制御できると。

直感的であることが売りの決定木であれば、深さとデータ数で剪定するので良いのかもですね。

次回、実際にデータを用いてscikit-learnを走らせてみます。