TECH I.S.

機械学習 - Bootstrap Aggregation (バギング)


Bagging

デシジョンツリーなどの方法は、トレーニングセットでオーバーフィッティングを起こしやすく、新しいデータで間違った予測につながる可能性があります。

Bootstrap Aggregation (バギング) は、分類または回帰の問題のオーバーフィッティングを解決しようとするアンサンブル手法です。バギングは、機械学習アルゴリズムの精度とパフォーマンスを向上させることを目的としています。これは、元のデータセットのランダムなサブセットを置換して取得し、分類子 (分類用) または回帰子 (回帰用) を各サブセットに適合させることによって行われます。次に、各サブセットの予測は、分類のための多数決または回帰のための平均によって集計され、予測精度が向上します。


基本分類器の評価

バギングによってモデルのパフォーマンスがどのように向上するかを確認するには、基本分類子がデータセットでどのように機能するかを評価することから始めなければなりません。バギングは概念の続きであるため、決定木が何であるかがわからない場合は、先に進む前に決定木に関するレッスンを確認してください。

Sklearnのワインデータセットで見つかったさまざまなクラスのワインを特定します。

from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.tree import DecisionTreeClassifier

次に、データを読み込んでX(入力フィーチャ)とy(ターゲット)に格納する必要があります。パラメーター as_frameはTrueに設定されているため、データの読み込み時に機能名が失われることはありません。(sklearn0.23 より古いバージョンは、as_frame引数はサポートされていないためスキップする必要があります。)

data = datasets.load_wine(as_frame = True)X = data.datay = data.target

目に見えないデータでモデルを適切に評価するには、Xとyをトレーニングセットとテストセットに分割する必要があります。データの分割については、トレーニング/テストのレッスンを参照してください。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

データの準備ができたら、基本分類子をインスタンス化し、トレーニングデータに適合させることができます。

dtree = DecisionTreeClassifier(random_state = 22)dtree.fit(X_train,y_train)

結果:

DecisionTreeClassifier(random_state=22)

目に見えないテストセットでワインのクラスを予測し、モデルのパフォーマンスを評価できるようになりました。

y_pred = dtree.predict(X_test)print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train)))print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))

結果:

Train data accuracy: 1.0Test data accuracy: 0.8222222222222222

必要なデータをインポートし、基本分類器のパフォーマンスを評価します。

from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) dtree = DecisionTreeClassifier(random_state = 22) dtree.fit(X_train,y_train) y_pred = dtree.predict(X_test) print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train))) print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))
実行例 »

基本分類子は、現在のパラメーターを使用したテストデータセットで82%の精度を達成するデータセットでかなりうまく機能します (random_stateパラメータセット)。

テストデータセットのベースライン精度が得られたので、バギング分類子が単一の決定木分類子をどのように実行するかを確認できます。


広告




バギング分類器の作成

バギングの場合、パラメーター n_estimators を設定する必要があります。これは、モデルが一緒に集約する基本分類器の数です。

このサンプル データセットでは、推定値の数が比較的少なく、より広い範囲が調査されることがよくあります。ハイパーパラメータの調整は通常、グリッド検索、しかし今のところ、推定量の値の選択セットを使用します。

まず、必要なモデルをインポートします。

from sklearn.ensemble import BaggingClassifier

次に、各アンサンブルで使用する推定器の数を表す値の範囲を作成しましょう。

estimator_range = [2,4,6,8,10,12,14,16]

バギング分類器が n_estimatorsの異なる値でどのように機能するかを確認するには、値の範囲を反復処理し、各アンサンブルからの結果を保存する方法が必要です。これを行うには、forループを作成し、後で視覚化するためにモデルとスコアを別々のリストに保存します。

注: 基本分類子のデフォルトパラメータは、BaggingClassifierそれはDicisionTreeClassifierしたがって、バギングモデルをインスタンス化するときに設定する必要はありません。

