Pythonではじめる機械学習2(2.3.5~)メモ

引き続き「Pythonではじめる機械学習」を読み進めていく。

決定木

概要

決定木の構築過程では、特徴量iは値αよりも大きいか?小さいか?などというテストを繰り返し行う。このテストのうち、最も情報量の多いテスト(分け方)を選びながら後続のテストを進めていく。枝葉が1つのクラスか回帰値のみになること純粋(pure)といい、そこまでテストを繰り返す。

f:id:futurasan:20200728234133p:plain
tree
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import export_graphviz

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)
tree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train, y_train)

export_graphviz(tree, out_file="tree.dot", class_names=["malignant", " benign"], feature_names=cancer.feature_names, impurity=False, filled=True)

dotファイルをjupyter上で開こうとしてエラーが出る場合はpngに変換してしまえばとりあえずは良い。

dot -T png tree.dot > tree.png
open tree.png

dotコマンドが使えなければ、インストールされていないかもしれない。

brew install graphviz

葉が純粋になるまでテストすると訓練データに適合しすぎてしまうケースが多い。過剰適合を防ぐ方法としては、

  • 事前枝刈り(pre-pruning):テストの深さを制御するなどして木の成長を早めに止める
  • 事後枝刈り(post-pruning):情報の少ないノードの削除など

決定木は訓練データに過剰適合することが多く、決定木を実用する際にはアンサンブル方が用いられることが多い。

ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
from sklearn.model_selections import train_test_split

X, y = make_moons(n_samples=100, noise-0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratufy=y, random_state=42)
forest = RandomForestClassifier(n_estimators=5, random_state=42)
forest.fit(X_train, y_train)

ランダムフォレストは決定木が過剰適合してしまう問題へのひとつの対処法だ。いくつかの決定木をそれぞれが個々にことなったものとなるように構築し、その結果を平均したものを出力として得る。それぞれが異なるように構築するために

  1. ブートストラップサンプリング:訓練データをN個ある際に、その中から交換ありでランダムにN個抽出する。そうすることでそれぞれの決定木を構築する際に用いるデータが少しずつ異なる。
  2. 各ノードでのテストに用いる特徴量を選択:max_featuresに設定した数の特徴量をランダムに抽出してその中で最適なテストを実施する。

このようにすることで個々のデータに対しては過剰適合しているが、それぞれの木が少しずつ異なるため予測性能を維持したまま過剰適合を抑えることができる。

勾配ブーストティング回帰木
from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train)

複数の決定木を組み合わせるアンサンブル法である。勾配ブースティングでは、1つ前の決定木の誤りを次の決定木が修正するようにして決定木を順番に作っていくとある。修正とあるが具体的にはどのように修正するのだろうか。
ざっくりとした理解になるが、

  1. まずはじめのモデルを構築し、真の値と予測した値との残差を得る。
  2. その残差を最小化するようなモデルをさらに構築する。

$$
F_1(x) = y\\
h_1(x) = y - F_1(x)\\
F(x)=F_1(x) \longmapsto F_2(x)=F_1(x)+h_1(x)\cdots \longmapsto F_M(x)=F_M−1(x)+h_M−1(x)
$$

勾配ブースティングについて下記、参考にさせていただきました。
Kaggle Masterが勾配ブースティングを解説する - Qiita
勾配ブースティングについてざっくりと説明する - About connecting the dots.


かなり間隔があいてしまったので、もう少し読みすすめる時間を確保していきたい。