Перейти к содержанию

Модуль 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]\) сигмоидой:

\[p = \sigma(z) = \frac{1}{1 + e^{-z}}\]

Функция потерь — логарифм правдоподобия со знаком минус, log loss:

\[L = -\frac{1}{n}\sum_i \Big( y_i \ln p_i + (1 - y_i)\ln(1 - p_i) \Big)\]

Читается прямо: за уверенный правильный ответ штраф около нуля, за уверенный неправильный — штраф стремится к бесконечности. Модель наказывается за уверенность в ошибке сильнее, чем за неуверенность.

Градиент выведен в модуле 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.

Что внутри:

  1. Логистическая регрессия с нуля, проверенная gradient check из модуля 4.
  2. MSE против log loss: смотрим на градиент на уверенно неверном примере.
  3. Несбалансированные данные: accuracy 0.98 у модели, которая не нашла ни одного положительного.
  4. Precision, recall и порог как ручка. Кривая компромисса.
  5. ROC-AUC против PR-AUC при доле положительных 50 %, 5 % и 0.5 %.
  6. Диаграмма надёжности: калибровка и её отсутствие.
  7. Ridge на коллинеарных признаках из модуля 3: веса перестают разъезжаться.

Часть 2. Метрика под задачу

Выберите любую задачу бинарной классификации из своей жизни: спам, отток, брак на производстве, подозрительный платёж.

Письменно, до всякого кода:

  1. Какова цена ложного срабатывания. В деньгах, времени или доверии.
  2. Какова цена пропуска. В тех же единицах.
  3. Из отношения этих цен — какой порог разумен.
  4. Какая метрика отражает вашу задачу и почему не F1.
  5. Какая доля положительного класса ожидается. Отсюда — ROC-AUC или PR-AUC.

Пять ответов на полстраницы. Это и есть постановка задачи; всё остальное — техника.

Задание

  1. Реализуйте логистическую регрессию с L2-штрафом. Проверьте градиент численно.
  2. Постройте данные с долей положительных 1 %. Обучите модель и найдите порог, максимизирующий F1. Сравните с 0.5.
  3. Постройте две модели с одинаковым ROC-AUC и заметно разным PR-AUC. Объясните, чем они отличаются.
  4. Возьмите предсказания модели и постройте диаграмму надёжности. Откалибруйте её изотонической регрессией или простым биннингом. Изменился ли AUC?
  5. На коллинеарных данных сравните веса без регуляризации и с L2 при трёх значениях \(\lambda\). Постройте, как веса сходятся к нулю с ростом \(\lambda\).

Проверка себя

  1. Почему для классификации log loss, а не MSE? Ответ через градиент.
  2. Accuracy 0.99. Какой первый вопрос вы зададите?
  3. Чем precision отличается от recall на словах, без формул?
  4. Почему F1 — плохая цель для антифрода?
  5. Откуда берётся порог, если не 0.5?
  6. Как читается ROC-AUC одной фразой про два случайных объекта?
  7. Когда PR-AUC информативнее ROC-AUC и почему?
  8. Модель с AUC 1.0 может быть плохо калибрована. Как такое возможно?

Дальше

В модуле 6 появляются деревья, а с ними — семейство, которое на табличных данных до сих пор обыгрывает нейросети. Это будет главная базовая линия курса, и в частях III–VI её придётся побеждать честно.

Метрика выбирается из цены ошибки, а не из привычки. Порог — тоже.