models = []scores = []for n_estimators in estimator_range:     # Create bagging classifier    clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)     # Fit the model    clf.fit(X_train, y_train)     # Append the model and score to their respective list    models.append(clf)    scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))

モデルとスコアが保存されたので、モデルのパフォーマンスの向上を視覚化できます。

import matplotlib.pyplot as plt# Generate the plot of scores against number of estimatorsplt.figure(figsize=(9,6))plt.plot(estimator_range, scores)# Adjust labels and font (to make visable)plt.xlabel("n_estimators", fontsize = 18)plt.ylabel("score", fontsize = 18)plt.tick_params(labelsize = 16)# Visualize plotplt.show()

必要なデータをインポートし、BaggingClassifierのパフォーマンスを評価します。

import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.ensemble import BaggingClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) estimator_range = [2,4,6,8,10,12,14,16] models = [] scores = [] for n_estimators in estimator_range:     # Create bagging classifier     clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)     # Fit the model     clf.fit(X_train, y_train)     # Append the model and score to their respective list     models.append(clf)     scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test))) # Generate the plot of scores against number of estimators plt.figure(figsize=(9,6)) plt.plot(estimator_range, scores) # Adjust labels and font (to make visable) plt.xlabel("n_estimators", fontsize = 18) plt.ylabel("score", fontsize = 18) plt.tick_params(labelsize = 16) # Visualize plot plt.show()

結果


実行例 »


結果の説明

エスティメータの数のさまざまな値を反復することで、モデルのパフォーマンスが 82.2% から 95.5% に向上することがわかります。 14 個の推定量の後、別の値を設定すると、精度が低下し始めます。random_state表示される値はさまざまです。
安定した結果を得るためにはクロスバリデーションを使用することを推奨します。

この場合、ワインの種類を識別する精度が 13.3%向上しています。


評価の別の形式

ブートストラップは観測のランダムなサブセットを選択して分類子を作成するため、選択プロセスで除外される観測があります。これらの「out-of-bag」観測は、テストセットの場合と同様に、モデルの評価に使用できます。 out-of-bag推定は、バイナリ分類問題のエラーを過大評価する可能性があるため、他のメトリックを補完するものとしてのみ使用する必要があることに注意してください。

前回の演習では、12個の推定値が最高の精度を示したので、それを使用してモデルを作成します。今回はパラメータの設定oob_scoreout-of-bagスコアでモデルを評価するにはtrueに設定します。

out-of-bagメトリクスでモデルを作成します。

from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) oob_model = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22) oob_model.fit(X_train, y_train) print(oob_model.oob_score_)
実行例 »

OOBとテスト セットで使用されるサンプルが異なり、データセットが比較的小さいため、精度に違いがあります。それらがまったく同じであることはめったにありません。ここでも、OOBはエラーを推定するための迅速な手段を使用する必要がありますが、唯一の評価メトリックではありません。


バギング分類子からの決定木の生成

ディシジョンツリー(決定木)レッスンでは、モデルが作成した決定木をグラフ化することができます。集約された分類器に入った個々の決定木を表示することもできます。これは、バギングモデルがどのように予測に到達するかをより直感的に理解するのに役立ちます。

注: これは、ツリーが比較的浅く狭いため、視覚化が容易な小さなデータセットでのみ機能します。

sklearn.treeからplot_tree関数をインポートする必要があります。可視化したい推定量を変更することで、異なる木をグラフ化することができます。

バギング分類器からの決定木の生成

from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier from sklearn.tree import plot_tree X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) clf = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22) clf.fit(X_train, y_train) plt.figure(figsize=(30, 20)) plot_tree(clf.estimators_[0], feature_names = X.columns)

結果


実行例 »

ここでは、最終予測の投票に使用された最初の決定木のみを確認できます。ここでも、分類子のインデックスを変更することで、集約された各ツリーを確認できます。



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細