Scikit-learn: Поддержка мультиклассовых оценок roc_auc

Созданный на 19 июн. 2014  ·  47Комментарии  ·  Источник: scikit-learn/scikit-learn

Запрос функции с низким приоритетом: поддержка вычисления оценки roc_auc для нескольких классов в sklearn.metrics с использованием методологии «один против всех» была бы невероятно полезной.

New Feature

Самый полезный комментарий

При микро-усреднении ваш истинный положительный коэффициент (TPR) рассчитывается путем взятия суммы всех TP всех классов и деления на сумму всех TP и FN всех классов, то есть для задачи с 3 классами:
TPR = (TP1 + TP2 + TP3) / (TP1 + TP2 + TP3 + FN1 + FN2 + FN3)

Пример матрицы путаницы:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1 + 5 + 9) / (1 + 5 + 9 + (2 + 3) + (4 + 6) + (7 + 8))
Сделайте то же самое для количества ложных срабатываний, и вы сможете вычислить AUC.

Усреднение макросов просто вычисляет TPR для каждого класса отдельно и усредняет их (взвешенные по количеству примеров в этом классе или нет):
TPR = (1/3) * (TP1 / (TP1 + FN1) + TP2 / (TP2 + FN2) + TP2 / (TP2 + FN2))

В том же примере:
TPR = (1/3) * (1 / (1+ (2 + 3)) + 5 / (5+ (4 + 6)) + 9 / (9+ (7 + 8)))

Возможно, это поможет (здесь используется точность, но идея та же):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Лично я бы никогда не использовал невзвешенное макросреднее, но посмотрю, смогу ли я найти статьи, в которых это изучалось.

Все 47 Комментарий

Я не уверен, что это значит. У вас есть ссылка на него?

19 июня 2014 г. в 09:51 Мэдисон Мэй [email protected] написала:

Запрос функции с низким приоритетом: поддержка мультиклассовой оценки roc_auc
расчет в sklearn.metrics с использованием методологии «один против всех»
было бы невероятно полезно.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298.

Вот довольно приличное объяснение со ссылками: https://www.cs.bris.ac.uk/~flach/ICML04tutorial/ROCtutorialPartIII.pdf

хм, какой рекомендуемый бомбардир пока не реализован мультиклассный аук?

поддержка многоклассового подсчета очков roc_auc в sklearn.metrics с использованием методологии «один против всех» была бы невероятно полезной.

Вы говорите о том, что на этих слайдах рассматривается как приближение к объему под поверхностью, в котором берется средневзвешенное значение AUC для каждого класса? Казалось бы, это идентично использованию текущего roc_auc_score с бинаризованным представлением и average='weighted' . ( @arjoly , почему эти кривые не позволяют использовать мультикласс?)

В противном случае эти слайды и большинство ссылок, которые я могу найти на «мультиклассовый ROC», сосредоточены на мультиклассовой калибровке OvR, а не на метрике оценки. Это то, что вас интересует? Я понятия не имею, насколько широко распространен этот метод, стоит ли иметь его в scikit-learn и нужно ли улучшать жадную оптимизацию.

( @arjoly , почему эти кривые не позволяют использовать мультикласс?)

Если в y_true отсутствует один класс, подсчитать оценку невозможно. Я не хотел добавлять магию для вывода классов и доставлять неудобства пользователям.

Возможно, что в случае y_pred мы не работаем должным образом.
имеющий ярлык, которого нет у y_true. Этот ярлык, вероятно, не должен
участвовать в каких-либо макро-средних (в соответствии с Weka,
тоже), или оценка ROC.

1 августа 2014 г. в 17:08 Арно Жоли [email protected] написал:

( @arjoly https://github.com/arjoly, почему эти оценки на основе кривых
запретить мультикласс?)

Когда один класс отсутствует в y_true, невозможно вычислить
счет. Я не хотел добавлять магию для вывода классов и получил
пользователя в проблемы.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -50855460
.

@jnothman @arjoly есть большой прогресс на фронте усреднения. Насколько сложно это реализовать сейчас?

возможно, это может быть похоже на функцию R из пакета pROC
http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

Привет, я реализовал черновик макро-усредненной оценки ROC / AUC, но я не уверен, подойдет ли он для sklearn.

Вот код:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Может ли это быть так просто?

@fbrundu, если это стандартное значение. Это, безусловно, одна из возможных интерпретаций.

Здесь есть хорошее резюме:
http://people.inf.elte.hu/kiss/13dwhdm/roc.pdf

