Helve’s Python memo

Pythonを使った機械学習やデータ分析の備忘録

BaggingClassifierの使用例

前回の記事でscikit-learnのBaggingClassifierクラスについて解説したため、本記事では実際の使用例を示す。
基本的な使い方と、分類確率を出力する方法、warm startによる追加学習について示す。

前回の記事:
scikit-learnのBaggingClassifierでバギングする - Helve’s Python memo

目次

はじめに

本記事では、ライブラリを以下の通りインポートしていることを前提とする。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier

また、ライブラリのバージョンは以下の通りである。

pandas 0.25.0
scikit-learn 0.21.3

使用するデータ

Irisデータセットを例として使用する。
このデータセットは3種類の品種のアヤメを分類する問題である。
まず、scikit-learnに付属しているデータを読み込む。

data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names) # 説明変数
y = pd.Series(data.target) # 目的変数

次に、train_test_split関数を用いてデータを学習用 (train) と検証用 (val) に分割する。

X_train, X_val, y_train, y_val = train_test_split(X, y, train_size=0.8, random_state=0)

基本的な使い方

BaggingClassifierのbase_estimatorに弱学習器オブジェクトをセットするだけである。
今回、弱学習器は決定木 (DecisionTreeClassifier) とした。

学習と予測には、通常の分類器と同様にfitメソッドとpredictメソッドを用いる。

base_clf = DecisionTreeClassifier(random_state=0)
clf = BaggingClassifier(base_estimator=base_clf)

clf.fit(X_train, y_train)
bc_pred = clf.predict(X_val)

また、BaggingClassifierのパラメータを設定した例を以下に示す。

clf1 = BaggingClassifier(base_estimator=base_clf,
                         max_samples=0.5, 
                         n_estimators=40, 
                         random_state=0, 
                         n_jobs=-1)

パラメータの意味は次の通り。

  • max_samples=0.5: 弱学習器1個当りの学習サンプル数をfitで与えたデータの50%とする。
  • n_estimators=40: 弱学習器の数を40にする。
  • random_state=0: 乱数シードを設定する。
  • n_jobs=-1: CPUの全コアを使って並列計算する。

分類確率を示す

検証インスタンスが各クラスに含まれる確率を出力したい場合は、predict_probaメソッドを使う。
弱学習器にpredict_probaメソッドが実装されている場合、各弱学習器が出力した確率の平均が返される。
一方、実装されていない場合、弱学習器が出力した分類結果の比率が返される。

pred_proba = clf.predict_proba(X_val)
print(pred_proba)

実行結果

[[0.  0.  1. ]
 [0.  0.9 0.1]
 [1.  0.  0. ]
 [0.  0.  1. ]
 (中略)
 [0.  0.1 0.9]
 [1.  0.  0. ]
 [1.  0.  0. ]
 [0.  1.  0. ]
 [0.  1.  0. ]
 [1.  0.  0. ]]

弱学習器を追加して学習する

BaggingClassifierのwarm_startを設定すると、追加した弱学習器のみを再学習することができる。
例えば、グリッドサーチで弱学習器の数をチューニングしたい場合に計算時間を短縮できる。
以下の例では、最初に弱学習器の数を10として学習した後、
set_paramsメソッドで20にして、追加した10個の弱学習のみ学習させている。

base_clf = DecisionTreeClassifier(random_state=0)
clf = BaggingClassifier(base_estimator=base_clf, n_estimators=10, warm_start=True)

clf.fit(X_train, y_train)

clf.set_params(n_estimators=20) # 弱学習器の数を追加する
clf.fit(X_train, y_train) # 追加した弱学習器のみ学習させる

実際に計算時間を比較する(IPythonで実行)。

・追加で学習させる場合(1回の実行で20個の決定木を学習させる)。

def warm_start():
    base_clf = DecisionTreeClassifier(random_state=0)
    
    clf = BaggingClassifier(base_estimator=base_clf, n_estimators=10, warm_start=True)
    clf.fit(X_train, y_train)
    
    clf.set_params(n_estimators=20)
    clf.fit(X_train, y_train)

%timeit warm_start()

実行結果

17.8 ms ± 198 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


・別途学習させる場合(1回の実行で30個の決定木を学習させる)。

def cold_start():
    base_clf = DecisionTreeClassifier(random_state=0)
    
    clf = BaggingClassifier(base_estimator=base_clf, n_estimators=10)
    clf.fit(X_train, y_train)
    
    clf = BaggingClassifier(base_estimator=base_clf, n_estimators=20)
    clf.fit(X_train, y_train)

%timeit cold_start()

実行結果

25.4 ms ± 2.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


計算時間は、追加学習した場合は17.8ms, 別途学習した場合は25.4msであった。
17.8ms÷25.4ms=70.1%であるから、計算時間は学習した弱学習器(決定木)の数にほぼ比例している。
したがって、追加した弱学習器のみ学習させることで計算時間を短縮できることが示された。

※Adblockが有効の場合やモバイル版ページでは、シェアボタンをクリックできません