※記事内に商品プロモーションを含むことがあります。
はじめに
前回の記事でscikit-learnのBaggingClassifierクラスについて解説したため、本記事では実際の使用例を示す。
基本的な使い方と、分類確率を出力する方法、warm startによる追加学習について示す。
前回の記事:
scikit-learnのBaggingClassifierでバギングする
本記事では、ライブラリを以下の通りインポートしていることを前提とする。
1
2
3
4
5
|
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に付属しているデータを読み込む。
1
2
3
|
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names) # 説明変数
y = pd.Series(data.target) # 目的変数
|
次に、train_test_split関数を用いてデータを学習用 (train) と検証用 (val) に分割する。
1
|
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
メソッドを用いる。
1
2
3
4
5
|
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のパラメータを設定した例を以下に示す。
1
2
3
4
5
|
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
メソッドが実装されている場合、各弱学習器が出力した確率の平均が返される。
一方、実装されていない場合、弱学習器が出力した分類結果の比率が返される。
1
2
|
pred_proba = clf.predict_proba(X_val)
print(pred_proba)
|
実行結果
1
2
3
4
5
6
7
8
9
10
11
|
[[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個の弱学習のみ学習させている。
1
2
3
4
5
6
7
|
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個の決定木を学習させる)。
1
2
3
4
5
6
7
8
9
10
|
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()
|
実行結果
1
|
17.8 ms ± 198 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
|
・別途学習させる場合(1回の実行で30個の決定木を学習させる)。
1
2
3
4
5
6
7
8
9
10
|
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()
|
実行結果
1
|
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