Модель биномиальной регрессии: все, что вам нужно знать
Плюс пошаговое руководство с использованием Python и statsmodels
Эта статья разделена на два раздела:
- РАЗДЕЛ 1. Введение в модель биномиальной регрессии. Мы познакомимся с моделью биномиальной регрессии, посмотрим, как она вписывается в семейство обобщенных линейных моделей и почему ее можно использовать для прогнозирования шансов. увидеть случайное событие.
- РАЗДЕЛ 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.