Модель биномиальной регрессии: все, что вам нужно знать

Плюс пошаговое руководство с использованием Python и statsmodels

Эта статья разделена на два раздела:

  1. РАЗДЕЛ 1. Введение в модель биномиальной регрессии. Мы познакомимся с моделью биномиальной регрессии, посмотрим, как она вписывается в семейство обобщенных линейных моделей и почему ее можно использовать для прогнозирования шансов. увидеть случайное событие.
  2. РАЗДЕЛ 2. Использование модели биномиальной регрессии. Мы обучим модель биномиальной регрессии на реальном наборе данных Titanic, используя Python и statsmodels библиотека. Мы увидим, почему модель биномиальной регрессии является правильной моделью для прогнозирования шансов на выживание на Титанике. Мы также узнаем, как интерпретировать коэффициенты регрессии подобранной модели - необходимый навык, который необходимо изучить, что в случае набора данных Титаника дает удивительные результаты.

СЕКЦИЯ 1

Введение в модель биномиальной регрессии

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

В модели биномиальной регрессии зависимая переменная y является дискретной случайной величиной, которая принимает такие значения, как 0, 1, 5, 67 и т. Д. Каждое значение представляет количество «успехи» наблюдались в m испытаниях. Таким образом, y следует биномиальному распределению.

Следующее уравнение дает вероятность наблюдения k успехов в m независимых испытаниях Бернулли. Каждое испытание Бернулли имеет вероятность успеха = π и вероятность неудачи = (1- π ). Подбрасывание монеты - простейший пример испытания Бернулли, в котором π = (1-π) = 0,5.

Термин в вертикальных скобках (m k) обозначает «комбинацию» и читается как «m choose k». Он дает вам множество различных способов выбрать k результатов из набора m возможных результатов.

В регрессионной модели мы будем предполагать, что зависимая переменная y зависит от матрицы размера (n X p) регрессионных переменных X. Строка i в X может быть обозначена как x_i, которая представляет собой вектор размер (1 X p). Соответствует i-му исходу y_i.

Обычно выражается вероятность того, что y_i принимает определенное значение k как условно, если регрессионные переменные X принимают значение x_i . В форме обозначений это может быть записано как Pr (y_i = k | X = x_i) и может следует читать как вероятность того, что y_i будет k, учитывая, что X равно x_i .

Теперь мы можем сформулировать распределение вероятностей биномиально распределенного y в контексте регрессии y на X как :

  • На L.H.S. упомянутого выше уравнения PMF, мы заменим безусловную вероятность Pr (y = k) на условную вероятность Pr (y_i = k | X = x_i).
  • В правой части мы заменим безусловную вероятность π достижения успеха условной вероятностью π_i, где π_i - вероятность наблюдения успех для i-й строки набора данных, т. е. когда вектор регрессии X = x_i.

С этими двумя заменами PMF биномиально распределенного y становится следующим:

В приведенном выше уравнении вероятность достижения успеха π_i для некоторого X = x_i обычно выражается как некоторая функция g (.) От x_i . В символическом выражении:

Приведенный выше набор концепций можно аккуратно визуализировать с помощью одной следующей иллюстрации:

На приведенном выше графике y_1, y_2, y_3,… y_10 - десять биномиально распределенных случайных величин. Они также происходят с составляющими зависимой переменной y, которая представляет собой матрицу (10 X 1), как показано ниже:
y =
[[y_1],
[y_2],
[y_3],
…,
[y_10]].
Соответствующая матрица переменных регрессии X в этом случае также является матрицей 10 X 1, поскольку задействована только одна переменная регрессии:
X =
[[1],
[2],
[3],
[4],
…,
[10]].

Поскольку y - случайная величина с разбросом m, график показывает, как для каждого значения X = x_i, y может принимать любое биномиально распределенное значение вокруг своего ожидаемого значения µ_i, где µ_i = m * π_i и π_i, как мы видели ранее, это некоторая функция g (.) от x_i . Таким образом, ожидаемое значение y_i, равное µ_i, может быть выражено как некоторая функция от x_i.

Модель биномиальной регрессии является частью семейства G обобщенных L моделей M. GLM используются для моделирования взаимосвязи между ожидаемым значением переменной ответа y и линейной комбинацией вектор независимых переменных X.

