1. Введение

  2. Применение

  3. Ограничения

  4. Схема бутстрапа

    1. Эфронов доверительный интервал

    2. Доверительный интервал Холла

    3. t-процентильный доверительный интервал

  5. Реализация на Python

  6. Проблемы

  7. Примечания

Введение

Бутстрап — это вычислительный статистический метод, который позволяет оценить распределение выборочной статистики (например: медиана, эксцесс, куртозис, среднее значение) путем многократной генерации выборок методом Монте-Карло на основе уже имеющейся выборки.

Проще говоря, бутстрап позволяет «притворяться» генеральной совокупностью, многократно создавая «псевдовыборки» из исходной выборки с возвращением

Бутстрап-выборка — это псевдовыборка с повторениями, извлеченная из исходной выборки, то есть в бутстрап-выборке может попасться несколько раз одно и то же наблюдение из исходной выборки. Более того, бутстрап-выборка должна быть равной по объему исходной выборке.


Фактически, когда мы используем бутстрап, мы хотим по имеющейся выборке сделать выводы об определенной статистике в генеральной совокупности. Мы много раз извлекаем из исходной выборки бутстрап-выборки, считаем по ним статистику, строим ее распределение, считаем доверительный интервал и делаем выводы относительно него. Ну или можем просто взять, например, среднее или медианное значение, чтобы получить точечную оценку.

Обычно бутстрап применяется в следующих случаях:

  • теоретическое распределение данных неизвестно;

  • объем выборки мал для прямой статистической оценки;

  • нет параметрических или непараметрических аналогов;

  • необходима оценка сложных статистик, для которых сложно получить аналитические формулы.

Ключевое преимущество бутстрапа заключается в том, что его можно применять в широком спектре задач, даже тогда, когда все остальные методы, как параметрические, так и непараметрические, бессильны.

Данный метод не требует предположений о распределении данных от исследователя. Единственное условие, которое необходимо выполнить — репрезентативность выборки.

Применение

Теперь давайте немного подробнее остановимся на том, где на практике применяется бутстрапирование. Бутстрап очень распространен в Data Science, а именно в машинном обучении, он позволяет оценивать качество моделей, неопределенность предсказаний и многое другое.

  • Оценка качества модели

    Бутстрап используется для получения более точных оценок метрик качества модели, таких как точность, полнота, F1-мера и т.д. Из исходного набора данных многократно формируются бутстрап-выборки путем случайного отбора с повторением. Затем на каждой выборке обучается и тестируется модель, после чего метрики усредняются. Это позволяет снизить смещение оценок и получить доверительные интервалы.

  • Оценка неопределенности предсказаний

    В нейронных сетях бутстрап применяется для оценки неопределенности (uncertainty) предсказаний модели. Для этого создаются несколько моделей на разных бутстрап-выборках и делаются предсказания каждой из них. Разброс предсказаний характеризует неопределенность. Это важно, например, для задач с высокой ценой ошибки, где нужно знать, насколько модель уверена в своем ответе.

  • Интерпретация и анализ признаков

    Обучая модели на бутстрап-выборках, можно оценить важность признаков по частоте их использования в деревьях (для случайного леса) или по разбросу весов (для нейросетей). Это дает понимание, какие признаки вносят наибольший вклад в предсказания модели.

  • Активное обучение

    Бутстрап используется в активном обучении (active learning) — подходе, где модель сама выбирает наиболее информативные примеры для разметки и дообучения. Одна из стратегий — запрашивать разметку для примеров, где предсказания моделей, обученных на разных бутстрап-выборках, сильнее всего различаются между собой.

  • Ансамблевые методы

    Бутстрап лежит в основе некоторых ансамблевых алгоритмов, таких как бэггинг (bagging) и случайный лес (random forest). Эти методы строят множество базовых моделей на различных бутстрап-выборках из обучающих данных. Затем предсказания базовых моделей объединяются, что чаще всего дает более точный и стабильный результат по сравнению с одиночной моделью.

Таким образом, бутстрап позволяет улучшить качество, надежность и интерпретируемость моделей машинного обучения и применяется в достаточно широком спектре задач. Он особенно полезен при ограниченном размере обучающей выборки, помогая максимально эффективно использовать доступные данные.

