ランダムフォレストの OOB エラー推定

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Python の scikit - learn ライブラリを使ってランダムフォレストモデルのアウトオブバッグ(OOB)エラー率を測定する方法を示します。OOB エラー率は、それぞれのブートストラップサンプルにその観測値を含まない木の予測値を使って計算される各訓練観測値の平均エラーです。これにより、ランダムフォレストモデルを訓練中にフィットさせて検証することができます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替えて、Jupyter Notebook を使った練習にアクセスします。

時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートする

scikit - learn、NumPy、Matplotlib を含む必要なライブラリをインポートして始めます。再現性を保証するために、乱数シード値も設定します。

import matplotlib.pyplot as plt
from collections import OrderedDict
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier

RANDOM_STATE = 123

2 値分類用のデータセットを生成する

次に、scikit - learn が提供するmake_classification関数を使って 2 値分類用のデータセットを生成します。この関数を使うと、サンプル数、特徴量数、クラスごとのクラスタ数、情報的な特徴量数を指定できます。再現性を保証するために、固定された乱数シード値を使います。

X, y = make_classification(
    n_samples=500,
    n_features=25,
    n_clusters_per_class=1,
    n_informative=15,
    random_state=RANDOM_STATE,
)

アンサンブル分類器を定義する

max_featuresパラメータに異なる値を持つ 3 つのランダムフォレスト分類器のリストを定義します。訓練中の OOB エラー率の追跡を可能にするために、warm_start構築パラメータをTrueに設定します。また、OOB エラー率の計算を可能にするために、oob_scoreパラメータをTrueに設定します。

ensemble_clfs = [
    (
        "RandomForestClassifier, max_features='sqrt'",
        RandomForestClassifier(
            warm_start=True,
            oob_score=True,
            max_features="sqrt",
            random_state=RANDOM_STATE,
        ),
    ),
    (
        "RandomForestClassifier, max_features='log2'",
        RandomForestClassifier(
            warm_start=True,
            max_features="log2",
            oob_score=True,
            random_state=RANDOM_STATE,
        ),
    ),
    (
        "RandomForestClassifier, max_features=None",
        RandomForestClassifier(
            warm_start=True,
            max_features=None,
            oob_score=True,
            random_state=RANDOM_STATE,
        ),
    ),
]

OOB エラー率を計算する

各分類器に対して、n_estimators値の範囲をループして分類器をデータセットにフィットさせます。各n_estimators値に対する OOB エラー率を記録し、OrderedDictオブジェクトに格納します。

error_rate = OrderedDict((label, []) for label, _ in ensemble_clfs)

min_estimators = 15
max_estimators = 150

for label, clf in ensemble_clfs:
    for i in range(min_estimators, max_estimators + 1, 5):
        clf.set_params(n_estimators=i)
        clf.fit(X, y)

        oob_error = 1 - clf.oob_score_
        error_rate[label].append((i, oob_error))

OOB エラー率を視覚化する

最後に、各分類器の OOB エラー率を推定器の数の関数としてプロットします。これにより、エラー率が安定する推定器の数を特定できます。Matplotlib を使ってグラフを生成します。

for label, clf_err in error_rate.items():
    xs, ys = zip(*clf_err)
    plt.plot(xs, ys, label=label)

plt.xlim(min_estimators, max_estimators)
plt.xlabel("n_estimators")
plt.ylabel("OOB error rate")
plt.legend(loc="upper right")
plt.show()

まとめ

この実験では、scikit - learn を使ってランダムフォレストモデルのアウトオブバッグ(OOB)エラー率を測定する方法を示しました。2 値分類用のデータセットを生成し、アンサンブル分類器のリストを定義し、各分類器の OOB エラー率を計算し、結果を視覚化しました。この手法により、別個の検証セットが必要なくても、ランダムフォレストモデルのエラー率を推定することができます。