← Назад к вопросам

Что такое Bootstrap?

2.2 Middle🔥 151 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Bootstrap в статистике

Bootstrap — это метод переиспользования данных для оценки статистических параметров.

Основная идея

Из исходного датасета размером N случайно выбираем N элементов С ВОЗВРАЩЕНИЕМ (sampling with replacement).

import numpy as np
from numpy.random import choice

# Исходные данные
data = np.array([1, 2, 3, 4, 5])

# Bootstrap выборка
bootstrap_sample = choice(data, size=len(data), replace=True)
print(bootstrap_sample)  # Может быть [1, 2, 2, 5, 3]
# Заметь: 1 встречается дважды, 4 вообще отсутствует

Процесс Bootstrap

def bootstrap(data, n_iterations=1000):
    bootstrap_estimates = []
    
    for _ in range(n_iterations):
        # 1. Случайно выбираем с возвращением
        bootstrap_sample = np.random.choice(data, size=len(data), replace=True)
        
        # 2. Считаем статистику (например, среднее)
        statistic = np.mean(bootstrap_sample)
        bootstrap_estimates.append(statistic)
    
    # 3. Получаем распределение статистики
    return np.array(bootstrap_estimates)

# Пример
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bootstrap_means = bootstrap(data, n_iterations=10000)

print(f"Среднее: {np.mean(bootstrap_means):.2f}")
print(f"95% интервал доверия: [{np.percentile(bootstrap_means, 2.5):.2f}, {np.percentile(bootstrap_means, 97.5):.2f}]")

Применение 1: интервалы доверия

# Вместо параметрических методов (предполагают нормальность)
# Используем эмпирические интервалы из bootstrap

data = np.random.normal(100, 15, 50)  # 50 значений

# Bootstrap
bootstrap_means = []
for _ in range(10000):
    sample = np.random.choice(data, size=len(data), replace=True)
    bootstrap_means.append(np.mean(sample))

# 95% интервал доверия для среднего
ci_lower = np.percentile(bootstrap_means, 2.5)
ci_upper = np.percentile(bootstrap_means, 97.5)
print(f"95% CI: [{ci_lower:.2f}, {ci_upper:.2f}]")

Применение 2: стандартная ошибка

# Bootstrap позволяет оценить стандартную ошибку
# без формул и предположений о распределении

data = [5, 8, 12, 3, 9, 7, 11]
bootstrap_medians = []

for _ in range(10000):
    sample = np.random.choice(data, size=len(data), replace=True)
    bootstrap_medians.append(np.median(sample))

std_error = np.std(bootstrap_medians)
print(f"SE медианы: {std_error:.3f}")

Применение 3: тестирование гипотез

# Нулевая гипотеза: средние равны
group_a = [1, 2, 3, 4, 5]
group_b = [2, 3, 4, 5, 6]

# Объединяем для переиспользования при H0
pooled = np.concatenate([group_a, group_b])

bootstrap_diffs = []
for _ in range(10000):
    sample_a = np.random.choice(pooled, size=len(group_a), replace=True)
    sample_b = np.random.choice(pooled, size=len(group_b), replace=True)
    diff = np.mean(sample_a) - np.mean(sample_b)
    bootstrap_diffs.append(diff)

# Если 0 в интервале [2.5%, 97.5%] → нет разницы
ci_lower = np.percentile(bootstrap_diffs, 2.5)
ci_upper = np.percentile(bootstrap_diffs, 97.5)
print(f"95% CI для разницы: [{ci_lower:.2f}, {ci_upper:.2f}]")
if ci_lower <= 0 <= ci_upper:
    print("Нулевая гипотеза не отвергается")

Плюсы Bootstrap

✅ Не требует параметрических предположений ✅ Работает с любыми статистиками ✅ Интуитивен и простой ✅ Хорошо для малых выборок

Минусы Bootstrap

❌ Требует много вычислений (10k-100k итераций) ❌ Не улучшает плохие данные (garbage in = garbage out) ❌ Сложнее в некоторых сценариях (зависимые выборки)

Отличие от других методов

МетодКогда использовать
BootstrapНет параметрических предположений
Пермутационный тестТестирование гипотез
JackknifeLeave-one-out оценка
Cross-validationОценка моделей (ML)

Вывод

Bootstrap — это мощный метод для оценки неопределённости БЕЗ математических предположений. Идеален для малых выборок и нестандартных статистик!