Пакет pROC реализует Hand and Till:
http://download.springer.com/static/pdf/398/art%253A10.1023%252FA%253A1010920819831.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1023%2FA% 3A1010920819831 & token2 = exp = 1469743016 ~ acl =% 2Fstatic% 2Fpdf% 2F398% 2Fart% 25253A10.1023% 25252FA% 25253A1010920819831.pdf% 3ForiginUrl% 3Dhttp% 253Aicle% 25102fA% 253A1102FA% 253A1102FA% 25102FA% 25102FA% 252102FA% 25102FA% 25102Fa1% * ~ hmac = bc68686d3782ac6af3c3cda13c1b36aad6de5d01d16a25870cace5fe9699fb8a

Версия Hand and Till кажется общепринятой, и я голосую за то, чтобы мы ее реализовали.
Есть также версия Провоста и Домингоса, за которую я, вероятно, должен болеть, учитывая, что Провост в настоящее время является моим директором, но она не прижилась.
Провост-Домингос - это то, что @fbrundu сказал только с average='weighted' .

TL; DR: PR для Hand and Till добро пожаловать. По желанию Провост и Домингос с возможностью изменения усреднения.

Привет, есть ли прогресс в реализации этого?
Что я видел в большинстве других библиотек (например, WEKA), так это то, что они используют средневзвешенное значение. Я бы подумал, что это то, что предложил @fbrundu, используя average = 'micro'?

@joaquinvanschoren R использует Hand and Till. Я бы тоже предпочел эту. У меня есть студент, который скоро этим займется.

@amueller, я могу поработать над этим :)

@ kchen17 спасибо!

Мы довольно много обсуждали это в OpenML. Для мультиклассового AUC нет никаких гарантий, что один подход (макро-усреднение, микро-усреднение, взвешенное усреднение ...) лучше, чем другой. В R вы можете найти как минимум 5 различных подходов (все они теперь доступны и в MLR).
При реализации этого в scikit-learn было бы здорово, если бы была хотя бы возможность выбрать тот, который имеет наибольшее значение для вашего приложения, даже если вы используете Hand-Till по умолчанию. Между прочим, Hand-Till - это невзвешенный подход, он не учитывает дисбаланс этикеток.

Я рад, что у меня есть несколько версий. невзвешенный и "не учитывающий дисбаланс этикеток" - разные вещи;) У вас есть список и ссылки?

Что в этом случае микро-усреднение?

Обратите внимание, что мы уже усреднили ROC AUC для мультиклассовых задач, реализованных в этом примере:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass -settings

На самом деле, я думаю, что документация неверна и должна сказать
многозначный ...

26 сентября 2016 г., в 23:16, Оливье Гризель [email protected]
написал:

Не то, чтобы мы уже усреднили микро- и макро-среднюю ROC AUC для мультикласса.
проблемы, реализованные в этом примере:

http://scikit-learn.org/stable/auto_examples/model_
selection / plot_roc.html # multiclass-settings

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -249566346,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz65IeU7k2CFwyHxTTAjk-5orIxWe6ks5qt8WsgaJpZM4CFzud
.

При микро-усреднении ваш истинный положительный коэффициент (TPR) рассчитывается путем взятия суммы всех TP всех классов и деления на сумму всех TP и FN всех классов, то есть для задачи с 3 классами:
TPR = (TP1 + TP2 + TP3) / (TP1 + TP2 + TP3 + FN1 + FN2 + FN3)

Пример матрицы путаницы:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1 + 5 + 9) / (1 + 5 + 9 + (2 + 3) + (4 + 6) + (7 + 8))
Сделайте то же самое для количества ложных срабатываний, и вы сможете вычислить AUC.

Усреднение макросов просто вычисляет TPR для каждого класса отдельно и усредняет их (взвешенные по количеству примеров в этом классе или нет):
TPR = (1/3) * (TP1 / (TP1 + FN1) + TP2 / (TP2 + FN2) + TP2 / (TP2 + FN2))

В том же примере:
TPR = (1/3) * (1 / (1+ (2 + 3)) + 5 / (5+ (4 + 6)) + 9 / (9+ (7 + 8)))

Возможно, это поможет (здесь используется точность, но идея та же):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Лично я бы никогда не использовал невзвешенное макросреднее, но посмотрю, смогу ли я найти статьи, в которых это изучалось.

Бумага:
https://www.math.ucdavis.edu/~saito/data/roc/ferri-class-perf-metrics.pdf

Это то, что поддерживается в R (с дополнительной литературой):
https://mlr-org.github.io/mlr-tutorial/devel/html/measures/index.html

