今回は機械学習における重要概念の1つである「過学習(Overfitting)」について、決定木モデルを用いて深さ(max_depth)を変化させながら学習を行った。
これまでTitanicデータセットを用いてロジスティック回帰を中心に学習してきたが、今回はモデルの複雑さと汎化性能の関係をより深く理解することが目的である。
—
決定木モデルの実装と評価
まず決定木モデルを用いて、max_depthを変更しながらtrain/testの精度を確認した。
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=5, random_state=42)
tree.fit(X_train, y_train)
print("train")
print(tree.score(X_train, y_train))
print("test")
print(tree.score(X_test, y_test))
実行結果は以下の通りである。
train 0.9789325842696629 test 0.7597765363128491
この結果から、学習データに対しては非常に高い精度を示している一方で、テストデータでは精度が低下していることが分かる。
—
max_depthによる性能変化
決定木の深さを変更し、train/test精度の変化を確認した。
1 0.7879 0.7821 2 0.8033 0.7653 3 0.8342 0.7988 4 0.8384 0.7988 5 0.8623 0.8044 10 0.9185 0.7932 None 0.9789 0.7597
気づき
- depthが増えるほどtrain精度は上昇する
- test精度は途中でピークを迎え、その後低下する
- max_depth=5付近が最もバランスが良い
これは典型的なBias-Variance Tradeoffの挙動である。
—
Cross Validationによる評価
単一のtrain/test splitでは評価が不安定になる可能性があるため、5-fold Cross Validationを実施した。
[0.81564246 0.81460674 0.82022472 0.78651685 0.85393258] mean = 0.8181846713953927
この結果から、データ分割によるスコアのばらつきが存在することが分かる。
補足
- 1回のtrain/test splitは偶然の影響を受ける
- Cross Validationは複数回評価することで安定した指標を得る手法である
—
ロジスティック回帰との比較
同様にロジスティック回帰でもCross Validationを実施した。
[0.7877095 0.78089888 0.78089888 0.78651685 0.82022472] mean = 0.7912497646098802
決定木(max_depth=5)と比較すると以下の結果となる。
Decision Tree : 0.8182 Logistic Reg : 0.7912
考察
- 決定木は非線形な関係を表現できるため精度が高い
- ロジスティック回帰は線形モデルであり表現力が制限される
- その代わり、ロジスティック回帰は安定性(低Variance)が高い
—
過学習の観察
決定木のmax_depthを制限しない場合、以下の結果となった。
train : 0.9789 test : 0.7597
これは典型的な過学習である。
- 学習データをほぼ完全に暗記している
- 未知データへの汎化性能が低い
—
Bias-Varianceの整理
今回の結果は以下のように整理できる。
- max_depth=1 → High Bias(未学習)
- max_depth=5 → バランスが良い状態
- max_depth=None → High Variance(過学習)
このバランスを調整することが機械学習における重要なタスクである。
—
今回の学び
- train accuracyが高いことは必ずしも良いことではない
- test accuracyやCross Validationが重要である
- モデルの複雑さには最適点が存在する
- Bias-Variance Tradeoffの理解が性能改善の鍵となる
- Cross Validationにより評価の信頼性を高められる