Модуль 3. Логистическая регрессия: учимся классифицировать

Цель модуля: превратить линейную модель в классификатор: прямая через сигмоиду даёт вероятность класса, порог превращает вероятность в решение. После модуля вы понимаете, чем log loss отличается от MSE, почему вероятность полезнее «да/нет» и как порог связан с precision и recall.

Перед началом: модуль 2 (градиентный спуск, переобучение). Инструменты: песочница сайта, сниппет ниже. Трудоёмкость: ~1.5 ч (чтение 45 мин · сниппет и практика 35 мин).

🔥 «Спам на 93%»: почему ответ — это вероятность

Фильтр спама в вашем продукте отвечает не «спам / не спам», а «вероятность спама 0.93». И это не маркетинговая придирка: для одного сигнала этого достаточно, чтобы заблокировать письмо; для другого — жалоба VIP-клиента, и письмо стоит показать, наложив мягкую метку. Порог выбирает продукт, а не математика. «Вероятность 0.93» — сырьё для решения; решений из него можно сделать сколько угодно.

Задача классификации отличается от регрессии ответом: не число, а метка класса. Но строится из уже знакомой механики: линейной модели и градиентного спуска. Разница — в двух трюках: функция, превращающая прямую в вероятность, и критерий качества, который «наказывает» не ошибками в единицах, а уверенным промахом по вероятности.

📖 3.1. Сигмоида: из прямой — в вероятность

Линейная модель выдаёт любое число от минус до плюс бесконечности — его называют логитом (score). Нам нужна вероятность: от 0 до 1. Мостик — сигмоида: σ(z) = 1 / (1 + e^(−z)). Свойства, которые надо запомнить:

  • σ(0) = 0.5 — точка безразличия; σ(большое положительное) → 1;
  • σ(−z) = 1 − σ(z) — симметрия «да/нет»;
  • вход z = w·x + b — по-прежнему линейная модель: параметры и признаки те же. Выход — вероятность класса 1.

Знак параметров читается напрямую: w > 0 — признак повышает вероятность класса 1, w < 0 — понижает. Это делает логистическую регрессию отличным «разведочным» инструментом даже в эпоху бустинга: посмотрели знаки и величины — уже поняли, во что модель верит (модуль 8 добавит осторожности: масштабы параметров обманчивы, пока признаки не нормализованы).

📖 3.2. Log loss: критерий, который не врёт про уверенность

Для классификации MSE работает плохо: она одинаково корит «0.4 вместо 1» и «0.9 вместо 1», а на деле второе — уверенная ложь, самый опасный режим. Правильный критерий — log loss (кросс-энтропия): сумма штрафов −log(p_истинного_класса). Последствия:

  • ответ «0.5» на любом классе стоит дешево; «0.99, а класс другой» — бесконечно дорого (log стремится к минус бесконечности);
  • модель обучается не «угадывать классы», а быть честной в вероятностях: из всех её 0.8-ответов примерно 80 должны оказаться классом 1.

Именно поэтому в проде вероятности калиброваны: вы можете планировать бюджет «показать человеку всё, где уверенность ниже 0.8», не переобучая модель. Градиент log loss по параметрам устроен удивительно просто: (σ(z) − y)·x — ошибка вероятности, умноженная на признак. Никаких каскадов производных; сигмоида с этим критерием складывается в идеальную пару, поэтому обучение из сниппета — те же четыре строки спуска.

📖 3.3. Сниппет: обучаем классификатор и смотрим на карту решений

Запустите logistic-regression.py. Тридцать точек в плоскости (класс 1 — «срочные» в правом верхнем углу, класс 0 — обычные), обучение спуском по log loss. Что показывает вывод:

  • logloss падает 0.375 → 0.0044 за 300 шагов: модель по-настоящему «выучивает» различие, а не подгоняется под порог.
  • Карта решений: точки данных помечены # (модель угадала) и ! (ошиблась), фон — предсказанный класс. Видно, что классы разделяет прямая, и почти все точки — на своих сторонах.
  • Точность 30/30 на обучающих данных. На этом лёгком наборе модель идеальна; в реальной жизни у границы найдутся точки, которые линейной моделью не разделить, и они станут вашими «!» (посмотрите на облака в сниппете: они слегка переплетаются у края).

Обратите внимание на порядок величин параметров: w1 ≈ 2.9, w2 ≈ 2.4 — сигнал не «выключен», оба признака реально участвуют. Если бы один из них был около нуля, разведка сказала бы «признак не несёт информации» — типичный первый профессиональный вопрос к данным.

