Last Updated on

The bootstrap method is a resampling technique used to estimate statistics on a population by sampling a dataset with replacement.

It can be used to estimate summary statistics such as the mean or standard deviation. It is used in applied machine learning to estimate the skill of machine learning models when making predictions on data not included in the training data.

A desirable property of the results from estimating machine learning model skill is that the estimated skill can be presented with confidence intervals, a feature not readily available with other methods such as cross-validation.

In this tutorial, you will discover the bootstrap resampling method for estimating the skill of machine learning models on unseen data.

After completing this tutorial, you will know:

- The bootstrap method involves iteratively resampling a dataset with replacement.
- That when using the bootstrap you must choose the size of the sample and the number of repeats.
- The scikit-learn provides a function that you can use to resample a dataset for the bootstrap method.

Discover statistical hypothesis testing, resampling methods, estimation statistics and nonparametric methods in my new book, with 29 step-by-step tutorials and full source code.

Let’s get started.

## Tutorial Overview

This tutorial is divided into 4 parts; they are:

- Bootstrap Method
- Configuration of the Bootstrap
- Worked Example
- Bootstrap API

### Need help with Statistics for Machine Learning?

Take my free 7-day email crash course now (with sample code).

Click to sign-up and also get a free PDF Ebook version of the course.

## Bootstrap Method

The bootstrap method is a statistical technique for estimating quantities about a population by averaging estimates from multiple small data samples.

Importantly, samples are constructed by drawing observations from a large data sample one at a time and returning them to the data sample after they have been chosen. This allows a given observation to be included in a given small sample more than once. This approach to sampling is called sampling with replacement.

The process for building one sample can be summarized as follows:

- Choose the size of the sample.
- While the size of the sample is less than the chosen size
- Randomly select an observation from the dataset
- Add it to the sample

The bootstrap method can be used to estimate a quantity of a population. This is done by repeatedly taking small samples, calculating the statistic, and taking the average of the calculated statistics. We can summarize this procedure as follows:

- Choose a number of bootstrap samples to perform
- Choose a sample size
- For each bootstrap sample
- Draw a sample with replacement with the chosen size
- Calculate the statistic on the sample

- Calculate the mean of the calculated sample statistics.

The procedure can also be used to estimate the skill of a machine learning model.

The bootstrap is a widely applicable and extremely powerful statistical tool that can be used to quantify the uncertainty associated with a given estimator or statistical learning method.

— Page 187, An Introduction to Statistical Learning, 2013.

This is done by training the model on the sample and evaluating the skill of the model on those samples not included in the sample. These samples not included in a given sample are called the out-of-bag samples, or OOB for short.

This procedure of using the bootstrap method to estimate the skill of the model can be summarized as follows:

- Choose a number of bootstrap samples to perform
- Choose a sample size
- For each bootstrap sample
- Draw a sample with replacement with the chosen size
- Fit a model on the data sample
- Estimate the skill of the model on the out-of-bag sample.

- Calculate the mean of the sample of model skill estimates.

The samples not selected are usually referred to as the “out-of-bag” samples. For a given iteration of bootstrap resampling, a model is built on the selected samples and is used to predict the out-of-bag samples.

— Page 72, Applied Predictive Modeling, 2013.

Importantly, any data preparation prior to fitting the model or tuning of the hyperparameter of the model must occur within the for-loop on the data sample. This is to avoid data leakage where knowledge of the test dataset is used to improve the model. This, in turn, can result in an optimistic estimate of the model skill.

A useful feature of the bootstrap method is that the resulting sample of estimations often forms a Gaussian distribution. In additional to summarizing this distribution with a central tendency, measures of variance can be given, such as standard deviation and standard error. Further, a confidence interval can be calculated and used to bound the presented estimate. This is useful when presenting the estimated skill of a machine learning model.

## Configuration of the Bootstrap

There are two parameters that must be chosen when performing the bootstrap: the size of the sample and the number of repetitions of the procedure to perform.

### Sample Size

In machine learning, it is common to use a sample size that is the same as the original dataset.

