Запрос функции с низким приоритетом: поддержка вычисления оценки roc_auc для нескольких классов в sklearn.metrics
с использованием методологии «один против всех» была бы невероятно полезной.
Я не уверен, что это значит. У вас есть ссылка на него?
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 правильная ли ваша реализация? Пользуюсь и работает.
Самый полезный комментарий
При микро-усреднении ваш истинный положительный коэффициент (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
Лично я бы никогда не использовал невзвешенное макросреднее, но посмотрю, смогу ли я найти статьи, в которых это изучалось.