意外と簡単!Bagging Ensemble(Bootstrap Aggregating)

スポンサーリンク
データサイエンス

みなさんこんにちは。

今日はアンサンブルの1つ、Bagging Ensemble(バギング)のやり方について紹介します。

XGBoostやLightGBMは既にアンサンブルが施されているので意識する必要はないと思いますが、深層学習ではアンサンブルが既に入ったモデルはありませんので自前でアンサンブルを構築する必要があります。

ということで、いつも通り、論よりコード。

要所Pythonコード

for n in range(5):
    train_df = df.sample(frac=1, replace=True)

要所だけ言いますと、上記のようにreplace=Trueで重複を許したリサンプリングをモデルを1つ作る度に行い、最後はそれらモデル(例では5個)の予測値の平均を最終予測値とする、だけです。

(説明変数もリサンプリングするアプローチもあるそうです。)

また、これを何回か繰り返しても、確率的に一定の割合のデータが抽出されずに残ります。

それを精度の評価に使うというのがOut of Baggingになります。

全体Pythonコード(一部イメージ)

# Dataframeを想定
import pandas as pd

############
# モデル作成 #
############

# dfを学習データとする
df = pd.DataFrame(...)

# 何個モデルを作るか
n_model = 5

# 作ったモデルを入れる配列
model_list = []

# oob評価結果格納用
oob_results = pd.DataFrame(columns={"accuracy", "precision", "recall", "specificity"})


# n_model分だけモデルを作る
for i in range(n_model):
    # 復元抽出法でリサンプリングする("replace=True"が重複を許してランダムにサンプルする設定)
    train = df.sample(frac=1, replace=True)

    # 復元抽出すると大体3割が選択されないで残るので、テストに使用できる。(OOB: Out of Bagging)
    oob = df[~df.index.isin(train.index)]

    # Tensorflow Estimatorだったらこんな感じ...(テキトーです)
    model = DNNClassifier(...)
    # 学習
    model.train(train)

    # oobテスト
    result = model.evaluate(oob)
    print(result)
    # 結果は保存しておく
    oob_results = oob_results.append(result, ignore_index=True)

    # リストに保存
    model_list.append(model)

# oob予測結果を平均してモデルのおおよその精度を把握する
print(oob_results.mean())

########
# 予測  #
########
# 予測対象データ
df_predict = pd.DataFrame(...)

# 予測結果格納用
predict_results = pd.DataFrame(columns={"id", "predict"})

# 作ったモデルだけ予測
for model in model_list:
    # 予測結果
    result = model.predict(df_predict)

    # 結果は保存しておく
    predict_results = predict_results.append(result, ignore_index=True)

# 予測結果を平均したものを最終的な予測値とする
print(predict_results.groupby("id").mean())

解説

BaggingとはBootstrap Aggregatingの略であり、復元抽出法(重複を許して標本からデータを繰り返し抽出する方法/別名ブートストラップリサンプリング)でリサンプリングしたデータごとにモデルを構築し、最終的な予測値にそれらモデルの予測値の平均を用いる方法です。

pandasで復元抽出する方法

pandasで復元抽出法でリサンプリングするには、

train = df.sample(frac=1, replace=True)

このように、replace=Trueを設定することにより重複を許可したリサンプリングが実行できます。

このリサンプリングとモデル構築を数回繰り返し、予測結果には作ったモデルの予測値の平均を用いるのがBaggingということになります。(わかってしまえばなんてことは無いですね。)

OOB: Out of Baggingとは

復元抽出法を用いると、当然ながらランダムかつ重複を許して抽出する方法なので抽出されないデータというものが一定数存在します。(大体3割程度残るそうです。)

それらは学習に用いていないデータなので作成されたモデルの精度確認に使うことができます。

先ほどのコードの例ではOOBへの予測結果の平均をおおよそのBagging Ensembleの結果として表示しています。

予測結果はそれぞれのモデルの予測値を平均する

バギングでは、予測値は作成したモデル全ての予測値の平均を最終的な予測値とします。

まとめ

今日はBaggingアンサンブルの流れとその肝である復元抽出法についてコード付きでお話致しました。

XGBoostやLightGBMではこれを適用する必要はないと思いますが、いわゆるシングルモデル(線形回帰モデル、深層学習など)ではこれらを用いることで精度の向上が見込めます。

参考になればと思います。

それでは!

コメント

タイトルとURLをコピーしました