木ベースモデル: 決定木とランダムフォレスト
決定木モデルとアンサンブル型のフォレストモデルを構築し、調整します。
「木ベースモデル: 決定木とランダムフォレスト」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- scikit-learn API: fit、transform、predict
- 線形モデル: 回帰と分類
- 木ベースモデル: 決定木とランダムフォレスト
- モデル評価と交差検証