Привет! На прошлой неделе мне удалось начать изучение этой проблемы, и я хотел опубликовать быстрое обновление / несколько вопросов, чтобы убедиться, что я на правильном пути.

  • Итак: я начинаю с реализации функции multiclass_roc_auc_score которая по умолчанию будет иметь параметр average установленный на None. По умолчанию будет использоваться алгоритм Hand-Till (как уже говорилось, это не учитывает дисбаланс меток).
  • Примет ли метод те же параметры, что и в roc_auc_score ?
  • Исходя из этого, разница будет в том, что y_true может иметь более двух классов меток. Hand-Till будет включать поиск всех возможных пар меток, вычисление roc_auc_score для каждой из этих пар, а затем определение их среднего значения.

Сообщите мне, какие исправления / предложения у вас могут быть!

Обычно мы избегаем создания другой функции, если повторное использование roc_auc_score разумно возможно. Я думаю, что можно оставить значение по умолчанию как «макрос».

Одна из ключевых вещей, о которой вам следует подумать, - это как протестировать эти изменения, включая изменение свойств roc_auc_score в metrics / tests / test_common.py.

да, мы должны обновить документы.

@joaquinvanschoren интересно, что в статье не обсуждалась ни одна из упомянутых выше мультиклассовых статей AUC, в частности, не статья Фосетта 2005 года .... хм, я предполагаю, что это перенормировка мультикласса 1-против-1?

так что в настоящее время у нас есть только multi-label, и поэтому мы хотим добавить multi-class с 1vs1 и 1vsRest, и каждый из них имеет взвешенные и невзвешенные варианты.
Я действительно не понимаю, как усреднение sample и micro работает для AUC :(

Итак ... Я предлагаю добавить параметр multi-class в AUC, который может быть ovo или ovr , и рассмотрим параметр взвешивания. Я не уверен, что мы хотим разрешить sample и micro поскольку это не имеет для меня смысла.

@arjoly, значит, micro и sample работают со строками, а не со столбцами матрицы? Есть какие-нибудь документы по этому поводу? Я не нашел этого в литературе РПЦ.

Проблема заключается в том, что для измерения ручной обработки почвы по умолчанию нам пришлось бы выполнять средневзвешенное значение OvO, и мы не можем изменить параметр взвешивания. Так, может быть, мы сделаем OVR по умолчанию и объясним в повествовании, что OvO с взвешиванием также является хорошим выбором, и добавим ссылку?

Резюме процитированной статьи @joaquinvanschoren также говорит, что все версии AUC дают примерно одинаковые результаты.

@amueller : Пришлось снова прочитать ваш комментарий, и я немного запутался в этой части:

Проблема заключается в том, что для измерения ручной обработки почвы по умолчанию нам пришлось бы выполнять средневзвешенное значение OvO, и мы не можем изменить параметр взвешивания. Так, может быть, мы сделаем OVR по умолчанию и объясним в повествовании, что OvO с взвешиванием также является хорошим выбором, и добавим ссылку?

Я собирался изменить roc_auc_score чтобы включить параметр multiclass=['ovo', 'ovr'] в соответствии с вашим ответом. Если по умолчанию используется OvR ( roc_auc_score(y_true, y_score, multiclass="ovo" ... ) ), а Hand & Till - это OvO, что мне делать в отношении части реализации OvR? (т.е. если я обнаружу, что y_true является мультиклассом, просто вызовет ошибку, если "ovr" не реализован, и проинструктирует пользователей передать "ovo"?)

Извините, я ожидал, что вы реализуете как ovo и ovr ;) Я думаю, что это должно быть довольно просто.

@amueller : y_score но очень быстро понял, что этого будет недостаточно. (т.е. просто проверяем, что метки только нули и единицы?)

Multilabel означает, что одновременно прогнозируется несколько меток: вы получаете
вектор прогнозов на экземпляр. Мультикласс означает, что вы получаете один
предсказание, но это предсказание может иметь более двух значений (это не
двоичный).

Иногда люди решают случай с мультиклассом, преобразовывая выходные данные в двоичную форму, поэтому
вы получаете несколько двоичных значений для каждого экземпляра (следовательно, многозначные), и это
часто вызывает недоумение.
В субботу, 8 октября 2016 года, в 16:33, Кэти Чен [email protected] написала:

