Почему нельзя напрямую оптимизировать accuracy
Что проверяют
Знаете ли вы, почему обучение идёт по одной функции, а качество меряют другой. Вопрос на границу между математикой оптимизации и постановкой задачи, и по ответу видно, понимает ли человек, что вообще происходит внутри обучения.
Как отвечать
Главная причина техническая. Accuracy считается по жёсткому предсказанию, то есть по результату сравнения с порогом. Как функция параметров модели она кусочно-постоянная: сдвиньте веса чуть-чуть, ни один объект не сменил класс, значит метрика не изменилась и градиент равен нулю. В точках, где объект перепрыгивает порог, метрика скачет, и градиента там нет вовсе. Градиентным методам не за что зацепиться, а прямая минимизация доли ошибок для линейного классификатора вообще NP-трудна.
Поэтому учатся на суррогате: логистическая функция потерь, хиндж, экспоненциальная. Они гладкие, выпуклые по отступу и штрафуют не только сам факт ошибки, но и уверенность в ней. В градиентном бустинге собственная функция потерь тоже обязана иметь градиент и гессиан, иначе её просто нельзя подставить.
Вторая причина содержательная: будь accuracy дифференцируемой, она всё равно мало что говорит при перекосе классов, а цена ошибок первого и второго рода обычно разная. Рабочая схема такая: учим модель на вероятностях, калибруем их, а порог подбираем на отложенной выборке под ту метрику, которая нужна бизнесу.
Где спотыкаются
Сводят ответ к дисбалансу классов и не называют настоящую причину. Дисбаланс это довод против accuracy как отчётной метрики, а не объяснение, почему по ней нельзя сделать градиентный шаг.
Второе: думают, что F1 или ROC AUC оптимизируются напрямую. Они так же недифференцируемы, а F1 ещё и не раскладывается на слагаемые по объектам, считается по всей выборке целиком, поэтому используют их сглаженные приближения.
Третье: подбирают порог по тестовой выборке и отчитываются той же цифрой. Порог это тоже параметр, выбирать его нужно на валидации, иначе оценка завышена ровно на величину подгонки.