Просто, понятно, удобно.

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

Но зачем использовать ресемплинг? Мы используем повторную выборку, потому что у нас есть только ограниченный объем данных - ограничения по времени и, мягко говоря, по экономике. Что тогда такое ресэмплинг? Передискретизация - это когда вы берете образец, а затем вы берете образец образца. Почему ты бы так поступил? Что ж, это позволяет вам увидеть, сколько было бы вариаций, это позволяет вам получить другое представление о взятом вами образце. Скажем, например, вы хотите, чтобы 1000 человек ответили на опрос, а у вас их всего 100. Путем умной подвыборки выборки мы можем получить новое распределение, которое мы будем немного знать о неопределенности выборки; что, как мы предполагаем, связано с неопределенностью основной совокупности.

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

В Python обычно будет логический аргумент для вашего параметра выборки в вашем коде выборки для вашей функции выборки. Этот логический флаг будет иметь значение replace = true или replace = false. Если у вас есть 100 элементов, выберите случайным образом (например, образец Бернулли) образец - запишите его и замените это значение обратно в пул образцов. Затем смойте и повторите еще 99 раз. Эта подвыборочная совокупность, скорее всего, будет другой. Они будут иметь разные пропорции от исходных 100 значений. По большей части значения будут распределены довольно равномерно, но не идеально. Затем повторите этот процесс всего 10 раз, чтобы сгенерировать 1000 образцов. Обратите внимание, что иногда могут происходить некоторые странные вещи - например, если ваши данные имеют одно уникальное значение X - возможно, но маловероятно из-за выборки с заменой, что вы можете случайным образом подвыборку 100 значений, которые включают 5 значений X, несмотря на выборку у населения только один.

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

Преимущества Bootstrap

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

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

Обычно используемые методы передискретизации включают:

  • Методы рандомизации или перестановки (например, точный тест Фишера). Методы рандомизации и перестановки были впервые предложены Фишером еще в 1911 году. Фишер полностью развил теорию в своей книге 1935 года. Масштабируемость этих методов остается ограниченной даже на современных компьютерах.
  • Перекрестная проверка: повторная выборка в складки без замены. Изначально предложенная Курцем в 1948 году перекрестная проверка сегодня широко используется при тестировании моделей машинного обучения.
  • Складной нож: оставьте один без повторной выборки. Первоначально этот метод был предложен Морисом Кенуйем в 1949 году. Складной нож был полностью разработан Джоном В. Тьюки, который дал этому методу название в 1958 году: этот метод был простым инструментом, полезным для многих целей, например, карманным ножом.
  • Bootstrap: повторная выборка с эквивалентным размером и заменой. Метод бутстрапа был впервые предложен Эфроном и Хинкли в 1978 году и в дальнейшем развит Эфроном в 1979 году.

Обзор Bootstrap

Мы вычисляем среднее значение начальной загрузки как:

Пример начальной загрузки

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

Продемонстрирую на примере:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline

Импорт базовых библиотек

# i imported the dataset from here, and called file_name
galton-families = pd.read_csv(file_name, index_col=0)
galton-families.head()

Убедитесь, что данные хорошо импортированы.

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

male = galton-families[galton-families.gender == ‘male’]
female = galton-families[galton-families.gender == ‘female’]
len(male), len(female)
(481, 453)

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

print(families.childHeight.min())
families.childHeight.max()
56.0
Out[11]: 79.0

Они варьируются от 56 дюймов до 79 дюймов. Следующее, что нужно сделать, это построить эти две гистограммы:

def plot_hist(x, p=5):
 # Plot the distribution and mark the mean
 plt.hist(x, alpha=.5)
 plt.axvline(x.mean())
 # 95% confidence interval 
 plt.axvline(np.percentile(x, p/2.), color=’red’, linewidth=3)
 plt.axvline(np.percentile(x, 100-p/2.), color=’red’, linewidth=3)
 
def plot_dists(a, b, nbins, a_label=’pop_A’, b_label=’pop_B’, p=5):
 # Create a single sequence of bins to be shared across both
 # distribution plots for visualization consistency.
 combined = pd.concat([a, b])
 breaks = np.linspace(
 combined.min(), 
 combined.max(), 
 num=nbins+1)
 plt.subplot(2, 1, 1)
 plot_hist(a)
 plt.title(a_label)
 
 plt.subplot(2, 1, 2)
 plot_hist(b)
 plt.title(b_label)
 
 plt.tight_layout()
 
plot_dists(male.childHeight, female.childHeight, 20, a_label=’sons’, b_label=’daughters’)
plt.show()