The bootstrap sample is the same size as the original dataset. As a result, some samples will be represented multiple times in the bootstrap sample while others will not be selected at all.

— Page 72, Applied Predictive Modeling, 2013.

If the dataset is enormous and computational efficiency is an issue, smaller samples can be used, such as 50% or 80% of the size of the dataset.

### Repetitions

The number of repetitions must be large enough to ensure that meaningful statistics, such as the mean, standard deviation, and standard error can be calculated on the sample.

A minimum might be 20 or 30 repetitions. Smaller values can be used will further add variance to the statistics calculated on the sample of estimated values.

Ideally, the sample of estimates would be as large as possible given the time resources, with hundreds or thousands of repeats.

## Worked Example

We can make the bootstrap procedure concrete with a small worked example. We will work through one iteration of the procedure.

Imagine we have a dataset with 6 observations:

1 |
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6] |

The first step is to choose the size of the sample. Here, we will use 4.

Next, we must randomly choose the first observation from the dataset. Let’s choose 0.2.

1 |
sample = [0.2] |

This observation is returned to the dataset and we repeat this step 3 more times.

1 |
sample = [0.2, 0.1, 0.2, 0.6] |

We now have our data sample. The example purposefully demonstrates that the same value can appear zero, one or more times in the sample. Here the observation 0.2 appears twice.

An estimate can then be calculated on the drawn sample.

1 |
statistic = calculation([0.2, 0.1, 0.2, 0.6]) |

Those observations not chosen for the sample may be used as out of sample observations.

1 |
oob = [0.3, 0.4, 0.5] |

In the case of evaluating a machine learning model, the model is fit on the drawn sample and evaluated on the out-of-bag sample.

1 2 3 4 |
train = [0.2, 0.1, 0.2, 0.6] test = [0.3, 0.4, 0.5] model = fit(train) statistic = evaluate(model, test) |

That concludes one repeat of the procedure. It can be repeated 30 or more times to give a sample of calculated statistics.

1 |
statistics = [...] |

This sample of statistics can then be summarized by calculating a mean, standard deviation, or other summary values to give a final usable estimate of the statistic.

1 |
estimate = mean([...]) |

## Bootstrap API

We do not have to implement the bootstrap method manually. The scikit-learn library provides an implementation that will create a single bootstrap sample of a dataset.

The resample() scikit-learn function can be used. It takes as arguments the data array, whether or not to sample with replacement, the size of the sample, and the seed for the pseudorandom number generator used prior to the sampling.

For example, we can create a bootstrap that creates a sample with replacement with 4 observations and uses a value of 1 for the pseudorandom number generator.

1 |
boot = resample(data, replace=True, n_samples=4, random_state=1) |

Unfortunately, the API does not include any mechanism to easily gather the out-of-bag observations that could be used as a test set to evaluate a fit model.

At least in the univariate case we can gather the out-of-bag observations using a simple Python list comprehension.

1 2 |
# out of bag observations oob = [x for x in data if x not in boot] |

We can tie all of this together with our small dataset used in the worked example of the prior section.

1 2 3 4 5 6 7 8 9 10 |
# scikit-learn bootstrap from sklearn.utils import resample # data sample data = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] # prepare bootstrap sample boot = resample(data, replace=True, n_samples=4, random_state=1) print('Bootstrap Sample: %s' % boot) # out of bag observations oob = [x for x in data if x not in boot] print('OOB Sample: %s' % oob) |

Running the example prints the observations in the bootstrap sample and those observations in the out-of-bag sample

1 2 |
Bootstrap Sample: [0.6, 0.4, 0.5, 0.1] OOB Sample: [0.2, 0.3] |

## Extensions

This section lists some ideas for extending the tutorial that you may wish to explore.

- List 3 summary statistics that you could estimate using the bootstrap method.
- Find 3 research papers that use the bootstrap method to evaluate the performance of machine learning models.
- Implement your own function to create a sample and an out-of-bag sample with the bootstrap method.

If you explore any of these extensions, I’d love to know.

## Further Reading

This section provides more resources on the topic if you are looking to go deeper.

### Posts

### Books

