pythonではじめる機械学習の勉強 2.3.5 決定木について

2.3.5
決定木とは分類、回帰に使われる。Yes/Noで答えれる質問で答えを出す。例えば熊、鷹、ペンギン、イルカを最小の質問でわけたい。
これはmglearn.plots.plot_animal_tree()で確認できる。機械学習的に言うと熊、鷹、ペンギン、イルカを3つの特徴量(つまり質問)で区別する。

2.3.5.1
では次のようなデータで決定木を見てみる。このデータは連続値なのでYes、Noでなく特徴量iは値aより大きいかなどの質問になる。これはmglearn.plots.plot_tree_progressive()で確かめれる。またこのコードは本にはなかったのでhttps://github.com/amueller/introduction_to_ml_with_python/blob/master/02-supervised-learning.ipynbgithubを参照。

このデータはtwo_moonsという。上のプログラム(mglearn.plots.plot_tree_progressive())による図で2つ目のもの(本のp72図2-24)をまず見てみる。これはX[1]=0.0596(特徴量1について)で水平に線を引くことで最もクラス0と1をわけることができる。次に右側にある木を見てみるがここで木の頂点をノードという。X[1]=0.0596が真のとき左のノード(クラス0が2個、クラス1が32個)に偽のとき右のノード(クラス0が48個、クラス1が18個)になる。これらのノードが図の上、下の領域に対応する。

次にもっと細かくわけるために特徴量0についてわける。3つ目の図(本のp72、図2-25)を見てみる。前とくらべてX[0]=-0.418とX[0]=1.196の条件分岐をさらに加えた。結果は木の一番左のノードが図の左下に対応して、左から2番目が図の右下に対応する。右から2番目のノードが図の左上に対応して、一番右のノードが図の右上に対応する。
これは決定木の葉(終端のノード)に1つのクラスしか入らないところまで続く。この葉(終端のノード)を純粋(pure)という。

2.3.5.2
葉が純粋になるまで分け続けるとモデルが複雑になり、過剰適合してしまう。過剰適合を防ぐには構築段階で木の生成を止める事前枝刈り(prepruning)と出来上がったあとに情報の少ないノードを削除する事後枝刈り(post-pruning)がある。事前枝刈りは木の深さを制限する、葉の最大数を制限するなどがある。scikit-learnでは決定木において事前枝刈りしかなくこれをcancerデータセットで見てみる。

In[56]では訓練データに対しては100%になって過剰適合している。これを防ぐために深さに対してmax_depth=4で制限をかけると(In[57])テストデータに対しての精度が上がる。

次にexport_graphviz関数で.dotファイルを作りgraphvizモジュール(.dotファイルを読み込む)で可視化する。
In[58],In[59]のプログラムを動かすとsampleはそのノードにあるサンプルの数、valueはクラスごとのサンプルの数、worst radius<=16.795では良性8個と悪性134個があり悪性の132個つまりほとんどが一番右のノードにいく。一方でworst radius>16.795では良性259個と悪性25個があり良性の235個つまりほとんどが左から2番目のノードにいき他のノードの情報は少ないということが可視化できる。