Логистическая регрессия — классификация простыми словами

Что такое логистическая регрессия

Логистическая регрессия — модель для задач классификации: предсказать, произойдёт событие или нет. Купит ли пользователь подписку? Кликнет ли по баннеру? Уйдёт ли в отток? Несмотря на слово «регрессия» в названии, это именно классификация — модель предсказывает вероятность принадлежности к классу.

В отличие от линейной регрессии, которая предсказывает числовое значение (выручка, время на сайте), логистическая регрессия предсказывает вероятность от 0 до 1. На собеседованиях аналитиков это одна из самых частых тем по ML.

Зачем нужна сигмоидная функция

Линейная регрессия считает y = b0 + b1*x1 + b2*x2 + .... Проблема: результат может быть любым числом — и -5, и +100. А нам нужна вероятность от 0 до 1.

Решение — пропустить линейную комбинацию через сигмоидную (логистическую) функцию:

σ(z) = 1 / (1 + e^(-z))

где z = b0 + b1*x1 + b2*x2 + ...

Сигмоида превращает любое число в значение от 0 до 1:

  • При z → +∞ — σ(z) → 1
  • При z → -∞ — σ(z) → 0
  • При z = 0 — σ(z) = 0.5
import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

sigmoid(0)    # 0.5
sigmoid(2)    # 0.88
sigmoid(-3)   # 0.047

Если σ(z) > 0.5 — относим к классу 1 (купит), если < 0.5 — к классу 0 (не купит). Порог 0.5 — не обязательный, его можно настраивать.

Odds и log-odds

Чтобы понять коэффициенты модели, нужны два понятия:

Odds (шансы) — отношение вероятности события к вероятности не-события:

odds = p / (1 - p)

Если вероятность покупки 0.8, то odds = 0.8 / 0.2 = 4. Шансы «за» в 4 раза выше, чем «против».

Log-odds (логарифм шансов) — то, что модель предсказывает напрямую:

log(odds) = b0 + b1*x1 + b2*x2 + ...

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

Интерпретация коэффициентов

Коэффициент b1 показывает: при увеличении x1 на 1 единицу log-odds меняется на b1.

В терминах odds: exp(b1) — во сколько раз меняются шансы при увеличении x1 на 1.

# Пример: предсказываем покупку подписки
# b1 = 0.7 (коэффициент при количестве сессий)
import math
math.exp(0.7)  # ≈ 2.01

Шансы покупки увеличиваются в ~2 раза с каждой дополнительной сессией. Это делает логистическую регрессию интерпретируемой — каждый коэффициент объясним.

Пример на sklearn

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
    accuracy_score, precision_score,
    recall_score, roc_auc_score,
    classification_report,
)

# Данные: предсказываем, купит ли пользователь подписку
data = pd.DataFrame({
    "sessions": [1, 3, 5, 2, 8, 12, 1, 4, 7, 15, 2, 6],
    "questions_answered": [5, 20, 45, 10, 80, 120, 3, 30, 60, 150, 8, 50],
    "days_since_reg": [1, 3, 7, 2, 14, 30, 1, 5, 10, 45, 2, 8],
    "purchased": [0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1],
})

X = data[["sessions", "questions_answered", "days_since_reg"]]
y = data["purchased"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

model = LogisticRegression()
model.fit(X_train, y_train)

# Предсказания
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]  # вероятности класса 1

# Метрики
print(f"Accuracy:  {accuracy_score(y_test, y_pred):.2f}")
print(f"Precision: {precision_score(y_test, y_pred):.2f}")
print(f"Recall:    {recall_score(y_test, y_pred):.2f}")
print(f"AUC-ROC:   {roc_auc_score(y_test, y_prob):.2f}")

# Коэффициенты
for name, coef in zip(X.columns, model.coef_[0]):
    print(f"{name}: coef={coef:.3f}, odds_ratio={np.exp(coef):.3f}")

Метрики классификации

На собеседованиях часто просят объяснить разницу между метриками.

Метрика Формула Когда важна
Accuracy (TP + TN) / All Сбалансированные классы
Precision TP / (TP + FP) Цена ложного срабатывания высока
Recall TP / (TP + FN) Цена пропуска высока
F1 2 * P * R / (P + R) Компромисс P и R
AUC-ROC Площадь под ROC-кривой Общее качество ранжирования

TP — истинно положительные, FP — ложно положительные, FN — ложно отрицательные, TN — истинно отрицательные.

