LoginSignup
42
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-19

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

42
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
26