未経験からデータサイエンティスト

未経験からデータサイエンティストの勉強したことの備忘録とか雑記とか

決定木でのモデル作成の仕組み

引き続き下記書籍でPythonでのデータ分析についてを勉強しているsue124です。
今回は第5章で使った決定木でのモデル作成についてです。
サンプルコードをそのまま写せばサンプルデータの決定木モデルを作ることができましたが、その仕組みの解説はなかったため自分で調べました。せっかくなので、それをブログに書いていきたいと思います。

まず決定木とはどんなものかというと、、

・教師ありの機械学習
・作成したモデルを下図のように表すことができ、視覚的に理解しやすい
・数値データ、カテゴリーデータが混在していてもOK
・オーバーフィッティングしてしまいやすい(枝分かれの深さを適切に設定する必要がある)

上記のような特徴がある決定木に関して、その仕組みを自分なりに調べた結果が下記です。
もし誤りがあれば、ご指摘いただけると幸いです。


今回は「どういう条件でピクニックに出かけるか?」という問題を例に考えます。
そのためには下図のような「どの程度2つの状態が混ざっているか?」を定量的に評価する必要があります。

f:id:sue124:20200312000654p:plain

扱っているデータが2つのクラスに分離できて、各クラスのデータ数がそれぞれm個、n個である場合、平均情報量(エントロピー)を以下のように表すことができます。

 I(\frac{m}{m+n}, \frac{n}{m+n}) = \frac{m}{m+n}\log_{2}\frac{m+n}{m} +  \frac{n}{m+n}\log_{2}\frac{m+n}{n}

m=1, n=0 のとき  I(0, 0) = 0
m=n のとき     I(\frac{1}{2}, \frac{1}{2}) = 1

エントロピーが下がるほど、分離が進んでいるということができます。
上式の対数の底は何でも良いのですが、クラス数に合わせると上記のように完全に分離できている時に0、全く分離できていない時に1となるので、わかりやすくなります。

なお、クラスが3つ以上(N個)のときは以下のようになります。

 I(P_{1}, P_{2}, ..., P_{N}) = \sum_{i=0}^N P_i \log_{N}\frac{1}{P_i} = -\sum_{i=0}^N P_i \log_{N}P_i
 P_{i} はクラスi のデータの割合。

これによって、最初に挙げた「どういう条件でピクニックに出かけるか?」に関して初期状態が以下のような状態であったとすると、

 全データ数:5個
 Yes:2個
 No:3個

この時のエントロピーは以下のようになります。
 I(\frac{2}{5}, \frac{3}{5}) = \frac{2}{5}\log_{2}\frac{5}{2} +  \frac{3}{5}\log_{2}\frac{5}{3} = 0.972

これを「天気(晴れ、曇り、雨)」で分類して下図のような状態になったとします。

f:id:sue124:20200312083755p:plain

この時のエントロピーは以下のようになります。
全体のエントロピー  = 1 × \frac{2}{5} + 1 × \frac{2}{5} + 0 × \frac{1}{5} = 0.8

天気で分けることによって、エントロピーが下がっているので、分離が進んでいると判断できます。
「晴れ」と「曇り」がまだ Yes と No が混ざっている状態なので、この後さらに別の指標(例えば気温、風速など)で分類していくことになります。


まとめ
決定木では平均情報量(エントロピーで分離度合いを評価し、平均情報量(エントロピー)が下がるように分離を進める。


###2020/06/07 追記###
書籍の中で使用している「sklearn.tree.DecisionTreeClassifier」のモジュールではCARTというアルゴリズムでジニ不純度を指標にして決定木を構築していることがわかったので、エントロピーとジニ不純度の違いをまとめてみました。
sue124.hatenablog.com