Связь между E (y | X) и X выражается посредством подходящей функции ссылки, как показано:

В приведенном выше уравнении g (.) - это функция ссылки, которая связывает условное ожидание y на X с линейной комбинацией переменных регрессии x_i. X - матрица регрессионных переменных размером (n X p), где n = строк и p = переменные регрессии в каждой строке, а X = x_i является i-й строкой в ​​этой матрица размера (1 X p) и β, являющаяся (p X 1) вектор коэффициентов регрессии.

Когда y биномиально распределено, нас интересует связь между условным математическим ожиданием вероятности π одного испытания Бернулли на конкретном значении X = x_i, то есть E (π = π_i | X = x_i ), или кратко, π_i | x_i. Итак, уравнение GLM для модели биномиальной регрессии можно записать следующим образом:

В случае модели биномиальной регрессии функция связи g (.) принимает одну из следующих четырех форм (мы перестанем упоминать условное обозначение | X = x_i в каждый для простоты, но предположим, что он есть):

Функция логистической связи (логит), также известная как функция логарифма шансов:

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

Функция пробит-ссылки:

Функция связи пробит (сокращение от «единица вероятности») используется для моделирования возникновения события, имеющего двоичный результат «Да / Нет». Эта функция связи выражается как функция, обратная кумулятивной функции распределения Φ (.) Стандартного нормального распределения N (0,1).

Книга Колина Кэмерона и Правина К. Триведи Регрессионный анализ данных подсчета представляет собой отличное введение в функцию Probit link в разделе 3.6: Упорядоченные и другие модели с дискретным выбором . Там вы также найдете очень ясный вывод о том, почему функция связи модели Пробита оказывается обратной функцией CDF Φ (.) Нормального распределения.

Функция журнала-журнала:

Функция log-log полезна для моделирования пуассоновских процессов подсчета, в которых параметр распределения вероятностей (который часто содержит среднее значение) находится в экспоненте формулы распределения вероятностей, и параметр также выражается как показатель степени линейной комбинации переменных регрессии. Таким образом, он имеет формат двойной экспоненты: exp (exp (- β.x_i), и, следовательно, необходимы две последовательные операции логарифмирования, чтобы получить β .x_i до "уровня земли".

Дополнительная функция ссылки журнал-журнал:

Дополнительный журнал называется так, потому что он работает с (1-π_i), т.е. вероятность отказа вместо π_i.

В этой статье мы будем использовать функцию logistic, также известную как logit, также известная как log-odds, для построения нашей модели биномиальной регрессии. Здесь это еще раз, на этот раз выраженное несколько иначе. На R.H.S я заменил суммирование векторным обозначением, выделенным жирным шрифтом:

РАЗДЕЛ 2

Использование модели биномиальной регрессии для прогнозирования шансов на выживание на Титанике

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

Вот ссылка на исходный набор данных.

Набор данных Титаника содержит информацию о 887 из 2229 душ на борту злополучного океанского лайнера Титаник. Запись каждого пассажира содержит следующие атрибуты:

  • Имя
  • Пассажирский класс (1/2/3)
  • Секс
  • Возраст
  • Сопровождали ли пассажира братья и сестры, родители или дети
  • Плата за проезд, которую они заплатили, и, самое главное,
  • Выжили ли они (1 = выжили, 0 = умерли)

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

import pandas as pd
df = pd.read_csv('titanic_dataset.csv', header=0)
df.head(10)

Это распечатает следующий вывод:

Мы сосредоточим внимание на четырех ключевых атрибутах:

  • Pclass (класс пассажира)
  • Возраст
  • Секс
  • Выжили (выжили ли они)

Давайте отбросим остальные столбцы из фрейма данных:

#Drop the columns that our model will not use
df = df.drop(['Name','Siblings/Spouses Aboard', 'Parents/Children Aboard', 'Fare'], axis=1)
#print the top 10 rows
df.head(10)

Это распечатает следующее:

Обоснование модели биномиальной регрессии

Мы предположим, что во время крушения Титаника сочетание [Класс, возраст, пол] сильно повлияло на шансы на выживание пассажира.

Обратите внимание, что столбец «Выжившие» содержит [0, 1] случайную величину Бернулли.

Итак, можно ли сказать следующее?

Переменные регрессии X = [Pclass, Age, Sex], и,

Зависимая переменная - БУЛЕВА ПЕРЕМЕННАЯ y = [выжила]

Нет мы не можем. Посмотрим, почему ...

Почему бы не использовать модель пробит-регрессии?

Поскольку y является логической переменной, это может показаться простым случаем использования модели пробит-регрессии. Но обратите внимание: если кому-то посчастливилось оказаться на таком корабле, как Титаник, то, что нужно знать, - это не ответ на двоичный вопрос: выживу ли я со 100% уверенностью или умру. со 100% уверенностью? Вместо этого более полезно знать шансы на выживание.

Например, если вы 22-летняя женщина в каюте второго класса корабля, вам нужно знать, равны ли ваши шансы на выживание 1 из 10, 1 из 4, 1 из 50 и т. Д.

Но из-за того, как организован набор данных "Титаника", переменная ответа сохранилась имеет формат "да / нет", т.е. 1/0 формата. Другими словами, выживший имеет распределение Бернулли, то есть:

Pr (выжил = 0) = π ,
Pr (выжил = 1) = (1 -
π )
Где π - некоторая вероятность от 0 до 1.

Мы хотим, чтобы y выражало шансы, т. Е. Соотношение успехов (выживаемости) и неудач (смертей) в m независимых, идентичные испытания.

Другими словами, мы хотим, чтобы y имел логарифмическое распределение шансов.

И поэтому вместо использования модели регрессии Probit типа True или False, 1 или 0, мы хотим создать модель биномиальной регрессии, в которой переменная ответа имеет биномиальное распределение, а функция связи - Logit ie логарифмическая функция шансов.

Функция связи позволит нам связать шансы на выживание с линейной комбинацией регрессионных переменных X = [Pclass, Age & Sex] плюс перехват, как показано ниже:

Как преобразовать y из переменной Бернулли в биномиальную переменную:

Чтобы преобразовать переменную ответа y из Бернулли в биномиальную, мы должны сгруппировать вместе строки набора данных, которые имеют одинаковую комбинацию X значения [Класс, Возраст и Пол]. Прежде чем мы приступим к этому, есть одна маленькая вещь, о которой нам нужно позаботиться, и это ведение атрибута Age. Видите ли, возраст, как он выражается в наборе данных, - это непрерывная переменная, которая колеблется от 0,42 до 80.

Вряд ли кажется правдоподобным, что у младенцев 0,42 года и 0,67 года соответственно были бы разные шансы на выживание. Аналогичная логика верна для молодых людей в возрасте 26, 27, 28, 29 и т. Д. Лет, и так далее для других случаев.

Нам нужно сделать данные о возрасте более детализированными, чтобы ограничить количество групп. Давайте сделаем это, разделив общий возрастной диапазон на ячейки размером 5 лет и обозначив каждую ячейку следующим образом:
(0, 5] → 5
(5, 10] → 10
(10 , 15] → 15 и т. Д.
Метод pandas.cut () очень аккуратно выполняет сегментирование:

#define the bins
age_range_bins=[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80]
#define the label for each bin. Num labels = Num bins - 1
age_range_labels=[5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80]
#Cut up the age range into multiple bins and stuff them into a new Age_Range column
df['Age_Range']=pd.cut(df['Age'],age_range_bins,labels=age_range_labels)
#Print the output
df.head(10)

Получаем следующий вывод. Обратите внимание на новый столбец Age_Range, который мы добавили:

Давайте отбросим столбец Age, поскольку вместо этого мы будем использовать Age_Range:

#Drop the age column
df = df.drop(['Age'],axis=1)

Теперь, когда у нас есть независимые переменные, настроенные так, как мы хотим, давайте приступим к группированию выборок по комбинации [Pclass, Sex, Age_Range]. Мы будем использовать метод Pandas groupby ().

#Group by ['Pclass', 'Sex', 'Age_Range'] 
groups = df.groupby(['Pclass', 'Sex', 'Age_Range'])
#Get the counts for each group. This is the number of passengers in each group who have survived
df_grouped_counts = groups.count()
#Get the size (number of passengers) in each group
df_grouped_survived = groups.sum()

Объедините количество выживших и количество пассажиров для каждой группы в каждый сгруппированный фрейм данных. (Через минуту мы увидим, как это нам поможет):

df_grouped_counts.to_csv('df_grouped_counts.csv')
df_grouped_counts_1 = pd.read_csv('df_grouped_counts.csv', header=0)

df_grouped_survived.to_csv('df_grouped_survived.csv')
df_grouped_survived_1 = pd.read_csv('df_grouped_survived.csv', header=0)

Наконец, давайте создадим новый фрейм данных, который содержит:

  • Сгруппированные столбцы Pclass, Sex, Age_Range,
  • Соответствующее количество выживших в каждой группе,
  • Общее количество пассажиров в каждой группе, т.е. размер группы, и,
  • Количество погибших пассажиров в каждой группе.
#Create a new Data Frame
df_grouped = pd.DataFrame()
#Copy over the Pclass, Sex and Age Range columns
df_grouped['Pclass'] = df_grouped_counts_1['Pclass']
df_grouped['Sex'] = df_grouped_counts_1['Sex']
df_grouped['Age_Range'] = df_grouped_counts_1['Age_Range']
#Copy over the num passengers from the counts grouped Data Frame
df_grouped['Total'] = df_grouped_counts_1['Survived']
#Copy over the num survivors from the summation grouped Data Frame
df_grouped['Survived'] = df_grouped_survived_1['Survived']
#Add a column containing the number who died
df_grouped[’Died’] = df_grouped[’Total’] - df_grouped[’Survived’]

Распечатаем первые 20 строк сгруппированного набора данных:

df_grouped.head(20)

Давайте посмотрим, о чем нам говорит сгруппированный набор данных. Для иллюстрации я выделил строки 9, 14 и 19:

В строке № 9 мы обнаруживаем, что было 10 женщин в возрастном диапазоне (45, 50) с билетом в первый класс, из которых выжили 9. Таким образом, шансы на выживание для женщины в этой группе были довольно хорошими (9 к 1). , особенно если она занимала каюту первого класса.

В строке №19 мы видим, что было 4 пассажира мужского пола в возрасте от 15 до 20 лет, из которых выжил только один.

В строке № 14 мы видим, что в салоне первого класса не было пассажиров-женщин в возрасте (70–75 лет). Вот почему мы видим NaN в сводных столбцах для группы: [1, женщина, 75] .

Давайте удалим все такие строки NaN из фрейма данных:

df_grouped = df_grouped.dropna()

Постройте модель биномиальной регрессии, используя Python и statsmodels

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

df_grouped=df_grouped.replace(to_replace={'female': 1, 'male': 2})

Постройте модель биномиальной регрессии, используя Python и statsmodels

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

Давайте выделим наборы данных для обучения и тестирования:

import numpy as np
#Separate out the training and test sets
mask = np.random.rand(len(df_grouped)) < 0.85
df_train = df_grouped[mask]
df_test = df_grouped[~mask]

Давайте создадим формулу регрессионной модели, используя синтаксис patsy. В приведенной ниже формуле мы говорим, что зависимая переменная представляет собой матрицу, состоящую из Выживших и Умерших столбцы фрейма данных, а переменными регрессии являются Pclass, Age_Range и Sex .

#Construct the Binomial model's regression formula in Patsy syntax.
formula = 'Survived + Died ~ Pclass + Age_Range + Sex'

Используя эту формулу, давайте выделим матрицы проектирования X и y из кадров данных обучения и тестирования, которые мы создано минуту назад:

from patsy import dmatrices
#Carve out the training matrices from the training data frame using the regression formula
y_train, X_train = dmatrices(formula, df_train, return_type='dataframe')
#Carve out the testing matrices from the testing data frame using the regression formula
y_test, X_test = dmatrices(formula, df_test, return_type='dataframe')

Затем мы загружаем X_train и y_train в экземпляр класса модели биномиальной регрессии и обучаем модель:

import statsmodels.api as sm
binom_model = sm.GLM(y_train, X_train, family=sm.families.Binomial())
binom_model_results = binom_model.fit()

Распечатаем сводку подогнанной модели:

print(binom_model_results.summary())

Это распечатает следующее:

Как интерпретировать результаты регрессии:

В приведенном выше выводе statsmodels сообщает нам, что он обучил Обобщенную линейную модель типа Биномиальный, потому что, ну, мы просили его об этом, что он использовал функция логарифмических коэффициентов, и в ней использовался алгоритм Итеративный пересмотр наименьших квадратов (IRLS) для обучения нашей модели .

Statsmodels сообщает, что наша модель имеет 3 степени свободы: Sex, Pclass и Age_Range,, что кажется примерно правильным:

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

Давайте посмотрим на коэффициенты подобранные:

Все коэффициенты регрессии статистически значимы с погрешностью 0,1%, на что указывают значения p, которые все равны <0,001:

Давайте посмотрим, что говорит нам каждый коэффициент.

Как интерпретировать коэффициенты модели:

Для функции логит-связи подогнанные коэффициенты можно интерпретировать следующим образом:

Age_Range: коэффициент -0,0446. Обратите внимание на отрицательное значение. Значение этого коэффициента можно интерпретировать следующим образом: при сохранении всех остальных переменных постоянными, для каждой единицы увеличения возраста пассажира, шансы их выживания уменьшаются на коэффициент = exp (-0,0446) = 0,9564. т.е. на каждую единицу увеличения возраста пассажира необходимо умножать их шансы на выживание на 0,9564, тем самым каждый раз снижая шансы на выживание на определенную величину. Например, если 12-летний мужчина, находящийся в каюте 2-го класса, имел известные шансы на выживание во время катастрофы 8: 9, то 22-летний мужчина, находящийся в каюте 2-го класса, имел шансы на выживание (8/9). ) * 0,9564¹⁰ = приблизительно 6:10.