- Applied Predictive Modeling, 2013.
- An Introduction to Statistical Learning, 2013.
- An Introduction to the Bootstrap, 1994.

### API

### Articles

- Resampling (statistics) on Wikipedia
- Bootstrapping (statistics) on Wikipedia
- Rule of thumb for number of bootstrap samples, CrossValiated.

## Summary

In this tutorial, you discovered the bootstrap resampling method for estimating the skill of machine learning models on unseen data.

Specifically, you learned:

- The bootstrap method involves iteratively resampling a dataset with replacement.
- That when using the bootstrap you must choose the size of the sample and the number of repeats.
- The scikit-learn provides a function that you can use to resample a dataset for the bootstrap method.

Do you have any questions?

Ask your questions in the comments below and I will do my best to answer.

Great post, Jason! Helped me a lot

I’m glad to hear that.

One more book:

Michael R. Chernick, Robert A. LaBudde. An Introduction to Bootstrap Methods with Applications to R (2011) https://www.amazon.com/Introduction-Bootstrap-Methods-Applications/dp/0470467045

Papers:

Yoram Reich, S.V.Barai. Evaluating machine learning models for engineering problems https://www.sciencedirect.com/science/article/pii/S0954181098000211

Gordon C. S. Smith, Shaun R. Seaman, Angela M. Wood, Patrick Royston, Ian R. White. Correcting for Optimistic Prediction in Small Data Sets https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4108045/

Wonderful references, thanks Vladislav.

Thanks to this post i can finally understand the difference between K-Cross validation and Bootstrap, thanks for the clear explanation.

I’m glad to hear that.

Hi Jason,

a very good post. Could you extend it with a bit of explanation/example on how to calculate confidence intervals at the end, e.g. for a bootstrap-calculated mean?

See this post:

https://machinelearningmastery.com/confidence-intervals-for-machine-learning/

And this post:

https://machinelearningmastery.com/calculate-bootstrap-confidence-intervals-machine-learning-results-python/

Thank you very much Jason, for a wonderful topic, It help me a lot to understand the concept.

I’m glad to hear that Mahmood.

Thanks for this post I was expecting (going over ISLR’s bootstrap Labs) a bootstrap method in sklearn (or numpy, pandas). thanks for explanation. You may also want to mention the Panda’s resample method, useful for converting monthly to quarterly observations.

Not sure what the sklearn.cross-validation.bootstrap is doing.

Thanks Jerry.

Hi Jason,

