0Pricing
Learn AI with Python · レッスン

ランダムフォレストとバギング

アンサンブルの概念、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フィードバックを取得できます。ローカル設定は不要です。

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

  1. 決定木:理論と実装
  2. ランダムフォレストとバギング
  3. 勾配ブースティング:GBM と XGBoost
  4. LightGBM と CatBoost
← Learn AI with Pythonに戻る