データサイエンスを使った意思決定の中でCART分析というものがあります。
簡単に言えば全体のデータをある基準で分割してある基準で分割してを繰り返してという決定木のやり方を使って分類過程から結果までを可視化しているものです。
そこで思ったのが決定木も勾配ブースティング決定木も同じく決定木でデータを最初の段階で分割していないという共通点があります。
しかし勾配ブースティング決定木は学習しながら最適な決定木を作っていくというところが違います。
そこで実際どのように違うかを見てみようと思います。
関数
勾配ブースティング決定木(アンサンブル)
from sklearn.tree import export_graphviz as EG
from pydotplus import graph_from_dot_data as GFDD
def cart_analysis_ensemble(x, y, model, filename="CART"):
y_data = list(set(y.values))
for i in range(len(y_data)):
y_data[i] = str(y_data[i])
for i in range(len(model.estimators_[len(model.estimators_)-1])):
dotdata = EG(model.estimators_[len(model.estimators_)-1, i], filled=True, rounded=True, class_names=y_data, feature_names=x.columns, out_file=None)
graph = GFDD(dotdata)
graph.write_png(filename+str(i)+".png")
決定木
from sklearn.tree import export_graphviz as EG
from pydotplus import graph_from_dot_data as GFDD
def cart_analysis(x, y, model, filename="CART"):
y_data = list(set(y.values))
for i in range(len(y_data)):
y_data[i] = str(y_data[i])
dotdata = EG(model, filled=True, rounded=True, class_names=y_data, feature_names=x.columns, out_file=None)
graph = GFDD(dotdata)
graph.write_png(filename+".png")
プログラム
ライブラリのインポート
from lightgbm import LGBMClassifier as LGBMC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.ensemble import GradientBoostingClassifier as GBC
import pandas as pd
df = pd.read_csv("iris.csv")
y = df["category"]
x = df.drop("category", axis=1)
gbc = GBC()
gbc.fit(x, y)
cart_analysis_ensemble(x, y, gbc, filename="Gradient_boosting_Classifier")
dtc = DTC()
dtc.fit(x, y)
cart_analysis(x, y, dtc, filename="Dicision_Tree_Classifier")
この結果得られた決定木が
決定木
勾配ブースティング決定木
クラスごとなので複数(3つ)あります。
初期値で最大の深さが決められて過学習しないようになっていますね。それで恐らくクラス分作られて確率的(Softmax関数?)にやっているのかな?
まとめ
分析には決定木、予測精度を上げるには勾配ブースティング決定木ですね。