ゼロから始めるDecision Tree入門②:過学習を防ぐ工夫とランダムフォレスト
前回の記事では、決定木モデルを用いて「モテ度」を予測するシンプルな流れを解説しました。
今回はその続きとして、オーバーフィッティングとアンダーフィッティング、および
検証データの活用方法、さらに max_leaf_nodes
を使ったモデルの改善方法 を紹介します。
1. オーバーフィッティングとアンダーフィッティング
-
オーバーフィッティング (Overfitting)
将来繰り返されない「偽のパターン」を捕捉してしまい、訓練データに対しては精度が高く見えるが、未知データに対しては予測精度が低下する現象です。 -
アンダーフィッティング (Underfitting)
データ中の本質的なパターンを捉えきれず、訓練データに対しても予測精度が低い現象です。
これらを防ぐためには、モデルの複雑さを適切にコントロールすることが重要です。
2. 検証データの活用
モデルの評価を行う際には、訓練に使わなかった 検証データ (ValidationData) を利用します。
これにより、さまざまなモデル候補を比較し、過学習を避けつつ精度の高いモデルを選択できます。
3. max_leaf_nodes の役割
決定木モデルはそのままでは「深く」なりすぎる傾向があります。
max_leaf_nodes
引数を指定することで、木の複雑さを制御することが可能です。
- 葉の数を 増やしすぎる → 過学習のリスクが高まる
- 葉の数を 減らしすぎる → アンダーフィッティングになりやすい
max_leaf_nodes
を調整することは、モデルの複雑さをコントロールする「賢い方法」のひとつです。
4. max_leaf_nodes を変化させて比較する
以下のようにユーティリティ関数を定義し、異なmax_leaf_nodes
を試してMAE を比較できます。
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
# データを train/val に分割
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=0)
# MAEを返す関数
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return mae
# 候補とする葉の数
candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
for max_leaf_nodes in candidate_max_leaf_nodes:
mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print(f"max_leaf_nodes={max_leaf_nodes} の MAE: {mae:.2f}")
# Final_modelに適切なLeaf_Nodesを適応させる
final_model = DecisionTreeRegressor(max_leaf_nodes=best_tree_size, random_state=1)
final_model.fit(X, y)
5.Random-forestについて
決定木モデルはシンプルで分かりやすい反面、一つの木に依存するため過学習しやすい という弱点があります。
これを克服する代表的な手法が ランダムフォレスト (Random Forest) です。
特徴
- 多数の決定木を作り、その「平均的な予測」を最終結果とするアンサンブル学習手法
- 各木はデータのサブセット(ブートストラップサンプリング)と特徴量のサブセットで学習する
- 個々の木は多少のバラつきや弱点があっても、まとめることで安定した予測性能が得られる
from sklearn.ensemble import RandomForestRegressor
# ランダムフォレストモデルの学習
rf_model = RandomForestRegressor(n_estimators=100, random_state=0)
rf_model.fit(train_X, train_y)
# 予測と評価
rf_val_predictions = rf_model.predict(val_X)
rf_val_mae = mean_absolute_error(val_y, rf_val_predictions)
print(f"Random Forest の MAE: {rf_val_mae:.2f}")
5. まとめ
- 過学習とアンダーフィッティングを理解することで、モデルの改善が可能\
- 検証データを使ってモデルの評価を行うことが重要\
-
max_leaf_nodes
を調整することで、複雑さをコントロールできる - ランダムフォレストは、決定木の弱点を克服し、より安定した高精度のモデルを提供してくれる
関連リング
ゼロから始めるPandas入門:Pythonでデータ分析の第一歩
ゼロから始めるDecision Tree入門⓵:身近な例で機械学習モデルを作ってみよう