Ограничения

У бутстрапа есть несколько ограничений. Сперва рассмотрим те, что влияют на точность результатов, это:

  • количество сгенерированных бутстрап-выборок (псеводвыборок);

  • размер исходной выборки.

Чем больше количество наблюдений в исходной выборке и бутстрап-выборок, тем точнее получится результат, и наоборот. Количество сгенерированных бутстрап-выборок имеет здесь большее значение.

В любом случае, данные факторы не являются блокирующими, то есть можно работать и с маленькими выборками, и с относительно небольшим количеством бутстрап-выборок. В таком случае, просто нужно правильно интерпретировать результат и понимать последствия, о которых будет сказано в разделе проблем.


Также бутстрап может быть ресурсоемким, особенно при работе с большими объемами данных и большим количеством итераций, так как нам приходится извлекать много бутстрап-выборок из исходной выборки.

Как нам известно из комбинаторики, количество таких уникальных выборок , то есть алгоритмически бутстрапирование будет нам обходиться в , что очень грустно.

На самом деле, никто так не делает, все ориентируются на собственные вычислительные мощности, поэтому никогда не извлекаются все уникальные бутстрап-выборки, а просто каждый раз берется случайная псевдовыборка -ое количество раз. Такие выборки маловероятно, но могут быть неуникальными, и, даже так, фактически, для нас это не имеет значения. То есть для бутстрапирования используется симуляция методом Монте-Карло.

Подытоживая, точность результата бутстрапирования, как уже было сказано, определяется количеством псевдовыборок, но, с другой стороны, это очень дорого обходится по вычислительным мощностям.

Таким образом, необходимо приходить к компромиссу между точностью и ресурсоемкостью бутстрапирования, что достигается использованием метода Монте-Карло (в частности, управлением количеством псевдовыборок ).


Последний, но очень важный нюанс заключается в предназначении бутстрапа. Бутстрап является замечательным методом для работы в средиземье, однако в крайнеземье бутстрап показывает себя заметно хуже. Это происходит по той причине, что в бутстрап-выборки приходит лишь небольшое число наблюдений из хвостов исходной выборки.

То есть с помощью бутстрапа мы можем анализировать и строить выводы о средних тенденциях, но не о крайних. Например, мы можем построить доверительный интервал для медианы, но доверительный интервал для 99% процентиля будет крайне неточным.

Схема бутстрапа

Эфронов доверительный интервал

Итак, давайте перейдем к рассмотрению схемы бутстрапа. Изначально, у нас имеется выборка, которая является частью генеральной совокупности. Мы хотим изучить какую-нибудь статистику и сделать относительно нее выводы по генеральной совокупности. Именно в этом ключе мы будем рассматривать исходную выборку.

Далее, мы определяем сколько бутстрап-выборок (размера как исходная выборка) наши вычислительные мощности позволяют извлечь из исходной выборки. Извлекаем -ое количество псевдовыборок с повторениями.

По каждой полученной бутстрап-выборке считаем статистику, относительно которой хотим оценить генеральную совокупность.

Когда мы подсчитали все статистики, мы строим распределение данной статистики и подсчитываем 2.5% и 97.5% квантили.

Так и выглядит алгоритм. Теперь давайте опишем его математически.

Обозначения:

  • — статистика по генеральной совокупности;

  • — выборочная статистика;

  • — статистика по бутстрап-выборке;

  • — количество бутстрап-выборок;

  • — объем исходной выборки (то есть и каждой бутстрап-выборки);

  • — уровень значимости.

Алгоритм:

  1. Выборка представляет собой часть большей генеральной совокупности, которую вы хотите изучить, и является репрезентативной.

  2. Из исходной выборки случайным образом с повторением (один и тот же элемент может быть выбран несколько раз) выбирается элементов, формируя бутстрап-выборку.

  3. По сформированной бутстрап-выборке считается статистика.

  4. Повторяем шаги 2 и 3 раз (например, 10000, 100000 или 1000000 раз).

  5. Находим Эфронов доверительный интервал, то есть значения, меньше которых 2.5% и 97.5% значений (по необходимости % значений вне границ можно выбрать самостоятельно, например, 1%, 0.1% и т.д.). Сам же доверительный интервал имеет следующий вид:

Итак, схема, о которой было рассказано, является классической. И построенный по этой схеме доверительный интервал называется Эфронов доверительный интервал.

Помимо Эфронова доверительного интервала существуют доверительный интервал Холла и t-процентильный доверительный интервал. Преимущество последних двух заключается в том, что они дают несмещенную оценку выборочной статистики, так как при их расчете происходит центрирование.

Эфронов доверительный интервал дает смещенную оценку, а t-процентильный и Холла — несмещенную.

Смещение оценки может произойти если в исходной выборке очень мало наблюдений, или распределение имеет тяжелые хвосты, или же распределение выборочной статистики перекошено, мультимодально, или по другим причинам, связанным с видом распределения сильно отличающимся от традиционных.

В частности, говоря о t-процентильном доверительном интервале, он несколько шире Эфронова и Холла, что приближает его к аналитическим аналогам, по сравнению с другими двумя, которые заметно уже, то есть в меньшей степени учитывают вариативность статистики.

Доверительный интервал Холла

Итак, как уже было сказано, алгоритм построения доверительного интервала Холла дает несмещенную оценку. Достигается это при помощи центрирования, которое заключается в том, что из каждой полученной статистики по бутстрап-выборке вычитается статистика по исходной выборке.

Помимо центрирования и небольшой корректировки формулы расчета доверительного интервала данная схема ничем больше не отличается. Рассмотрим схему по пунктам, вспомнив обозначения:

Обозначения:

  • — статистика по генеральной совокупности;

  • — выборочная статистика;

  • — статистика по бутстрап-выборке;

  • — количество бутстрап-выборок;

  • — объем исходной выборки (то есть и каждой бутстрап-выборки);

  • — уровень значимости.

Алгоритм:

  1. Выборка представляет собой часть большей генеральной совокупности, которую вы хотите изучить, и является репрезентативной.

  2. По исходной выборке считается статистика.

  3. Из исходной выборки случайным образом с повторением выбирается элементов, формируя бутстрап-выборку.

  4. По сформированной бутстрап-выборке считается статистика.

  5. Из полученной по бутстрап-выборке статистики вычитается и получаем .

  6. Повторяем шаги 3, 4 и 5 раз (например, 10000, 100000 или 1000000 раз).

  7. Находим доверительный интервал Холла, который имеет следующую формулу:

Таким образом и получается несмещенная оценка.

t-процентильный доверительный интервал

t-процентильный доверительный интервал является еще одной схемой построения бутстраповского доверительного интервала. Так же, как и доверительный интервал Холла, t-процентильный использует центрирование. Однако в данном случае, мы еще и делим полученную разность между статистиками по бутстрап-выборке и исходной на стандартную ошибку.

Такой доверительный интервал получается несколько шире Эфронова и Холла, что компенсирует недооценивание разброса статистики, но не полностью. Также t-процентильный доверительный интервал обладает лучшей асимптотической сходимостью.

Итак, давайте перейдем к обсуждению алгоритма:

Обозначения:

  • — статистика по генеральной совокупности;

  • — выборочная статистика;

  • — статистика по бутстрап-выборке;

  • — количество бутстрап-выборок;

  • — объем исходной выборки (то есть и каждой бутстрап-выборки);

  • — уровень значимости;

  • — стандартная ошибка бутстрап-выборки;

  • — стандартная ошибка исходной выборки.

Алгоритм:

  1. Выборка представляет собой часть большей генеральной совокупности, которую вы хотите изучить, и является репрезентативной.

  2. По исходной выборке считается статистика и .

  3. Из исходной выборки случайным образом с повторением выбирается элементов, формируя бутстрап-выборку.

  4. По сформированной бутстрап-выборке считается статистика и .

  5. Из полученной по бутстрап-выборке статистики вычитается и результат делится на , итоговое значение будет обозначаться как .

  1. Повторяем шаги 3, 4 и 5 раз (например, 10000, 100000 или 1000000 раз).

  2. Находим t-процентильный доверительный интервал, который имеет следующую формулу:

Предельно важно отметить, что t-процентильный доверительный интервал хоть и обладает всеми прекрасными свойствами, сложно применить в ситуациях, когда затруднительно вычислить стандартную ошибку для определенной статистики, в силу отсутствия аналитических формул (Примечание 3). Посему, ниже в примере, я реализую логику только для бутстрапирования среднего значения.

Реализация на Python

Наконец, давайте рассмотрим реализацию бутстрапа на Python. Напишем достаточно простую функцию, которая будет предоставлять возможность воспользоваться разными схемами бутстрапирования и иметь возможность принимать функцию, которая заданным образом считает необходимую статистику. Стоит отметить, что для упрощения, полагается, что эта функция будет содержаться в numpy и иметь параметр axis. Данному требованию удовлетворяют, например, mean(), median() и var().

import numpy as np
from typing import Callable, Literal


def get_bootstrap_ci(
        X: np.ndarray, func: Callable, N: int = 10**3,
        kind: Literal['Efron', 'Hall', 't-percentile'] = 't-percentile',
        alpha: float = 0.05
) -> tuple[float, float]:
    n = X.size
    bootstrap_samples = np.random.choice(X, (N, n), replace=True)
    theta_hat_star = func(bootstrap_samples, axis=1)

    if kind == 't-percentile':
        theta_hat = func(X)
        se_theta_hat = np.std(X, ddof=1) / np.sqrt(n)
        se_theta_hat_star = np.std(bootstrap_samples, axis=1, ddof=1) / np.sqrt(n)

        theta_hat_star = (theta_hat_star - theta_hat) / se_theta_hat_star

        left, right = np.quantile(theta_hat_star, (1 - alpha / 2, alpha / 2))

        ci = (theta_hat - se_theta_hat * left, theta_hat - se_theta_hat * right)
    elif kind == 'Hall':
        theta_hat = func(X)
        theta_hat_star -= theta_hat

        left, right = np.quantile(theta_hat_star, (1 - alpha / 2, alpha / 2))

        ci = (theta_hat - left, theta_hat - right)
    elif kind == 'Efron':
        left, right = np.quantile(theta_hat_star, (alpha / 2, 1 - alpha / 2))

        ci = (left, right)
    else:
        raise ValueError('Unknown method')
        
    return ci

А теперь давайте посмотрим на эту функцию в действии. Допустим, что у нас есть выборка из 52334 наблюдений, в которых находится возраст респондентов. Тогда, грубо, но ради иллюстрации, мы можем предположить, что имеющиеся наблюдения и есть генеральная совокупность, а затем извлечь выборку и по ней постараемся рассчитать доверительный интервал для среднего возраста методом бутстрапирования.

Для начала импортируем необходимые библиотеки:

import numpy as np
import pandas as pd
import seaborn as sns

загрузим данные (примечание 1):

df = pd.read_excel('analysis/data/data_msk.xlsx')

а теперь посмотрим как они распределены:

sns.displot(df.age, aspect=1.8, bins=df.age.nunique())
Распределение возраста респондентов

Видим, что распределение имеет коэффициент асимметрии больше нуля и оно бимодально, но не сильно выражено, что не должно сильно помешать нам в эксперименте.

Далее, чтобы эксперимент можно было воспроизвести, настроим состояние:

np.random.seed(34)

Теперь посчитаем среднее по “генеральной совокупности”, создадим выборку и посчитаем среднее по ней:

sample = df.age.sample(500)
print(f'Среднее по "генеральной совокупности": {np.mean(df.age)}')
print(f'Среднее по выборке: {np.mean(sample)}')

вывод:

Среднее по "генеральной совокупности": 68.54052814613827
Среднее по выборке: 67.768

Видим, что среднее в выборке сильно отличается от среднего в генеральной совокупности. Я специально подобрал такой пример, чтобы показать, что даже в таких случаях бутстрап будет работать корректно.

