機械学習:アンサンブル学習 BaggingClassifier
アンサンブル学習器を構成している個々の学習器に、元々の訓練データセットから抽出したブーストラップ標本を訓練データとして与える。結果は多数決決定で返される。バギングは過学習を引き起こすバリアンスを下げる効果があり、決定木に使われる。
ここでは例としてワインデータを扱う。ターゲットはワインラベルとし、ラベル1を落として、0と2だけにする。
import pandas as pd
from sklearn import datasets
wine = datasets.load_wine()
df_wine = pd.DataFrame(wine.data, columns=wine.feature_names)
df_wine['label'] = wine.target
df_wine = df_wine[df_wine['label'] != 1]
df_wine
特徴量は、アルコール度とod280/od315_of_diluted_winesのみに絞り、無剪定(max_depth=None)の決定木からなるBaggingClassifierを設定する。
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
le = LabelEncoder()
y = le.fit_transform(y)
X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.2,
random_state=1,
stratify=y)
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='entropy', max_depth=None,
random_state=1)
bag = BaggingClassifier(estimator=tree,n_estimators=500,
max_samples=1.0, max_features=1.0,
bootstrap=True, bootstrap_features=False,
n_jobs=1, random_state=1)
これを実行した汎化性能は以下のようになる。
from sklearn.metrics import accuracy_score
bag = bag.fit(X_train, y_train)
y_train_pred = bag.predict(X_train)
y_test_pred = bag.predict(X_test)
bag_train = accuracy_score(y_train, y_train_pred)
bag_test = accuracy_score(y_test, y_test_pred)
print('Bagging train/test accuracies %.3f/%.3f'
% (bag_train, bag_test))
バギングはバリアンスを下げるが、バイアスは抑制しない。よって、バギングに組み込むアンサンブルには、バイアスの低い分類器を設定すべきである。