Scikit-learn average_precision_score() против auc-метрики precision_recall_curve()

Вопрос или проблема

Я искал объяснение этому и пока не нашел – в 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 метрики, хотя эти метрики могут давать различные результаты.

Оцените материал
Добавить комментарий

Капча загружается...