Итак, теперь давайте посмотрим на результаты разных схем по очереди:

  1. Эфронов доверительный интервал:

    ci = get_bootstrap_ci(sample , np.mean, alpha=0.01, kind='Efron')
    print(ci)
    print(f'Ширина интервала составила: {ci[1] - ci[0]}')

    вывод:

    (66.99199, 68.53201)
    Ширина интервала составила: 1.5400199999999984
  2. Доверительный интервал Холла:

    ci = get_bootstrap_ci(sample , np.mean, alpha=0.01, kind='Hall')
    print(ci)
    print(f'Ширина интервала составила: {ci[1] - ci[0]}')

    вывод:

    (67.00399, 68.54401)
    Ширина интервала составила: 1.5400199999999984
  3. t-процентильный доверительный интервал:

    ci = get_bootstrap_ci(sample , np.mean, alpha=0.01)
    print(ci)
    print(f'Ширина интервала составила: {ci[1] - ci[0]}')

    вывод:

    (67.0257231115649, 68.56861294427233)
    Ширина интервала составила: 1.5428898327074307

Важное примечание! Для того, чтобы воспроизвести эксперимент, необходимо каждый раз перед получением доверительного интервала определенным методом запускать строки с установкой seed и генерацией выборки. Это позволит работать с одинаковыми бутстраповскими выборками, которые генерируются функцией choice() в get_bootstrap_ci().

В данном случае, среднее по генеральной совокупности на уровне значимости 1% лежит за пределами Эфронова доверительного интервала, но внутри t-процентильного и Холла. Важно отметить, что в данном примере проявилось смещение, которое заложено в Эфронов доверительный интервал. Именно поэтому среднее в генеральной совокупности входит в доверительный интервал Холла, а в Эфронов нет, при том, что они не отличаются по ширине.

Также, из примечательного, t-процентильный доверительный интервал оказался самым широким из всех, а интервалы Холла и Эфрона, как было сказано, равны, но уже t-процентильного, что вполне закономерно.

Проблемы

  1. По сравнению с аналитическими доверительными интервалами, доверительные интервалы, полученные с помощью бутстрапирования (не имеет значения какая выбрана схема), несколько уже, если исходная выборка мала. Это является недостатком, так как мы по сути недооцениваем разброс выборочной статистики при небольшом количестве наблюдений в исходной выборке.

  2. С помощью бутстрапирования мы охватываем асимптотически только 63% наблюдений из исходной выборки, а 37% наблюдений не попадают в бутстрап-выборку. Этот факт является следствием того, что мы берем выборки с повторениями.

  3. Исходя из предыдущего факта следует, что бутстрап является отличной техникой для работы в средиземье, но не в крайнеземье. А когда у распределения исходной выборки тяжелые хвосты (то есть много выбросов), бутстрап может начать плохо себя показывать даже в средиземье.

  4. При наличии структуры в данных (регрессия, временные ряды) бутстрап схему необходимо устроить таким образом, чтобы она учитывала эту структуру (Примечание 2).

Примечания

Примечание 1. Данные можно скачать по ссылке.

Примечание 2. Наличие структуры в данных является большой проблемой при бутстрапировании. Таким образом, необходимо учитывать имеющуюся структуру, что позволяет создать более продвинутые методы, смоделированные на основе классического бутстрапирования, или воспользоваться имеющимися. С конкретными методами бутстрапирования регрессий и временных рядов можно ознакомиться по ссылке.

Примечание 3. Как один из вариантов решений трудностей с поиском стандартной ошибки, для некоторых статистик (медиана, стандартное отклонение) берут формулу для стандартной ошибки среднего и умножают на некий коэффициент, который был смоделирован эмпирически.

С другой же стороны, в зависимости от выбранной статистики и имеющегося распределения, формула для стандартной ошибки будет меняться. Посему, часто на практике проще воспользоваться другим методом построения доверительного интервала, чем искать аналитическую запись или аппроксимировать стандартную ошибку.

Тем не менее, существует разные практики бороться с данной проблемой. Например, можно использовать вместо стандартной ошибки (), стандартное отклонение (). Это тоже будет работать, но несколько хуже. Более того, существует вложенный бутстрап и jackknife, цель которых так же направлена на перебарывание трудностей с поиском стандартной ошибки.

Со всеми данными разновидностями бутстрапа и методами можно ознакомиться по ссылке (Глава 11)