Pclass: Коэффициент для Pclass равен -1.2008. Снова обратите внимание на отрицательный знак. Понижение класса салона пассажира еще более резко повлияло на его шансы выжить на борту «Титаника». Переменная Pclass кодируется следующим образом: каюта первого класса = 1, каюта второго класса = 2 и каюта третьего класса = 3. Таким образом, для каждого повышения юнита в классе салона, т. е. при понижении от 1-го класса до 2-го класса до 3-го, шансы на выживание, сохранение возраста и пола константа, уменьшите в ехр (-1.2008) = 0,30! т.е. за каждое понижение рейтинга единицы ваши шансы на выживание умножаются на 0,30. Например, если 30-летний мужчина, находящийся в каюте 1-го класса, имел шансы на выживание на Титанике 7: 9, просто понижая его на один класс до класса 2, его шансы на выживание уменьшались до (7/9) * 0,3. = приблизительно 1: 4. Снижение класса до 3-го уменьшило шансы до (7/9) * 0,3 * 0,3 = 7: 100.

Пол: Наконец, обратите внимание на очень большой отрицательный коэффициент -2,6526 для переменной «Пол». На борту тонущего Титаника у пассажиров-мужчин были весьма мизерные шансы на выживание по сравнению с пассажирами-женщинами. При постоянных значениях Pclass и Age шансы на выживание пассажира мужского пола составляли только exp (- 2,6526) = 7% от шансов на выживание пассажира женского пола.

