Модуль 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 боевая модель. Как боевая — логистическая регрессия часто слабее бустинга; как разведочный инструмент (знаки, какие признаки работают) — живёт вечно и в каждом проекте.
💻 Практика
- (15 мин) Сниппет. Запустите
logistic-regression.py. Найдите в карте решений строку, где точки одного класса заходят на «чужой» фон — они ограничивают прямую модель. Объясните почему. - (15 мин) Порог руками. В сниппете поменяйте решающее правило на «вероятность ≥ 0.8 — срочно» (строка с сигмоидой в карте) и посчитайте ошибки по каждому классу. Сколько срочных модель теперь пропускает? Сравните с версией на 0.5 — назовите, что произошло с precision и recall.
- (10 мин) Формулировка своей задачи. Возьмите задачу «срочный ли тикет» из модуля 1. Выпишите: что признаки, что таргет, что предсказывать вероятностью, какой порог разумен в первый день пилота и почему (цена ошибок в обе стороны по часам дежурного).
- (10 мин) Логиты на пальцах. Для σ-модели с w = 2, b = −3 и признаком x = 2 посчитайте логит, вероятность и решение при пороге 0.5. (Подсказка: логит = 1; σ(1) ≈ 0.73.)
🧩 Quiz "Проверь себя"
✅ Итоги модуля
- Объяснить цепочку «признаки → логит → сигмоида → вероятность → порог → решение».
- Сказать, чем log loss отличается от MSE, и почему это важно.
- Показать по карте решений, где линейная модель бессильна.
- Связать порог с precision и recall на своём кейсе.
- Записать для своей задачи разумный стартовый порог и его цену ошибок.
🔗 Мостик к Модулю 4
Логистическая регрессия проводит одну прямую — и всё решение держится на ней. Реальные данные часто «ступенчатые»: срочность скачет от сочетаний условий (много заявок и короткий SLA?), а не от одной оси. Пора дать модели право задавать вопросы и строить правила самому — деревья решений. Они же откроют двери в ансамбли, которые правят табличным ML: лес и бустинг.