Логистическая регрессия в Machine Learning: просто о важной модели

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

Содержание Следующие статьи
Содержание Логистическая регрессия в Machine Learning: просто о важной модели
  1. Почему логистическая регрессия пережила десятки более модных моделей
  2. Как из линейной части появляется вероятность
  3. Где логистическая регрессия особенно полезна
  4. Что у нее чаще всего ломают новички

Почему логистическая регрессия пережила десятки более модных моделей

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

Главная ее сила — прозрачность. Ты можешь посмотреть на коэффициенты, понять, какой признак двигает вероятность вверх или вниз, и увидеть, как решение зависит от порога. Это делает модель особенно ценной там, где нужна объяснимость.

Как из линейной части появляется вероятность

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

Формула: раздел математики — математический анализ и вероятность
$$ P(y=1 \mid x) = \frac{1}{1 + e^{-(w^T x + b)}} $$
Что означает эта формула

Линейная часть модели сначала собирает общий score из признаков, а сигмоида превращает его в вероятность положительного класса.

Что означает каждый символ
  • P(y=1 \mid x) — вероятность положительного класса для объекта x
  • w — вектор весов признаков
  • x — вектор признаков объекта
  • b — свободный член модели
  • e — основание натурального логарифма

Геометрически логистическая регрессия строит разделяющую гиперплоскость. По одну сторону от нее вероятность стремится к нулю, по другую — к единице. Чем дальше объект от границы в подходящем направлении, тем увереннее модель.

Где логистическая регрессия особенно полезна

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

Что у нее чаще всего ломают новички

Во-первых, забывают о масштабе признаков. Логистическая регрессия намного лучше ведет себя, когда числовые признаки приведены к сопоставимому масштабу. Во-вторых, недооценивают роль порога: модель выдает вероятность, а не готовую «истину». В-третьих, смотрят только на accuracy и пропускают ситуацию, где нужно контролировать recall или precision.

example.pyPython
import pandas as pd  # используем таблицу как привычный объект для признаков
from sklearn.pipeline import Pipeline  # собираем preprocessing и модель в единый контур
from sklearn.preprocessing import StandardScaler  # нормализуем числовые признаки перед моделью
from sklearn.linear_model import LogisticRegression  # берем интерпретируемую baseline-модель

data = pd.DataFrame({  # создаем маленький пример пользовательских наблюдений
    'sessions': [1, 2, 3, 4, 5, 6, 7, 8],  # число сессий пользователя
    'avg_time': [2, 3, 3, 5, 6, 7, 8, 10],  # среднее время взаимодействия
    'converted': [0, 0, 0, 0, 1, 1, 1, 1]  # целевой класс конверсии
})

X = data[['sessions', 'avg_time']]  # выделяем только признаки для обучения
y = data['converted']  # сохраняем целевую переменную отдельно

pipe = Pipeline([  # задаем последовательность преобразований и модели
    ('scaler', StandardScaler()),  # масштабируем признаки перед классификатором
    ('model', LogisticRegression(max_iter=2000))  # обучаем логистическую регрессию
])
pipe.fit(X, y)  # подгоняем параметры модели по данным
proba = pipe.predict_proba(X)[:, 1]  # берем вероятности положительного класса
print(pd.Series(proba).round(3).tolist())  # смотрим, как модель ранжирует объекты по вероятности

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

Что читать дальше

Связанные статьи по этой теме

Canary deployment для моделей: как выкатывать новую версию без лишнего риска Latency в ML API: почему быстрая модель важна не меньше точной Batch inference и real-time inference: как выбирать режим работы модели
Вернуться в блог