Вопрос или проблема
Я искал объяснение этому и пока не нашел – в scikit-learn, когда я вычисляю auc()
для precision_recall_curve()
, я получаю другую макро-метрику, чем когда использую встроенную функцию average_precision_score()
. Согласно документации, это имеет смысл, поскольку auc()
использует трапециевидное приближение, а значит, средняя точность более точна. Тем не менее, когда я вычисляю микро-метрики, значения совпадают. Я пытаюсь понять это.
Вот пример:
yhat_raw = np.array([[0.511, 0.62, 0.3],[0.11, 0.76, 0.945],[0.002, 0.671, 0.452],[0.9102, 0.783, 0.2]])
y = np.array([[0, 1, 1],[0, 0, 1],[0, 0, 0],[0, 1, 1]])
yhatmic = yhat_raw.ravel()
ymic = y.ravel()
prec["micro"], rec["micro"], _ = precision_recall_curve(ymic, yhatmic,
pos_label=1)
auc(rec["micro"], prec["micro"])
возвращает 0.58305555555555544
.
average_precision_score(ymic, yhatmic)
возвращает 0.62222222222222223
.
При фактическом развертывании модели эти метрики оказываются одинаковыми. Я думаю, это имеет смысл, учитывая, что на большом масштабе (например, вдоль оси в тысячи точек данных, а не len(rec['micro']) = 11
точек данных в этом примере) трапециевидное приближение намного ближе к истинному значению.
Мой вопрос в том, почему метрики тогда различаются в случае macro
? Можно ли сказать, что в реальном развертывании микро-оценка имеет достаточно точек данных, чтобы трапециевидное приближение сошлось к истинному значению, а макро-метрики – нет (вычислены на ~3000 тестовых примерах с пространством меток ~2000 меток)?
Метрики различаются в случае macro
, потому что macro
в scikit-learn игнорирует дисбаланс классов. micro
в scikit-learn смотрит на глобальные ставки. Данные имеют дисбаланс классов, поэтому аргумент macro
будет возвращать разные значения по сравнению с micro
.
Ответ или решение
Различия между average_precision_score() и auc() для precision_recall_curve() в Scikit-learn
Вопрос о различиях между average_precision_score()
и вычислением площади под кривой precision-recall с помощью auc()
в Scikit-learn поднимает важные аспекты оценки качества моделей машинного обучения. Давайте рассмотрим, что представляют собой эти метрики и почему их значения могут различаться в зависимости от режима (macro или micro).
1. Понимание метрик
-
average_precision_score: Эта функция вычисляет среднюю точность, учитывая всю область под кривой точность-полнота (precision-recall curve). Это значение является более стабильным и точным, так как оно принимает во внимание разные пороговые значения для определения точности и полноты, что особенно важно в ситуациях с несбалансированными классами.
-
auc: С помощью этой функции вычисляется площадь под кривой, используя трапецоидальное правило, что может привести к приблизительным значениям. Хотя для больших наборов данных это правило может хорошо приближать истинную площадь, на небольших выборках (например, рассчитываемых по вашему коду) различия могут быть заметны.
2. Различия между macro и micro
В Scikit-learn macro
и micro
усреднение метрик по классам предоставляют различный подход к обработке классов:
-
micro: Этот метод собирает все истинные положительные, ложные положительные и ложные отрицательные для всех классов, а затем вычисляет общую точность и полноту. Это позволяет учесть все классы в одном измерении, что особенно полезно для более крупных наборов данных, где размеры классов могут варьироваться.
-
macro: В этом режиме каждое измерение применяется к отдельным классам, а затем результаты усредняются. Это может создать проблемы, если некоторые классы имеют меньшее количество примеров, так как они окажут большее влияние на итоговую оценку. При работе с несбалансированными наборами данных это может привести к значительным отклонениям от ожидаемых значений.
3. Почему результаты отличаются?
В вашем случае, когда вы вычисляете average_precision_score()
и auc()
для precision-recall_curve(), различия обусловлены классовым дисбалансом и методом усреднения. В вашем небольшом примере:
- Значение
auc(rec["micro"], prec["micro"])
= 0.583 выдаёт результат, который является результатом трапецоидального приближения к площади под кривой. - А значение
average_precision_score(ymic, yhatmic)
= 0.622 более точно отражает истинную среднюю точность, учитывая различные пороговые уровни.
4. Применение в реальных сценариях
При развертывании модели (особенно на больших массивах данных) действительно можно заметить, что метрические значения для micro
и macro
приводят к более близким результатам. Это связано с тем, что среднее значение по всем классам будет более устойчивым по сравнению с метриками, чувствительными к выбросам и классам с низким представлением.
Заключение
Выводя итоги, различия между average_precision_score()
и auc()
для precision-recall_curve() в Scikit-learn могут быть обоснованны тем, как каждая метрика обрабатывает данные, учитывая или игнорируя классовый дисбаланс. В реальных применениях рекомендацией будет применить micro
метрики, когда размер выборки велик и классы сбалансированы, а для анализа дисбаланса классов лучше использовать macro
метрики, хотя эти метрики могут давать различные результаты.