Модуль 5. Линейные модели и метрики¶
После этого модуля вы сможете
- Собрать логистическую регрессию из деталей, готовых с модуля 4, и проверить её gradient check.
- Объяснить, почему для классификации берут log loss, а не MSE — через градиент, а не через традицию.
- Показать на данных, что accuracy 0.95 может означать «модель хуже, чем ничего».
- Выбрать между ROC-AUC и PR-AUC, зная долю положительного класса.
- Понимать порог как решение, которое принимаете вы, а не как свойство модели.
Время: около двух недель. Пререквизиты: модуль 4.
Ноутбук: notebooks/05-linear-models-and-metrics.ipynb
Зачем это¶
Часть I дала инструменты. Часть II даёт первые модели, и у них двойная роль.
Они полезны сами по себе: линейная модель до сих пор решает много задач и остаётся единственной, чьи веса можно показать юристу или врачу. Но важнее вторая роль — это базовые линии, с которыми будет сравниваться всё остальное в курсе. Из модуля 1 известно, что утверждение без базы пустое. Здесь базы и появляются.
Половина модуля про метрики, и это не довесок. Выбрать метрику труднее, чем обучить модель, и ошибка здесь стоит дороже.
Логистическая регрессия¶
Линейная регрессия из модуля 3 предсказывает число. Для классификации нужна вероятность: величина от нуля до единицы.
Берём линейную комбинацию признаков \(z = w \cdot x\) и загоняем её в отрезок \([0, 1]\) сигмоидой:
Функция потерь — логарифм правдоподобия со знаком минус, log loss:
Читается прямо: за уверенный правильный ответ штраф около нуля, за уверенный неправильный — штраф стремится к бесконечности. Модель наказывается за уверенность в ошибке сильнее, чем за неуверенность.
Градиент выведен в модуле 4 и оказался равен \((p - y)\,x\). Всё, что нужно для обучения, уже написано: остаётся собрать спуск.
Почему не MSE
Квадратичная потеря для классификации формально работает и даёт неверное поведение.
Возьмите объект класса 1, на котором модель уверенно ошибается: \(p = 0.01\). Градиент MSE через сигмоиду содержит множитель \(\sigma'(z) = p(1-p) = 0.0099\) — почти ноль. Чем сильнее модель ошибается, тем слабее сигнал на исправление. Обучение застревает ровно там, где оно нужнее всего.
У log loss этот множитель сокращается — это и было то самое сокращение в модуле 4. Градиент равен \((p - y)x\), и при \(p = 0.01\), \(y = 1\) он максимален.
Log loss берут не по традиции, а потому, что MSE душит сигнал на трудных примерах.
Регуляризация¶
Модуль 3 показал: коллинеарные признаки раздувают веса. Модуль 2 показал: гибкая функция подгоняется под шум. Регуляризация лечит обе болезни одним приёмом — штрафом за величину весов.
L2 (ridge): к потере добавляется \(\lambda\|w\|^2\). Веса сжимаются к нулю, но не обнуляются. Коллинеарность перестаёт разносить их в плюс и минус: штраф делает симметричное решение выгоднее.
Оптимизатор регуляризует и сам
Градиентный спуск, начатый из нуля, приходит к решению с наименьшей нормой из всех подходящих. На коллинеарных признаках это означает, что он сам поделит вес между близнецами поровну, безо всякого штрафа. Разъезжающиеся в плюс и минус веса из модуля 3 были получены точным решателем, а не спуском.
Это называется неявной регуляризацией, и следствие из неё практическое: выбор оптимизатора влияет на то, какое из множества решений вы получите. Формула задачи одна, ответы разные. В ноутбуке это видно на числах.
L1 (lasso): добавляется \(\lambda\sum|w_i|\). Часть весов становится ровно нулём. Получается отбор признаков как побочный эффект оптимизации.
Разница геометрическая. Уровни L2 — окружности, и точка касания с ними почти никогда не попадает на ось. Уровни L1 — ромб с углами на осях, и касание чаще всего происходит именно в углу, то есть на нуле.
\(\lambda\) подбирается на валидации. Не на тесте — почему, разбирается в модуле 7.
Метрики, и почему accuracy врёт¶
Теперь главное.
Accuracy — доля верных ответов. Кажется естественной и почти всегда бесполезна.
Вернитесь к модулю 2: болезнь у одного из тысячи. Классификатор «здоров всегда» даёт accuracy 0.999. Это тривиальная база из модуля 1, и побить её осмысленной моделью трудно. Любое число accuracy бессмысленно без доли положительного класса рядом.
Что считать вместо. Сначала четыре числа — матрица ошибок:
| предсказано 1 | предсказано 0 | |
|---|---|---|
| на самом деле 1 | TP | FN |
| на самом деле 0 | FP | TN |
Из них строятся две метрики, отвечающие на разные вопросы.
Precision \(= \dfrac{TP}{TP + FP}\) — из тех, кого модель назвала положительными, сколько таких на самом деле. Вопрос: можно ли доверять срабатыванию.
Recall \(= \dfrac{TP}{TP + FN}\) — из всех настоящих положительных, скольких модель нашла. Вопрос: скольких мы пропустили.
Они тянут в разные стороны. Понизьте порог — recall растёт, precision падает. Повысьте — наоборот.
F1 — их гармоническое среднее. Удобно как одно число и вредно как цель: оно предполагает, что пропуск и ложная тревога стоят одинаково. В медицине, в антифроде и в модерации это неправда.
Порог — это ваше решение
Модель выдаёт вероятность. Превращение вероятности в ответ «да/нет» — отдельный шаг, и делаете его вы.
Порог 0.5 не является ни свойством модели, ни разумным значением по умолчанию. Он следует из цены ошибок. Пропустить мошенническую транзакцию стоит одного, зря заблокировать честную — другого, и порог обязан отражать это отношение.
Сравнение двух моделей по метрике при пороге 0.5 регулярно сравнивает не модели, а удачность порога для каждой.
ROC-AUC и PR-AUC¶
Чтобы не зависеть от порога, метрику считают по всем порогам сразу.
ROC-кривая — recall против доли ложных срабатываний среди отрицательных. Площадь под ней, ROC-AUC, имеет прямое чтение: вероятность того, что случайно взятый положительный объект получит больший балл, чем случайно взятый отрицательный. Случайная модель даёт 0.5, идеальная — 1.0.
PR-кривая — precision против recall. Площадь под ней — PR-AUC.
Разница вылезает на редком классе. Знаменатель доли ложных срабатываний — все отрицательные, и их много. Тысяча ложных срабатываний на миллион отрицательных почти не двигает ROC-кривую. Precision же обрушивается, потому что её знаменатель — только предсказанные положительные.
Правило. Классы примерно равны — ROC-AUC. Положительных единицы процентов — PR-AUC. ROC-AUC 0.95 на задаче с долей положительных 0.1 % может соответствовать precision в несколько процентов, и это не противоречие, а арифметика.
Калибровка¶
Последнее свойство, о котором обычно забывают.
Модель калибрована, если среди объектов с предсказанной вероятностью 0.8 действительно около 80 % положительных.
Ранжирование и калибровка — разные вещи. Модель может идеально упорядочивать объекты (AUC = 1.0) и при этом выдавать бессмысленные вероятности.
Калибровка нужна там, где вероятность используется в расчёте, а не только для сортировки: ожидаемая прибыль, порог по цене ошибки, объединение с другими источниками. Проверяется диаграммой надёжности: разбить предсказания на корзины и сравнить среднюю предсказанную вероятность с фактической долей положительных.
Логистическая регрессия калибрована неплохо по построению — это следствие log loss. Деревья и бустинг из модуля 6 — обычно нет.
Практика¶
Часть 1. Ноутбук¶
Откройте notebooks/05-linear-models-and-metrics.ipynb.
Что внутри:
- Логистическая регрессия с нуля, проверенная gradient check из модуля 4.
- MSE против log loss: смотрим на градиент на уверенно неверном примере.
- Несбалансированные данные: accuracy 0.98 у модели, которая не нашла ни одного положительного.
- Precision, recall и порог как ручка. Кривая компромисса.
- ROC-AUC против PR-AUC при доле положительных 50 %, 5 % и 0.5 %.
- Диаграмма надёжности: калибровка и её отсутствие.
- Ridge на коллинеарных признаках из модуля 3: веса перестают разъезжаться.
Часть 2. Метрика под задачу¶
Выберите любую задачу бинарной классификации из своей жизни: спам, отток, брак на производстве, подозрительный платёж.
Письменно, до всякого кода:
- Какова цена ложного срабатывания. В деньгах, времени или доверии.
- Какова цена пропуска. В тех же единицах.
- Из отношения этих цен — какой порог разумен.
- Какая метрика отражает вашу задачу и почему не F1.
- Какая доля положительного класса ожидается. Отсюда — ROC-AUC или PR-AUC.
Пять ответов на полстраницы. Это и есть постановка задачи; всё остальное — техника.
Задание¶
- Реализуйте логистическую регрессию с L2-штрафом. Проверьте градиент численно.
- Постройте данные с долей положительных 1 %. Обучите модель и найдите порог, максимизирующий F1. Сравните с 0.5.
- Постройте две модели с одинаковым ROC-AUC и заметно разным PR-AUC. Объясните, чем они отличаются.
- Возьмите предсказания модели и постройте диаграмму надёжности. Откалибруйте её изотонической регрессией или простым биннингом. Изменился ли AUC?
- На коллинеарных данных сравните веса без регуляризации и с L2 при трёх значениях \(\lambda\). Постройте, как веса сходятся к нулю с ростом \(\lambda\).
Проверка себя¶
- Почему для классификации log loss, а не MSE? Ответ через градиент.
- Accuracy 0.99. Какой первый вопрос вы зададите?
- Чем precision отличается от recall на словах, без формул?
- Почему F1 — плохая цель для антифрода?
- Откуда берётся порог, если не 0.5?
- Как читается ROC-AUC одной фразой про два случайных объекта?
- Когда PR-AUC информативнее ROC-AUC и почему?
- Модель с AUC 1.0 может быть плохо калибрована. Как такое возможно?
Дальше¶
В модуле 6 появляются деревья, а с ними — семейство, которое на табличных данных до сих пор обыгрывает нейросети. Это будет главная базовая линия курса, и в частях III–VI её придётся побеждать честно.
Метрика выбирается из цены ошибки, а не из привычки. Порог — тоже.