Прогноз

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

df_test['Pcnt_Survived'] = df_test['Survived']/df_test['Total']

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

predicted_survival_rate = binom_model_results.predict(X_test)

Построим график фактической выживаемости по сравнению с прогнозируемой:

import matplotlib.pyplot as plt
plt.xlabel('Actual Survival Rate')
plt.ylabel('Predicted Survival Rate')
plt.scatter(df_test['Pcnt_Survived'], predicted_survival_rate, color = 'blue')
plt.show()

Как видите, соответствие становится неприемлемым, когда коэффициент выживаемости приближается к верхнему пределу диапазона, то есть 1,0. В значительной степени точность прогноза определяется размером выборки, то есть размером каждой группы пассажиров, сгруппированных по кортежу [Pclass, Sex, Age Range]. Для некоторых групп в обучающей выборке размер группы слишком мал, чтобы модель могла обучать осмысленным образом. Понятно, что для таких комбинаций в наборе тестовых данных точность будет низкой.

Вот ссылка на полный исходный код:

Вот ссылка на данные Титаника, использованная в этой статье.

Резюме

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

дальнейшее чтение



McCullough, P., Nelder, J. A. (FRS). Generalized Linear Models. 2nd Ed. (1989) Chapman & Hall

Спасибо за внимание! Я пишу на темы в области науки о данных. Если вам понравилась эта статья, подпишитесь на меня в Sachin Date, чтобы получить информацию, идеи и советы по программированию о том, как заниматься наукой о данных с помощью Python.