Логистическая регрессия — классификация простыми словами
Что такое логистическая регрессия
Логистическая регрессия — модель для задач классификации: предсказать, произойдёт событие или нет. Купит ли пользователь подписку? Кликнет ли по баннеру? Уйдёт ли в отток? Несмотря на слово «регрессия» в названии, это именно классификация — модель предсказывает вероятность принадлежности к классу.
В отличие от линейной регрессии, которая предсказывает числовое значение (выручка, время на сайте), логистическая регрессия предсказывает вероятность от 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 |
Подробнее про линейную регрессию и проверку гипотез.
Допущения и ограничения
Логистическая регрессия предполагает:
- Линейность в log-odds — связь между признаками и логарифмом шансов линейна. Нелинейные зависимости нужно обрабатывать (полиномиальные признаки, биннинг).
- Независимость наблюдений — строки не зависят друг от друга.
- Отсутствие сильной мультиколлинеарности — признаки не сильно коррелируют между собой. Проверяйте через корреляцию.
- Достаточный размер выборки — минимум 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+ вопросов, которые спрашивают на собеседованиях аналитика. Бесплатно.