ランダムフォレストとバギング
アンサンブルの概念、RandomForestClassifier、n_estimators、特徴量重要度、OOB スコアを学びます。
「ランダムフォレストとバギング」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
単一の決定木の問題
単一の決定木は分散が大きいため、少し異なるデータで再学習するだけで、まったく違う決定木になることがあります。アンサンブルは、多数の決定木を組み合わせることでこの問題を解決します。
バギング(Bootstrap Aggregating)
バギングでは、データから異なるブートストラップサンプル(復元抽出によるランダムサンプリング)を作り、それぞれを使って多数のモデルを学習させた後、予測を平均します。
分散の大きいモデルを多数平均すると、バイアスをあまり増やさずに全体の分散を減らせます。
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag = BaggingClassifier(
estimator=DecisionTreeClassifier(),
n_estimators=100,
random_state=0,
)
bag.fit(Xtr, ytr)バギングからランダムフォレストへ
ランダムフォレストは、決定木のバギングにもう1つ工夫を加えたものです。各分割で、特徴量のランダムな部分集合だけを候補として検討します。
これにより決定木同士の相関が下がり、それぞれの誤りがより効果的に相殺されるため、アンサンブルの性能が向上します。
RandomForestClassifierの基本
RandomForestClassifier を使用します。主要なパラメータである n_estimators は、構築する決定木の数を設定します。決定木を増やすほど安定しますが、処理は遅くなります。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=200, random_state=0)
rf.fit(Xtr, ytr)
print("Accuracy:", rf.score(Xte, yte))n_jobsによる並列学習
ランダムフォレスト内の決定木は互いに独立しているため、並列で学習できます。n_jobs=-1 を設定すると、すべてのCPUコアを使用して学習を大幅に高速化できます。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=500,
n_jobs=-1, # use all cores
random_state=0,
)
rf.fit(Xtr, ytr)Out-of-Bag(OOB)スコア
各決定木では、約3分の1のサンプルが使われずに残ります(ブートストラップサンプルに選ばれなかったサンプルです)。このout-of-bagサンプルは、組み込みの検証セットとして機能します。
oob_score=True を設定すると、別途データを分割せずに汎化誤差を無料で推定できます。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=300,
oob_score=True,
random_state=0,
)
rf.fit(Xtr, ytr)
print("OOB score:", rf.oob_score_)フォレスト内の決定木の深さを制御する
同じ決定木のパラメータを使用できます。max_depth、min_samples_leaf、max_features(各分割で試す特徴量の数)です。
max_features="sqrt" は、分類で一般的に使われるデフォルト値です。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=300,
max_depth=12,
max_features="sqrt",
random_state=0,
)組み込みの特徴量重要度
単一の決定木と同様に、ランダムフォレストもすべての決定木で平均した feature_importances_ を提供します。この不純度に基づく重要度は高速ですが、種類の多い特徴量に偏る可能性があります。
from sklearn.ensemble import RandomForestClassifier
import numpy as np
rf = RandomForestClassifier(n_estimators=200, random_state=0).fit(Xtr, ytr)
order = np.argsort(rf.feature_importances_)[::-1]
for i in order[:5]:
print(i, rf.feature_importances_[i])Permutation Importance
Permutation importanceは、より信頼性の高い手法です。1つの特徴量列をシャッフルし、スコアがどれだけ低下するかを測定します。低下幅が大きいほど、その特徴量が重要だったことを意味します。
この手法はモデルに依存せず、不純度による偏りも避けられます。
from sklearn.inspection import permutation_importance
result = permutation_importance(
rf, Xte, yte, n_repeats=10, random_state=0, n_jobs=-1
)
print(result.importances_mean)Permutationの結果を解釈する
permutation_importance は、繰り返し実行した結果から importances_mean と importances_std を返します。学習データへの適合度ではなく汎化への影響を測定するため、ホールドアウトセットで計算します。
import numpy as np
means = result.importances_mean
stds = result.importances_std
for i in np.argsort(means)[::-1]:
print(f"feature {i}: {means[i]:.3f} +/- {stds[i]:.3f}")ランダムフォレストを使う場面
ランダムフォレストは、堅牢で、調整が少なく、非線形性や相互作用を扱え、過学習にも強いため、優れたデフォルト選択肢です。短所は、単一の決定木よりもメモリ使用量が大きく予測が遅いこと、そして解釈しにくいことです。
クイックチェック
バギングとランダムフォレストについて理解度を確認します。
まとめ
まとめ:バギングは、ブートストラップサンプルでモデルを学習させ、予測を平均することで分散を減らします。ランダムフォレストは、各分割で特徴量のランダムな部分集合を追加します。n_estimators で調整し、速度を上げるには n_jobs=-1 を使用します。oob_score で検証を無料で行え、信頼性の高い順位付けには不純度に基づく重要度よりも permutation_importance を優先します。
よくある質問
「ランダムフォレストとバギング」レッスンは無料ですか?
はい。「ランダムフォレストとバギング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「ランダムフォレストとバギング」で何を学びますか?
アンサンブルの概念、RandomForestClassifier、n_estimators、特徴量重要度、OOB スコアを学びます。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ランダムフォレストとバギング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 決定木:理論と実装
- ランダムフォレストとバギング
- 勾配ブースティング:GBM と XGBoost
- LightGBM と CatBoost