📖 3.4. Порог: вероятностью управляет не только модель

Порог 0.5 — не истина, а решётка по умолчанию. Сдвинем порог вправо (0.8) — модель осторожнее выдаёт класс 1: меньше ложных тревог, больше пропусков. Сдвинем влево (0.2) — наоборот. Это ровно прецизионность (precision) и полнота (recall) из сниппета курса «Дообучение LLM»: precision — доля правильных среди «срочных» по мнению модели, recall — доля пойманных срочных. Метрики одного тюнинга. Здесь важно понять связь глубже: за одну модель вы получаете целое семейство решений, и «какое выбрать» определяет цену ошибки (позднее сработать или побеспокоить зря), а не красота кривой.

Модуль 7 разберёт выбор порога и метрик профессионально (ROC-AUC, кривые precision-recall). Пока — рабочее правило: настраивайте порог на данных, которые никогда не использовались при обучении (val), и фиксируйте его как часть «версии модели» — иначе та же модель с другим порогом считается другим продуктом со своими метриками.

📖 3.5. Компромиссы

  • Вероятность vs бинарный ответ. Хранить вероятность — дороже по смыслу, но позволяет менять порог без переобучения; бинарный ответ фиксирует порог в момент вызова и теряет информацию. В проде всегда храните вероятность.
  • Log loss vs accuracy. Accuracy — метрика глазами пользователя («угадала / нет»), но она слепа к уверенной лжи и шумна при дисбалансе; log loss — метрика обучения. Обучают по одной, отчитываются о другой (модуль 7).
  • Линейная граница vs гибкая. Логистическая регрессия не проведёт кривую; чтобы помочь, добавляют нелинейные фичи (x², произведения) — становится гибче, но требуется больше данных против переобучения (модуль 8).
  • Порог 0.5 vs свой порог. 0.5 — нейтральная точка; любой продуктовый порог — сдвиг под цену ошибки. Не двигать порог «чтобы проценты выше» — а измерять.
  • Разведочная ценность vs боевая модель. Как боевая — логистическая регрессия часто слабее бустинга; как разведочный инструмент (знаки, какие признаки работают) — живёт вечно и в каждом проекте.

💻 Практика

  1. (15 мин) Сниппет. Запустите logistic-regression.py. Найдите в карте решений строку, где точки одного класса заходят на «чужой» фон — они ограничивают прямую модель. Объясните почему.
  2. (15 мин) Порог руками. В сниппете поменяйте решающее правило на «вероятность ≥ 0.8 — срочно» (строка с сигмоидой в карте) и посчитайте ошибки по каждому классу. Сколько срочных модель теперь пропускает? Сравните с версией на 0.5 — назовите, что произошло с precision и recall.
  3. (10 мин) Формулировка своей задачи. Возьмите задачу «срочный ли тикет» из модуля 1. Выпишите: что признаки, что таргет, что предсказывать вероятностью, какой порог разумен в первый день пилота и почему (цена ошибок в обе стороны по часам дежурного).
  4. (10 мин) Логиты на пальцах. Для σ-модели с w = 2, b = −3 и признаком x = 2 посчитайте логит, вероятность и решение при пороге 0.5. (Подсказка: логит = 1; σ(1) ≈ 0.73.)

🧩 Quiz "Проверь себя"

1. Чем полезна вероятность вместо бинарного ответа?
2. Что произойдёт с recall, если поднять порог с 0.5 до 0.8?
3. Что делает сигмоида?
4. Как признак с отрицательным w влияет на вероятность класса 1?
5. Почему log loss лучше MSE для классификации?

✅ Итоги модуля

  • Объяснить цепочку «признаки → логит → сигмоида → вероятность → порог → решение».
  • Сказать, чем log loss отличается от MSE, и почему это важно.
  • Показать по карте решений, где линейная модель бессильна.
  • Связать порог с precision и recall на своём кейсе.
  • Записать для своей задачи разумный стартовый порог и его цену ошибок.

🔗 Мостик к Модулю 4

Логистическая регрессия проводит одну прямую — и всё решение держится на ней. Реальные данные часто «ступенчатые»: срочность скачет от сочетаний условий (много заявок и короткий SLA?), а не от одной оси. Пора дать модели право задавать вопросы и строить правила самому — деревья решений. Они же откроют двери в ансамбли, которые правят табличным ML: лес и бустинг.