Введение

В этом посте мы рассмотрим и поймем один из основных методов классификации в машинном обучении — логистическую регрессию.

Первоначально опубликовано на https://machinelearningmind.com 25 ноября 2019 г.

  • Бинарная логистическая регрессия.У нее есть только два возможных результата. Пример - да или нет
  • Полиномиальная логистическая регрессия: имеет три или более номинальных категорий. Пример- кошка, собака, слон.
  • Порядковая логистическая регрессия. Имеет три или более порядковых категорий, порядковый номер означает, что категории будут в порядке. Пример — рейтинги пользователей (1–5).

А пока давайте сосредоточимся на бинарной логистической регрессии.

Логистическая регрессия

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

Возьмем пример прогнозирования наличия у пациента 10-летнего риска развития ишемической болезни сердца (ИБС).

Возможными предикторами могут быть частота сердечных сокращений пациента, АД, курение/некурение и т. д. Мы хотим предсказать, будет ли у пациента 10-летний риск развития ишемической болезни сердца (ИБС) в будущем или нет. У нас может быть граница решения, например: 0,5, такая, что P(Y) > 0,5, классифицирует пациента как подверженного риску и P(Y) ‹ 0,5, классифицирует пациента как не подверженного риску.

Таким образом, в основном, если модель должна успешно предсказать это, нам нужен индивидуальный предиктор ( X), чтобы иметь постоянное влияние на вероятность пациента с риском ИБС [ P(Y)]. Но влияние X на вероятность Y имеет разные значения в зависимости от значения X.

Именно здесь на сцену выходит Шансы, поскольку отношение шансов представляет постоянное влияние предиктора X на вероятность того, что произойдет Y.

Шансы

Коэффициенты говорят вам о вероятности исхода. Для тех, кто не знаком с понятием шансов, вот пример.

Допустим, Y представляет пациентов, находящихся в группе риска, а Z представляет пациентов, не представляющих риска, и кто-то говорит, что вероятность события Y равна 1/3. Что это значит?

Из 4 пациентов 1 будет в группе риска, а 3 не будут в группе риска.
Таким образом, вероятность попадания пациентов в группу риска составляет 1:3.

В этом разница между Вероятностью и Шансами. Вероятность в этом случае будет P(Y) = 1/(3+1) = 1/4.
Вероятность учитывает все исходы (3 без риска + 1 с риском).

Вероятность и шансы связаны математически.

Если P(Y) = вероятность того, что пациент подвержен риску , то 1- P(Y) даст вероятность того, что пациент не подвержен риску

Логистическая регрессия использует сигмовидную функцию для прогнозирования вероятности.

Уравнение для сигмовидной функции: 1/(1+ e^-z), где

Теперь давайте получим log(Odds), зная P(Y) = 1/(1+ e^-z)

Здесь x 1 , x 2 .. представляют предикторы, а β 1 , β 2 … представляют постоянный эффект предикторов, о которых мы говорили ранее.

Функция стоимости

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

Здесь мы не можем использовать функцию стоимости линейной регрессии (MSE), поскольку h θ(x) [сигмоидальная функция] является нелинейной функцией, использование MSE приведет к невыпуклой функции со многими локальными минимумами. Градиентный спуск не сможет успешно найти глобальный минимум, если присутствует много локальных минимумов.

Вышеуказанные функции, объединенные в одну, дают нам окончательную функцию стоимости.

Логистическая регрессия с использованием sklearn

В sklearn реализована логистическая регрессия, которая позволяет с нашей стороны просто вызвать функции fit() и predict() для выполнения классификации.

Возьмем в качестве примера набор данных пациентов, которые имеют риск развития ИБС (ишемической болезни сердца) через 10 лет.

df = pd.read_csv("framingham.csv") 
df.info()

print("Percentage of People with heart disease: {0:.2f} %".format(100*df.TenYearCHD.value_counts()[1]/df.TenYearCHD.count()))

Результаты: процент людей с сердечными заболеваниями: 15,23 %.

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

# Creating new dataframe with statistically significant columns new_df = df[['male','age','cigsPerDay','prevalentHyp','diabetes','sysBP','diaBP','BMI','heartRate','ed__2.0','ed__3.0','ed__4.0', 'TenYearCHD']] 
# Splitting into predictors and label 
X = new_df.drop(['TenYearCHD'], axis=1) 
Y = new_df.TenYearCHD 
# Splitting dataset into train and test in the ratio 7:3 x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.3,random_state=5)

Теперь все готово для применения функций логистической регрессии sklearn.

logreg = LogisticRegression() 
logreg.fit(x_train,y_train) 
y_pred = logreg.predict(x_test)

y_pred содержит все предсказанные значения для зависимой переменной (TenYearCHD). Теперь давайте проверим точность модели.

sklearn.metrics.accuracy_score(y_test,y_pred)

Вывод: 0,860655737704918

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

Полный блокнот для приведенного выше примера можно найти на сайтах Kaggle и Github.