Пример: фильтр фрода в платежах.

  • Высокий Precision — если система сказала «фрод», то это правда фрод (мало ложных блокировок).
  • Высокий Recall — система ловит большинство фрод-транзакций (мало пропущенных).

AUC-ROC показывает, насколько хорошо модель разделяет классы при разных порогах. AUC = 0.5 — случайный уровень, AUC = 1.0 — идеальное разделение. Значение выше 0.7 обычно считается приемлемым, выше 0.8 — хорошим.

Отличие от линейной регрессии

Линейная регрессия Логистическая регрессия
Задача Предсказание числа Предсказание класса (вероятности)
Выход Любое число (-∞, +∞) Вероятность [0, 1]
Функция y = b0 + b1*x p = σ(b0 + b1*x)
Функция потерь MSE Log-loss (бинарная кросс-энтропия)
Метрики R², MAE, RMSE Accuracy, Precision, Recall, AUC

Подробнее про линейную регрессию и проверку гипотез.

Допущения и ограничения

Логистическая регрессия предполагает:

  1. Линейность в log-odds — связь между признаками и логарифмом шансов линейна. Нелинейные зависимости нужно обрабатывать (полиномиальные признаки, биннинг).
  2. Независимость наблюдений — строки не зависят друг от друга.
  3. Отсутствие сильной мультиколлинеарности — признаки не сильно коррелируют между собой. Проверяйте через корреляцию.
  4. Достаточный размер выборки — минимум 10–20 наблюдений на признак.

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

Вопросы с собеседований

Что предсказывает логистическая регрессия? — Вероятность принадлежности к положительному классу. Линейная комбинация признаков пропускается через сигмоидную функцию σ(z) = 1/(1+e^(-z)), которая преобразует произвольное число в диапазон [0, 1].

Чем precision отличается от recall? — Precision — доля правильных среди предсказанных положительных (TP / (TP + FP)). Recall — доля найденных среди всех реально положительных (TP / (TP + FN)). Precision отвечает за точность, recall — за полноту. Обычно улучшение одного ухудшает другое.

Когда accuracy — плохая метрика? — При несбалансированных классах. Если 95% пользователей не покупают подписку, модель «никто не купит» даёт accuracy 95%, но бесполезна. В таких случаях смотрят на precision, recall, F1 и AUC-ROC.

Как интерпретировать коэффициенты логистической регрессии? — Коэффициент b показывает изменение log-odds при увеличении признака на 1. exp(b) — odds ratio: во сколько раз меняются шансы. Если exp(b) = 2.0, шансы положительного исхода удваиваются при увеличении признака на единицу.

Можно ли использовать логистическую регрессию для многоклассовой задачи? — Да. One-vs-Rest (OvR): обучаем K бинарных классификаторов, каждый отделяет один класс от остальных. Multinomial: одна модель с softmax-функцией вместо сигмоиды. В sklearn: LogisticRegression(multi_class='multinomial').

FAQ

Зачем аналитику знать логистическую регрессию?

Логистическая регрессия — базовая модель для задач классификации. Аналитик использует её для скоринга (предсказание оттока, вероятность покупки), A/B-тестов с бинарными метриками и интерпретации влияния факторов. На собеседованиях это один из самых частых вопросов по ML — спрашивают даже на junior-позициях. Понимание метрик (precision, recall, AUC) важнее, чем умение обучать модель. Подробнее про p-value и статистическую значимость.

Чем логистическая регрессия лучше деревьев решений?

Логистическая регрессия интерпретируема — каждый коэффициент имеет понятный смысл (odds ratio). Деревья тоже интерпретируемы, но иначе. Логрег лучше, когда: данных мало, зависимость близка к линейной, нужна интерпретация коэффициентов. Деревья лучше при нелинейных зависимостях и взаимодействиях признаков. На практике часто начинают с логрега как baseline.

Что такое регуляризация в логистической регрессии?

Регуляризация штрафует большие коэффициенты, чтобы модель не переобучалась. L1 (Lasso) обнуляет незначимые коэффициенты — полезна для отбора признаков. L2 (Ridge) уменьшает все коэффициенты — используется по умолчанию в sklearn. Параметр C в LogisticRegression(C=1.0) — обратная сила регуляризации: меньше C — сильнее штраф.


Потренируйте вопросы по статистике и ML на реальных задачах — откройте тренажёр. 1500+ вопросов, которые спрашивают на собеседованиях аналитика. Бесплатно.