Thanks for the post. I understand what is Bootstrapping machine learning. I am confused between the difference between Bootstrapping and repeated random-subsampling cross-validation (https://en.wikipedia.org/wiki/Cross-validation_(statistics)#Repeated_random_sub-sampling_validation). To me both seem the same. First sample with randomly create a sub-sample from the given data and perform training of model on this. Next, validate the model on left out sample. Repeat the process some number of times. The final validation error would be an estimate from each of these iterations. Please let me know what is the difference?

One difference I can think of is bootstrapping samples with replacement and repeated random sub-sampling method does not repeat the sample. Is this the only difference?

Thanks,

Gaurav

Selection with replacement might be the main difference.

Very useful Jason..it’s easy to understand the concepts..thx a lot

Thanks. I’m happy to hear that.

Hi Jason,

How could one apply bootstrap method to time series data?

Thanks

Hmmm. Perhaps different amounts of history for the same model, or differently configured models?

Thanks for responding. The reason I’m considering bootstrap strategy is simply because I do not have sufficient data(time series) for fitting and validating my models. Thus, I need to find away to expand or augment my current data.

I came across moving block bootstrap method that simply segments the original data in form of blocks, which are resampled individually with replacement, while maintaining the order in the sequence across observations. I was able to increase my data with certain level of confidence interval, but the date index was missing in the bootstrapped data, leaving only a difficult index.

I would appreciate if you could link me to a more concise concept of the time series bootstrap as the article I consulted assumed a certain level of Statistics literacy.

Intersting. I’m not familiar with this approach. Let me know how you go with it.

Sure!

Is it possible to use bootstrapping with purposeful sampling?

Connie

The idea is to use random sampling with replacement. If you use non-random sampling, you’ll be adding bias.

Perhaps try it and compare results.

I would like to bootstrap my observations to estimate the NARDL model, could you help me please to create a program or simply guide me??

What is the NARDL model?

ARDL is an econometric model, that are two type : linear (ARDL) or non linear (NARDL).

Auto regressive Distributed Lag Models (ARDL) model plays a vital role when comes a need to analyze a economic scenario. In an economy, change in any economic variables may bring change in another economic variables beyond the time. This change in a variable is not what reflects immediately, but it distributes over future periods. Not only macroeconomic variables, other variables such as loss or profit earned by a firm in a year can affect the brand image of an organization over the period.

Thanks for sharing, I have no experience with economic models/methods.

ok. thank you

Hi Jason,

You mention ML model “skill”. I haven’t heard of this term before – is it the same as accuracy? Thanks for the great article, as always.

Skill is the aspect of the models performance that we/stakeholders care about. It might be accuracy or error.

The overall idea is really easy to understand, but I don’t quite get the statement “it is common to use a sample size that is the same as the original dataset”. How does that work? There’s no sampling going on if the sample is the same size as the original dataset. Unless “original dataset” means something different than I think it does here. It sounds like this is saying if you have 20 examples in your training set, your sample size should be 20.

Oh right, because of replacement. Still, I seems like using a smaller subset would be more useful intuitively.

Correct!

Why would a smaller dataset be more intuitive?

We are creating samples from the original sample that are the same size as the original sample, but may repeat some examples (e.g. selection with replacement).

Does that help?

Thanks for the post, it really helped me a lot in understanding bootstrapping method.

I am stuck in a problem where I thought I could make use of bootstrap, after understanding the method it doesn’t seem reasonable. Could you please help me with that.

I am doing an image classification algorithms with multiple classes, the dataset is totally imbalanced. For example : class A has 2000 images and Class B has only 100 images. Could you please guide me how could I tackle this, and build a good CNN model?

Good question.

I have advice on handling imbalanced data here:

https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/

Perhaps you can use augmentation to oversample the minority class:

https://machinelearningmastery.com/image-augmentation-deep-learning-keras/

A good place to start with CNNs is transfer learning:

https://machinelearningmastery.com/transfer-learning-for-deep-learning/

Thank you so much for the inputs. I’ll go through the methods you suggested.

Adding comments:

So bootstrap method can’t be used to balance the dataset, correct.?

I am currently using transfer learning (vgg16, resnet50) to classify my images. However as the data is largely imbalanced I ain’t able to get the expected results.

Thank you,

KK

Bootstrap is not intended to balance a dataset. Perhaps it can be used for that, I have not seen this use case.

Thanks for the clarification. Now I have better understanding on these methods. I will do oversampling on the minority dataset (flip, add some noise etc) and retrain my transfer learning model again. Will update here if I get interesting outcomes.

Thanks for the blog again, it is helping me to understand most of the topics.

Keen to hear how you go.

Hi Jason,

Thank you so much for the post, very helpful!

I have a question about the bootstrapping sample size. Other online resources suggest for statistical inferences the bootstrap sample size should be equal to the original sample size: “The accuracy of statistical estimates depends on the sample size”.

Do you see any risk of taking only one as the bootstrapping sample size?

A sample size of 1 is too small, at least 30 would be required I would expect.

I appreciate your post!

My question is that I we use bootstrap sampling that way, we will lose the time dependency of our dataset I guess. How is is it useful for machine learning time series predictions?

Thanks.

You could fit the model on different subsets of history.

Thanks Jason,, i have two questions please,, 1- if my data set is 4D, where each data point (row) consists of four attributes,, do i bootstrap the whole data points or i can mix between the attributes? 2- if my data set is large e.g., 300k, can i resample a subset e.g., 5000, each time? for my case i need to do the sampling 1000 times, where each time i need only 5000.. i got memory error when trying to resample 300k. Thanks

You select across rows (samples) not columns (features).

Hi Jason,

Newbie question, I’m afraid. If I take 10,000 random samples from a Normal(mu_0, sigma_0), then calculate mean and sd for the 10k samples, I have mu_1 and sigma_1, i.e. slightly different from mu_0 and sigma_0, as to be expected. (Please excuse notation)

Using the bootstrap, I expected the estimates returned to approach mu_0 and sigma_0, i.e. those of the population. But they don’t: they approach mu_1 and sigma_1, those of the 10k sample.

Have I misunderstood the application of the bootstrap method?

We don’t have new samples, so we are not doing law of large numbers and better approximating the population parameters.

Not sure your test/comparison is reasonable. Perhaps choosing a distribution parameter is inappropriate for the demo as it’s confusing, perhaps a nonlinear function of the samples would make the example clearer?

Ah, I think I see. Thank you ever so much for replying so quickly, I’m very grateful.

I’m glad it helped.

Hi Jason,

Sorry this is long, but I would really appreciate the help!

This post was helpful as I am trying to “increase” my sample size so that I may improve my model estimations. I am working in R for this project, but I’m familiar with Python as well. I think a previous comment was attempting to address this concern, but it wasn’t clear.

I have data for wildlife detections and the environmental characteristics of the survey sites where the detections occurred. I want wildlife detections from more survey sites so that the occupancy model I am using can provide more accurate estimates of species richness. I only have 40 survey sites with wildlife detections and I’d like to have 80. I want to make sure that my detections are resampled with the other dependent variables in mind when bootstrapping so that the detections are relatively consistent with environmental characteristics.

Is there a way to make sure the feature I want to resample from a dataset is resampled with other dependent variables considered? Or, a way to make “new survey” sites with new detections based on the data from the 40 survey sites I already have (bootstrap multiple features at a time)?

Thank you for any help or references!

Yes, you could tie all variables together into a data structure in memory, then resample the collection of aggregate “records”.

Thanks for the reply!

What exactly do you mean by that? Do you mean I should save the variables in a data frame then resample rows from the data frame?

Thanks!

Ali

Or whatever structure you’re comfortable working with.

It really helped me a lot. Thanks 😊

I’m happy to hear that.

You should explain why “with replacement” is important and what it achieves

Great suggestion, thanks.

From a given sample of 400, I had sub samples divided into two categorical variable l, let us say: A and B. A=106 samples and B=294. Since there is a great imbalanced between the two number of samples, will boot strapping help in doing a correlation for the categorical variable A? I am only interested in doing a correlation test with categorical variable A?

Hmmm, small sample sizes.

Using many thousands of repeats might help you estimate the desired quantity. I feel nervous though.

Using a stratified resampling procedure might help.

Thanks for the post. With confidence intervals calculated by multiplying the t value by the standard error of the mean, there is a clear relationship between sample size and width of confidence interval (quadrupling sample size halves width). I was wondering what the link is between sample size and the width of a confidence interval calculated by bootstrapping?

Perhaps related to the law of large numbers when estimating a quantity:

https://machinelearningmastery.com/a-gentle-introduction-to-the-law-of-large-numbers-in-machine-learning/

Am I correct that the bootstrap is only required when the sample of the study is small? Then it needed the repetition through the bootstrap to increase the sample.

Not only, you can use the method generally to estimate a quantity, such as model accuracy when presenting a final model.

Hi Mr. Brownlee;

in this tutorial the resample function choosing the same values in boot and oob samples for all trials.

I mean that at every cycle

Bootstrap Sample: [0.6, 0.4, 0.5, 0.1]

OOB Sample: [0.2, 0.3]

I need to divide the dataset 10 portions by resample function and wanna get diffirent sets for train and test. Then each train and test set will be used in ML algorithm i.e. I need a bootstrap aggregation. But the output of resample function is the same for each loop.

Yes, after a sample is selected, you must use it to create the train/test sets manually.

You can see an example here:

https://machinelearningmastery.com/calculate-bootstrap-confidence-intervals-machine-learning-results-python/

Really the example is very helpful. I had a hard time to understand the concept just by reading several links. Then the example of this link cleared my idea. Thank you.

Thanks, I’m happy it helped!

Perfectly explained ! Thanks a lot !

Thanks, I’m happy it was useful.