@amueller https://github.com/amueller : Принято к сведению, и это будет
тоже включены! Также хотел спросить: есть ли какие-нибудь советы, как
обнаружить разницу между мультиклассом и мультиклассом? Сначала я был
просто проверил размеры y_score, но очень быстро понял это
было бы недостаточно.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252427642,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ABpQV7Mv0rHGEfrkYi5Xezz3PItyrLZ6ks5qx6mdgaJpZM4CFzud
.

Привет, я надеюсь, что type_of_target может решить задачу различения между multi-label и multi-class output. HTH

использование type_of_target - хорошая идея. Хотя в scikit-learn размерность y на самом деле является индикатором того, хотим ли мы делать несколько меток или нескольких целей. Если вы преобразуете вывод в двоичную форму, как предположил @joaquinvanschoren, scikit-learn всегда будет предполагать наличие нескольких меток.

type_of_target отлично подходит для различения y_trues, @amueller

9 октября 2016 г. в 05:18 Андреас Мюллер [email protected]
написал:

использование type_of_target - хорошая идея. Хотя в scikit-learn the
размерность y на самом деле является индикатором того, хотим ли мы
с несколькими метками или несколькими целями. Если вы преобразовываете вывод в двоичную форму как
@joaquinvanschoren https://github.com/joaquinvanschoren предложил
scikit-learn всегда предполагает наличие нескольких меток.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252439908,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz6wa5fnE_LX3LLXbCoc0Z4hBbSAQ0ks5qx95rgaJpZM4CFzud
.

Привет всем, я просто хотел сообщить, что отправил «предварительный» PR. Мне интересно услышать отзывы о реализации (например, я уверен, что есть способы использовать numpy и т. Д. Лучше, чем я делаю прямо сейчас), а также лучшие практики по добавлению новых тестов, формулировке документации и т. Д.

Спасибо за помощь!

Есть ли прогресс в добавлении поддержки мультиклассов для AUC?

@joaquinvanschoren : работа над исправлениями после проверки кода @jnothman в # 7663. Скорее всего, на следующей неделе отправлю еще одно обновление, когда закончу промежуточные экзамены.

Привет, @kathyxchen , @jnothman ,

Есть новости по PR?

Просто проверяете, есть ли прогресс в добавлении поддержки мультиклассов для AUC?

у нас проблемы с определением того, что является одновременно принятым и принципиальным
формулировка ROC AUC для мультикласса. Видеть
https://github.com/scikit-learn/scikit-learn/pull/7663#issuecomment -307566895
и ниже.

Так что молодцы. Есть ли прогресс с оценкой мультикласса auc? Я нашел очень запутанный код официальной документации с набором данных iris. Потому что этот метод показывает, что моя модель довольно хорошо предсказывает случайные числа.

Это почти готово, нам нужно определиться с деталями API перед объединением: https://github.com/scikit-learn/scikit-learn/pull/12789#discussion_r295693965

@trendsearcher, не могли бы вы привести пример? Теперь он объединен, но я хотел бы увидеть проблему, с которой вы столкнулись.

Рад помочь. Как я могу привести пример (в нем много кода, а может и нет
интуитивно понятный)? Может, я смогу написать это простым текстом?

чт, 18 июл. 2019 г. в 00:35, Андреас Мюллер [email protected] :

@trendsearcher https://github.com/trendsearcher, можете ли вы предоставить
пример пожалуйста? Теперь он объединен, но я хотел бы увидеть проблему, которую вы
опытный.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298?email_source=notifications&email_token=AKS7QOFYRQY7RZJBWUVVJSTP76GDFA5CNFSM4AQXHOO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD2GU7EI#issuecomment-512577425 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AKS7QOFQ5LAIZ2ZBR4M4EATP76GDFANCNFSM4AQXHOOQ
.

Привет, я реализовал черновик макро-усредненной оценки ROC / AUC, но я не уверен, подойдет ли он для sklearn.

Вот код:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Может ли это быть так просто?

@fbrundu Спасибо, что поделились! Я пробовал твой код. Но когда я вызываю эту функцию, я сталкиваюсь с проблемой: «Целевые данные с несколькими выходами не поддерживаются бинаризацией меток». Затем я удаляю код «pred = lb.transform (pred)» в функции. Однако я сталкиваюсь с другой проблемой: «Найдены входные переменные с несовместимым количеством выборок: [198, 4284]».

Могу я спросить, не могли бы вы помочь мне решить эту проблему? Спасибо!

@ Junting-Wang

 I meet a problem saying "Multioutput target data is not supported with label binarization". 

вы должны использовать предсказать вместо предсказать_проба

@fbrundu правильная ли ваша реализация? Пользуюсь и работает.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги