#Bootstrap Samplingとは
母集団となるデータがあるときに,母集団から重複を許してランダムにいくらかデータを取り出して再標本化をする手法.
###具体例:
母集団を$X= {x_1,x_2,...,x_{10} }$とする.
- 再標本化を行う回数と,再標本化されたサンプルのサンプルサイズを設定する(例では再標本化を3回,サンプルサイズを5としておく)
- 母集団$X$から重複を許してランダムにサンプリングをする
例:
$X_1=x_1,x_3,x_3,x_6,x_9$
$X_2=x_2,x_2,x_2,x_3,x_7$
$X_3=x_2,x_4,x_5,x_8,x_8$
##機械学習におけるBootstrap sampling
**バギング(bagging)**と呼ばれるアンサンブル学習の手法では,まず母集団からBootstrap samplingによって複数のサンプルを抽出する.そしてそれを訓練データとすることで複数の予測モデルを生成し,それらの予測モデルを何らかの方法によって結合することで(多数決,平均,出力をメタ特徴量として新たな予測モデルの構築,etc...),予測精度の向上,過学習の回避が見込める.
#scikit-learnを用いたBootstrap
「Bootstrap sklearn」とかでググるとだいたい公式ドキュメントが一番上に出てきてsklearn.cross_validation.Bootstrap
を使えと言ってくるが,sklearn.cross_validation
は廃止される予定なので好ましくない.(私の環境ではそもそもsklearn.cross_validation
のなかにBootstrap
が見つからずimportすらできなかった)
ということで,その代わりにsklearn.utils.resample
を使ってBootstrap samplingをしましょう.
from sklearn.utils import resample
# [0,1,2,...,9]と[10,11,12,...,19]の生成
data_x = [i for i in range(10)]
data_y = [i+10 for i in range(10)]
# K:再標本化の回数 SIZE:再標本化されたもののサンプルサイズ
K = 10
SIZE = len(data_x)
# bootstrap sampling
for i in range(K):
resampled_data_x, resampled_data_y = resample(data_x,data_y,
n_samples = SIZE)
print("------%d resample ------"% i)
print(resampled_data_x)
print(resampled_data_y)
------0 resample ------
[4, 6, 0, 9, 7, 5, 0, 5, 3, 3]
[14, 16, 10, 19, 17, 15, 10, 15, 13, 13]
------1 resample ------
[5, 2, 6, 4, 5, 1, 1, 3, 1, 1]
[15, 12, 16, 14, 15, 11, 11, 13, 11, 11]
------2 resample ------
[0, 3, 0, 1, 2, 1, 7, 7, 1, 3]
[10, 13, 10, 11, 12, 11, 17, 17, 11, 13]
------3 resample ------
[1, 8, 1, 0, 2, 8, 3, 8, 4, 0]
[11, 18, 11, 10, 12, 18, 13, 18, 14, 10]
------4 resample ------
[3, 1, 6, 7, 6, 6, 4, 3, 1, 1]
[13, 11, 16, 17, 16, 16, 14, 13, 11, 11]
------5 resample ------
[3, 4, 6, 6, 9, 7, 3, 1, 4, 3]
[13, 14, 16, 16, 19, 17, 13, 11, 14, 13]
------6 resample ------
[6, 7, 1, 3, 6, 4, 8, 9, 9, 9]
[16, 17, 11, 13, 16, 14, 18, 19, 19, 19]
------7 resample ------
[9, 8, 3, 2, 6, 2, 0, 9, 4, 1]
[19, 18, 13, 12, 16, 12, 10, 19, 14, 11]
------8 resample ------
[0, 9, 2, 7, 4, 6, 0, 6, 8, 8]
[10, 19, 12, 17, 14, 16, 10, 16, 18, 18]
------9 resample ------
[5, 9, 9, 1, 3, 7, 7, 3, 6, 3]
[15, 19, 19, 11, 13, 17, 17, 13, 16, 13]
resample
メソッドには,再標本化されたサンプルのサンプルサイズをn_samples
に渡してやれば良い.(デフォルトは入力のデータ長len(array)
)
出力を確認すると,data_x
とdata_y
が対応された状態で再標本化されており,重複が許されていることがわかる.
参考
scikit-learnのresample
メソッドのドキュメント(https://scikit-learn.org/stable/modules/generated/sklearn.utils.resample.html )
朱鷺の杜Wiki「バギング」(http://ibisforest.org/index.php?%E3%83%90%E3%82%AE%E3%83%B3%E3%82%B0 )