0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロから始めるDecision Tree入門②:過学習を防ぐ工夫とランダムフォレスト

Posted at

ゼロから始める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入門⓵:身近な例で機械学習モデルを作ってみよう

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?