Здесь важно отметить, что сыновья и дочери во многом пересекаются. Вы можете видеть, что некоторые дочери на самом деле выше среднего сына. В целом мы видим, что дочери меньше сыновей, но так ли это?

Мой последний пост о CLT продемонстрировал очень четкие способы различения этих двух дистрибутивов. Может показаться, что это два разных дистрибутива. Однако на самом деле мы можем сказать, что распределение сыновей не сильно отличается от распределения дочерей, потому что уровень достоверности 95%, который обозначен этими красными вертикальными полосами, как бы перекрывается со средним значением.

Загрузите средства

На помощь приходит Bootstrap. Мы собираемся выполнить повторную выборку из нашего образца. Pandas имеет встроенную поддержку для создания образцов начальной загрузки из заданного фрейма данных. Я буду использовать метод sample() наших двух фреймов данных, чтобы нарисовать один образец начальной загрузки, например:

female.sample(frac=1, replace=True).head()

NB: с аргументом replace equals true вы можете получить одну и ту же строку несколько раз или некоторые строки, которые вы вообще не собираетесь отбирать.

Приведенный выше образец всех дочерей, взятых из набора данных Galton, имеет следующее среднее значение:

female.sample(frac=1, replace=True).father.mean()
69.0664459161148

Этот загруженный образец женского фрейма данных имеет средний рост 69,1 дюйма для 453 дочерей.

Теперь мы возьмем много (n_replicas) образцов начальной загрузки и построим график распределения выборочных средних, а также среднего значения выборки. В следующем коде мы загружаем 1000 подвыборок каждого исходного размера фрейма данных (481 и 453).

n_replicas = 1000
female_bootstrap_means = pd.Series([
 female.sample(frac=1, replace=True).childHeight.mean()
 for i in range(n_replicas)])
male_bootstrap_means = pd.Series([
 male.sample(frac=1, replace=True).childHeight.mean()
 for i in range(n_replicas)])
plot_dists(male_bootstrap_means, female_bootstrap_means, 
 nbins=80, a_label=’sons’, b_label=’daughters’)
plt.show()

Распределение средств начальной загрузки вообще не перекрывается! Это доказывает, что разница значительная.

Загрузите разницу в средствах

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

diffs = []
for i in range(n_replicas):
 sample = families.sample(frac=1.0, replace=True)
 male_sample_mean = sample[sample.gender == ‘male’].childHeight.mean()
 female_sample_mean = sample[sample.gender == ‘female’].childHeight.mean()
 diffs.append(male_sample_mean — female_sample_mean)
diffs = pd.Series(diffs)
plot_hist(diffs)

Распределение разницы в средних далеко от нуля. Как и прежде, мы можем сделать вывод, что средние значения двух популяций значительно различаются - что для целей этого набора данных означает, что у сыновей и дочерей действительно разные средние показатели роста. Иными словами: доверительный интервал не совпадает с нулем, и, поскольку он не совпадает с нулем, мы уверены, что разница значительна. Синяя линия показывает среднюю разницу между сыновьями и дочерьми из выборки бутстрапов около 5,1 дюйма, из которых мы на 95% уверены, что истинная разница в среднем по совокупности составляет от 4,8 до около 5,5 дюймов. Вот и ответ: в среднем сыновья на 5,5 дюймов выше дочерей.

Тем не менее, мы должны убедиться, что распределение разницы в средних значениях нормальное, как предполагает CLT. Если данные не распределяются нормально, мы не можем доверять 95% доверительному интервалу:

import statsmodels.api as sm
fig = sm.qqplot(diffs, line=’s’)
plt.title(‘Quantiles of standard Normal vs. bookstrapped mean’)
plt.show()

Точки на графике QQ Normal находятся почти на прямой линии. По-видимому, распределение разницы в средних при начальной загрузке соответствует CLT, что позволяет нам доверять статистике, полученной нами в результате повторной выборки исходного набора данных при начальной загрузке.

Заключение

Результаты этого анализа продемонстрировали, насколько полезна повторная выборка инструмента для специалиста по данным или инженера по машинному обучению. Bootstrap - не единственный метод передискретизации, их несколько, но IMO он лучше всего подходит для производственных моделей, потому что он делает минимальные предположения о родительском дистрибутиве и хорошо реализован во многих языках и пакетах. Данные бесполезны, если они не обрабатываются и не анализируются должным образом в правильном контексте. Как сказал Марк Твен: «Есть ложь, проклятая ложь и статистика».

Продолжайте со мной, поскольку я использую эти концепции в статистике Байеса и использовании бутстрапа с моделями регрессии.

Найди меня в Linkedin

Физик и ученый - Доступны новые возможности | SaaS | Спорт | Стартапы | Увеличение масштаба