Edited at

ブートストラップサンプリング(Bootstrap Sampling)法とそのscikit-learnを用いた実行

More than 1 year has passed since last update.


Bootstrap Samplingとは

母集団となるデータがあるときに,母集団から重複を許してランダムにいくらかデータを取り出して再標本化をする手法.


具体例:

母集団を$X= {x_1,x_2,...,x_{10} }$とする.

1. 再標本化を行う回数と,再標本化されたサンプルのサンプルサイズを設定する(例では再標本化を3回,サンプルサイズを5としておく)

2. 母集団$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...),予測精度の向上,過学習の回避が見込める. 

bagging.png


scikit-learnを用いたBootstrap

「Bootstrap sklearn」とかでググるとだいたい公式ドキュメントが一番上に出てきてsklearn.cross_validation.Bootstrapを使えと言ってくるが,sklearn.cross_validationは廃止される予定なので好ましくない.(私の環境ではそもそもsklearn.cross_validationのなかにBootstrapが見つからずimportすらできなかった)

 ということで,その代わりにsklearn.utils.resampleを使ってBootstrap samplingをしましょう.


bootstrap.py

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)



output

------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_xdata_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