機械学習:アンサンブル学習 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
sklearn dataset 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))

バギングはバリアンスを下げるが、バイアスは抑制しない。よって、バギングに組み込むアンサンブルには、バイアスの低い分類器を設定すべきである。

この記事が気に入ったらサポートをしてみませんか?