メインコンテンツへスキップ

BaggingClassifierの使用例

·1426 文字·3 分
目次

はじめに
#

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

前回の記事: scikit-learnのBaggingClassifierでバギングする

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

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%であるから、計算時間は学習した弱学習器(決定木)の数にほぼ比例している。 したがって、追加した弱学習器のみ学習させることで計算時間を短縮できることが示された。

参考
#

sklearn.ensemble.BaggingClassifier — scikit-learn 0.24.0 documentation

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

scikit-learnのBaggingClassifierでバギングする
·2756 文字·6 分
BaggingClassifierを用いた学習(バギング、ペースティング、ランダムサブスペース、ランダムパッチ)について解説する。
Scikit-learnの主成分分析 (PCA)
·1432 文字·3 分
Scikit-learnのPCAクラスのパラメータ、属性とメソッドについて解説する。
Scikit-learnの正則化付き重回帰モデル
·2498 文字·5 分
Scikit-learnに実装されている重回帰、Ridge回帰、Lasso回帰、Elastic Netのロジックと使用方法をまとめた。
Scikit-learnでデータをスケール変換する
··4596 文字·10 分
Pythonの機械学習用ライブラリScikit-learnに実装されている、スケール変換について調べた。
Scikit-learn ランダムフォレスト回帰のfeature_importances_の定義
·1236 文字·3 分
Scikit-learnの回帰木やランダムフォレスト回帰のクラスには、Feature Importances (FI) という説明変数の重要度を示す指標がある。これは、各説明変数による予測誤差の二乗平均の減少量に対して、データ点数の重みを掛けて求めた値である。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。