決定木(CART)の分類、回帰をしてみたメモ。
#決定木
理論などは[入門]初心者の初心者による初心者のための決定木分析が参考になりました。
#実装
今回は、線形分離不可能であるmake_moonsを使用していきます。
##分類問題
#必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
#データの数は200、ノイズ(分散)は0.1に設定
moons = make_moons(n_samples=200, noise=0.1, random_state=0)
#データを分割する
X = moons[0]
y = moons[1]
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
#学習(treeの深さをデフォルトと3に分けている)
tree_clf = DecisionTreeClassifier().fit(X_train, y_train)
tree_clf_3 = DecisionTreeClassifier(max_depth=3).fit(X_train, y_train)
#結果
print(tree_clf.score(X_test, y_test)) #0.98
print(tree_clf_3.score(X_test, y_test)) #0.92
結果を見るとどちらも高精度で分類されていることがわかりますが、グラフにプロットしてみると
右のtreeの深さが3を見るとうまく分類されていなく、また予測面が直線で表現されていることがわかりました。
##回帰問題
#必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import mglearn
from sklearn.tree import DecisionTreeRegressor
#データを分割、学習(treeの深さをデフォルトと3に分けている)
reg_X, reg_y = mglearn.datasets.make_wave(n_samples=100)
tree_reg = DecisionTreeRegressor().fit(reg_X, reg_y)
tree_reg_3 = DecisionTreeRegressor(max_depth=3).fit(reg_X, reg_y)
#結果
print(tree_reg.score(reg_X, reg_y)) #1.0
print(tree_reg_3.score(reg_X, reg_y)) #0.80
結果を見ると、デフォルトが100%と過学習?となってしまった。
グラフにプロットすると
分類問題の時と同様にtreeの深さが3ではうまく予測されていなく、予測面が直線となってしまっていることがわかりました。
決定木のメリット
・ホワイトボックスな為、理解が容易
・分類問題、回帰問題のどちらにも適用可能
決定木のデメリット
・過学習しやすい
・予測面が滑らかではない