0Pricing
Python Academy · レッスン

木ベースモデル: 決定木とランダムフォレスト

決定木モデルとアンサンブル型のフォレストモデルを構築し、調整します。

「木ベースモデル: 決定木とランダムフォレスト」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

決定木の概念

決定木は、一連の二値の質問によってデータを部分集合に分割します。各内部ノードは特徴量のしきい値を表し、各葉は予測値を表します。

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier(max_depth=3, random_state=0).fit(X, y)
print("Depth:", model.get_depth())
print("Leaves:", model.get_n_leaves())

DecisionTreeClassifier

主なハイパーパラメーターは、max_depth、min_samples_split、min_samples_leafです。木が深すぎると過学習し、浅すぎると過少適合になります。

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)

model = DecisionTreeClassifier(max_depth=5, min_samples_leaf=5)
model.fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))

DecisionTreeRegressor

決定木は、各葉で目的変数の平均値を予測することで、回帰にも対応できます。

from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error

X, y = make_regression(noise=15, random_state=0)
model = DecisionTreeRegressor(max_depth=4).fit(X, y)
print("RMSE:", mean_squared_error(y, model.predict(X))**0.5)

特徴量の重要度

model.feature_importances_は、不純度の減少量に基づいて、各特徴量の相対的な重要度を示します。

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import numpy as np

X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
model = DecisionTreeClassifier().fit(X, y)
for name, imp in sorted(zip(feature_names, model.feature_importances_), key=lambda x: -x[1]):
    print(f"{name}: {imp:.3f}")

ランダムフォレストの概要

ランダムフォレストは、ブートストラップサンプルを使って相関の低い決定木を多数学習し、その予測を平均します。これにより、バイアスを増やさずに分散を減らせます。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)

model = RandomForestClassifier(n_estimators=100, random_state=0)
model.fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))

RandomForestRegressor

ランダムフォレストは回帰にも同様に効果的です。

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
from sklearn.metrics import r2_score

X, y = make_regression(noise=10, random_state=0)
model = RandomForestRegressor(n_estimators=100, random_state=0).fit(X, y)
print("R²:", r2_score(y, model.predict(X)))

OOBスコア

oob_score=Trueを設定すると、各木のブートストラップに含まれなかったサンプルを使って、追加の手間なく検証スコアを取得できます。別のテストセットは必要ありません。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
model = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=0).fit(X, y)
print("OOB score:", model.oob_score_)

勾配ブースティング

勾配ブースティング(GBM)は木を順番に学習し、それぞれの木が前の木の誤りを修正します。ランダムフォレストより精度が高いことが多い一方、学習には時間がかかります。

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = GradientBoostingClassifier(n_estimators=100).fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))

XGBoost / LightGBM

XGBoostとLightGBMは、最適化された勾配ブースティングライブラリです。sklearnのGBMより高速でスケーラビリティが高く、精度も高いことが多くあります。

# pip install xgboost lightgbm
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)

xgb = XGBClassifier(n_estimators=100, eval_metric="logloss").fit(X_tr, y_tr)
print("XGB acc:", xgb.score(X_te, y_te))

n_estimatorsの調整

ランダムフォレストの木を増やすと、ある程度までは過学習を起こさずに分散を減らせます。検証曲線を使って最適な木の数を見つけます。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_classification
import numpy as np

X, y = make_classification(random_state=0)
for n in [10, 50, 100, 200]:
    scores = cross_val_score(RandomForestClassifier(n_estimators=n, random_state=0), X, y, cv=5)
    print(f"n={n}: {scores.mean():.3f}")

決定木の可視化

sklearn.tree.plot_treeまたはexport_textを使うと、木が学習した内容を確認できます。

from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier(max_depth=2).fit(X, y)
print(export_text(model, feature_names=load_iris().feature_names.tolist()))

確認問題

ランダムフォレストは、単一の決定木と比べてどのように過学習を減らしますか。

まとめ

決定木は特徴量のしきい値でデータを分割し、葉の値を使って予測します。max_depthを調整して過学習を制御します。ランダムフォレストは多数の木の予測を平均し、分散を下げます。勾配ブースティングは木を順番に学習して高い精度を実現します。本番環境では、XGBoostまたはLightGBMを優先して使用します。

よくある質問

「木ベースモデル: 決定木とランダムフォレスト」レッスンは無料ですか?

はい。「木ベースモデル: 決定木とランダムフォレスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「木ベースモデル: 決定木とランダムフォレスト」で何を学びますか?

決定木モデルとアンサンブル型のフォレストモデルを構築し、調整します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「木ベースモデル: 決定木とランダムフォレスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. scikit-learn API: fit、transform、predict
  2. 線形モデル: 回帰と分類
  3. 木ベースモデル: 決定木とランダムフォレスト
  4. モデル評価と交差検証
← Python Academyに戻る