Scikit-learn: Suporte para pontuações roc_auc multiclasse

Criado em 19 jun. 2014  ·  47Comentários  ·  Fonte: scikit-learn/scikit-learn

Solicitação de recurso de baixa prioridade: suporte para cálculo de pontuação roc_auc multiclasse em sklearn.metrics usando uma metodologia contra todas seria incrivelmente útil.

New Feature

Comentários muito úteis

Na micro-média, sua taxa positiva verdadeira (TPR) é calculada tomando a soma de todos os TPs de todas as classes e dividindo pela soma de todos os TPs e FNs de todas as classes, ou seja, para um problema de 3 classes:
TPR = (TP1 + TP2 + TP3) / (TP1 + TP2 + TP3 + FN1 + FN2 + FN3)

Exemplo de matriz de confusão:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1 + 5 + 9) / (1 + 5 + 9 + (2 + 3) + (4 + 6) + (7 + 8))
Faça o mesmo para a taxa de falsos positivos e você pode calcular a AUC.

A média macro apenas calcula o TPR para cada classe separadamente e faz a média deles (ponderada pelo número de exemplos nessa classe ou não):
TPR = (1/3) * (TP1 / (TP1 + FN1) + TP2 / (TP2 + FN2) + TP2 / (TP2 + FN2))

Com o mesmo exemplo:
TPR = (1/3) * (1 / (1+ (2 + 3)) + 5 / (5+ (4 + 6)) + 9 / (9+ (7 + 8)))

Talvez isso ajude (usa precisão, mas a ideia é a mesma):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Eu pessoalmente nunca usaria uma média macro não ponderada, mas verei se consigo encontrar os artigos que estudaram isso.

Todos 47 comentários

Não tenho certeza do que isso significa. Você tem uma referência para isso?

Em 19 de junho de 2014, 09:51, Madison May [email protected] escreveu:

Solicitação de recurso de baixa prioridade: suporte para pontuação roc_auc multiclasse
cálculo em sklearn.metrics usando um contra toda a metodologia
seria incrivelmente útil.

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298.

Aqui está uma explicação bastante decente, junto com referências: https://www.cs.bris.ac.uk/~flach/ICML04tutorial/ROCtutorialPartIII.pdf

hmm, o que é um marcador recomendado enquanto o auc multiclasse não está implementado?

suporte para cálculo de pontuação roc_auc multiclasse em sklearn.metrics usando uma metodologia contra todas seria incrivelmente útil

Você está falando sobre o que esses slides consideram uma aproximação do volume sob a superfície em que a média ponderada de frequência da AUC para cada classe é obtida? Isso parece ser idêntico ao uso do roc_auc_score atual com uma representação binarizada e average='weighted' . ( @arjoly , por que essas pontuações baseadas em curvas não permitem multiclasse?)

Caso contrário, esses slides, e a maioria das referências que posso encontrar para "ROC multiclasse", focam na calibração multiclasse do OvR, não em uma métrica de avaliação. É nisso que você está interessado? Não tenho ideia de como essa técnica é difundida, se vale a pena tê-la disponível no scikit-learn e se a otimização gananciosa deve ser melhorada.

( @arjoly , por que essas pontuações baseadas em curvas não permitem multiclasse?)

Sempre que uma classe está faltando em y_true, não é possível calcular a pontuação. Eu não queria adicionar magia para a inferência de classe e colocava os usuários em problemas.

É possível que não estejamos tratando adequadamente no caso de y_pred
tendo um rótulo que y_true não tem. Esse rótulo provavelmente não deveria
participar de algo como uma média macro (de acordo com Weka,
também) ou uma pontuação ROC.

Em 1 de agosto de 2014 17:08, Arnaud Joly [email protected] escreveu:

( @arjoly https://github.com/arjoly, por que essas pontuações baseadas em curvas
não permitir multiclasse?)

Sempre que uma classe está faltando em y_true, não é possível calcular
a pontuação. Eu não queria adicionar a magia para a inferência da classe e consegui
usuário em problemas.

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -50855460
.

@jnothman @arjoly houve muito progresso na frente da média. É difícil implementar isso agora?

talvez possa ser semelhante à função R do pacote pROC
http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

Olá, implementei um rascunho da pontuação ROC / AUC da macro média, mas não tenho certeza se caberá no sklearn.

Aqui está o código:

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)

Poderia ser tão simples assim?

@fbrundu se este for o significado padrão. Certamente é uma interpretação possível.

Há um bom resumo aqui:
http://people.inf.elte.hu/kiss/13dwhdm/roc.pdf

O pacote pROC implementa 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% 253A% 252F% 252Flink.springer.com% 252Farticle% 252F10.1023% 252FA% 253A1010920819831 * ~ hmac = bc68686d3782ac6af3c3cda13c1b36aad6de5d01d16a25870cace5fe9699fb8a

A versão de Hand and Till parece ser geralmente aceita e eu voto para que a implementemos.
Há também uma versão de Provost e Domingos que provavelmente devo torcer, já que Provost é atualmente meu diretor, mas não pegou.
O Provost-Domingos é o que @fbrundu disse apenas com average='weighted' .

TLDR: PR for Hand and Till welcome. Opcionalmente Reitor e Domingos com opção de alteração da média.

Olá, houve algum progresso na implementação disso?
O que tenho visto na maioria das outras bibliotecas (por exemplo, WEKA) é que eles usam a média ponderada. Eu acho que é isso que @fbrundu propôs usando average = 'micro'?

@joaquinvanschoren R usa o Hand and Till. Eu também prefiro esse. Tenho um aluno que trabalhará nisso em breve.

@amueller eu posso trabalhar nisso :)

@ kchen17 obrigado!

Discutimos isso um pouco no OpenML. Para AUC multiclasse, não há garantias de que uma abordagem (macro-média, micro-média, média ponderada, ...) seja melhor do que a outra. No R, você pode encontrar pelo menos 5 abordagens diferentes (todas também disponíveis no MLR agora).
Ao implementar isso no scikit-learn, seria ótimo se houvesse pelo menos a possibilidade de escolher aquele que faz mais sentido para o seu aplicativo, mesmo se você usar o Hand-Till como padrão. A propósito, o Hand-Till é uma abordagem não ponderada, que não leva em consideração o desequilíbrio do rótulo.

Estou feliz por ter várias versões. não ponderado e "não levando em conta o desequilíbrio de rótulo" são duas coisas diferentes;) Você tem uma lista e referências?

O que é micro-média neste caso?

Observe que já calculamos a média micro e macro do ROC AUC para problemas multiclasse implementados neste exemplo:

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

Na verdade, acho que a documentação está incorreta e deveria dizer
multilabel ...

Em 26 de setembro de 2016 às 23:16, Olivier Grisel [email protected]
escreveu:

Não que já tenhamos feito micro e macro médias ROC AUC para multiclasse
problemas implementados neste exemplo:

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

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -249566346,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AAEz65IeU7k2CFwyHxTTAjk-5orIxWe6ks5qt8WsgaJpZM4CFzud
.

Na micro-média, sua taxa positiva verdadeira (TPR) é calculada tomando a soma de todos os TPs de todas as classes e dividindo pela soma de todos os TPs e FNs de todas as classes, ou seja, para um problema de 3 classes:
TPR = (TP1 + TP2 + TP3) / (TP1 + TP2 + TP3 + FN1 + FN2 + FN3)

Exemplo de matriz de confusão:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1 + 5 + 9) / (1 + 5 + 9 + (2 + 3) + (4 + 6) + (7 + 8))
Faça o mesmo para a taxa de falsos positivos e você pode calcular a AUC.

A média macro apenas calcula o TPR para cada classe separadamente e faz a média deles (ponderada pelo número de exemplos nessa classe ou não):
TPR = (1/3) * (TP1 / (TP1 + FN1) + TP2 / (TP2 + FN2) + TP2 / (TP2 + FN2))

Com o mesmo exemplo:
TPR = (1/3) * (1 / (1+ (2 + 3)) + 5 / (5+ (4 + 6)) + 9 / (9+ (7 + 8)))

Talvez isso ajude (usa precisão, mas a ideia é a mesma):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Eu pessoalmente nunca usaria uma média macro não ponderada, mas verei se consigo encontrar os artigos que estudaram isso.

Oi! Consegui começar a examinar esse problema na semana passada e gostaria de postar uma atualização rápida / algumas perguntas, apenas para ter certeza de que estou no caminho certo.

  • Até agora: estou começando com a implementação de uma função multiclass_roc_auc_score que, por padrão, terá algum parâmetro average definido como Nenhum. Esse padrão usará o algoritmo Hand-Till (conforme discutido, isso não leva em consideração o desequilíbrio do rótulo).
  • O método aceitaria os mesmos parâmetros daqueles em roc_auc_score ?
  • E saindo disso, a diferença seria que y_true poderia ter mais de 2 classes de rótulos. O Hand-Till envolveria encontrar todos os pares possíveis de rótulos, calculando roc_auc_score para cada um desses pares e, em seguida, calculando a média deles.

Deixe-me saber quais correções / sugestões você pode ter!

Normalmente, evitaríamos criar outra função se reutilizar roc_auc_score fosse razoavelmente viável. Acho que deixar o padrão como 'macro' é aceitável.

Uma coisa importante em que você deve pensar é como testar essas mudanças, incluindo alterar as características de roc_auc_score em metrics / tests / test_common.py

sim, devemos atualizar os documentos.

@joaquinvanschoren curiosamente, esse artigo não discutiu nenhum dos artigos

então, atualmente, temos apenas vários rótulos e, por isso, queremos adicionar multiclasse com 1vs1 e 1vsRest e cada um deles tem variantes ponderadas e não ponderadas.
Eu realmente não entendo como a média de sample e micro funciona para a AUC :(

Então ... Proponho que adicionemos um parâmetro multi-class ao AUC e que pode ser ovo ou ovr , e consideraremos o parâmetro de ponderação. Não tenho certeza se queremos permitir sample e micro pois isso realmente não faz sentido para mim.

@arjoly então micro e sample operam nas linhas em vez das colunas da matriz? Existe algum artigo sobre isso? Não encontrei isso na literatura ROC.

O problema com isso é que para tornar a medida de plantio manual padrão, teríamos que fazer o OvO médio ponderado e não podemos realmente alterar a opção de ponderação. Então, talvez façamos OVR por padrão e explicemos na narrativa que OvO com ponderação também é uma boa escolha e adicionamos uma referência?

O resumo do artigo @joaquinvanschoren citado também diz que todas as versões AUC fornecem praticamente os mesmos resultados.

@amueller : Tive a chance de ler seu comentário novamente e estou um pouco confuso sobre esta parte:

O problema com isso é que para tornar a medida de plantio manual padrão, teríamos que fazer o OvO médio ponderado e não podemos realmente alterar a opção de ponderação. Então, talvez façamos OVR por padrão e explicemos na narrativa que OvO com ponderação também é uma boa escolha e adicionamos uma referência?

Eu ia modificar roc_auc_score para incorporar um parâmetro multiclass=['ovo', 'ovr'] acordo com sua resposta. Se OvR for o padrão ( roc_auc_score(y_true, y_score, multiclass="ovo" ... ) ), mas Hand & Till for OvO, o que devo fazer ao abordar a parte OvR da implementação? (ou seja, se eu detectar que y_true é multiclasse, apenas levante um erro se "ovr" não estiver implementado e instrua os usuários a passarem em "ovo"?)

Desculpe, esperava que você implementasse ovo e ovr ;) Acho que deve ser bastante simples.

@amueller : Anotado e que também será incorporado! Também queria perguntar: há algum conselho sobre como detectar a diferença entre multiclasse e multilabel? No início, eu estava apenas verificando as dimensões de y_score mas rapidamente percebi que isso não seria suficiente. (ou seja, apenas verificar se os rótulos são apenas 0s e 1s?)

Multilabel significa que vários rótulos são previstos de uma vez: você obtém um
vetor de previsões por instância. Multiclasse significa que você obtém um único
previsão, mas essa previsão pode ter mais de dois valores (não é
binário).

Às vezes, as pessoas resolvem o caso multiclasse binarizando a saída, portanto
você obtém vários valores binários por instância (portanto, multilabel) e este
freqüentemente causa confusão.
No sábado, 8 de outubro de 2016 às 16:33, Kathy Chen [email protected] escreveu:

@amueller https://github.com/amueller : Anote e será
incorporado também! Também queria perguntar: há algum conselho sobre como
detectar a diferença entre multiclasse e multilabel? No começo eu era
apenas verificando as dimensões de y_score, mas rapidamente percebi isso
não seria suficiente.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252427642,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ABpQV7Mv0rHGEfrkYi5Xezz3PItyrLZ6ks5qx6mdgaJpZM4CFzud
.

Olá, espero que type_of_target possa resolver o propósito de diferenciar entre a saída multi-label e multi-class . HTH

usar type_of_target é uma boa ideia. Embora no scikit-learn, a dimensionalidade de y seja realmente o indicador se queremos fazer vários rótulos ou vários alvos. Se você binarizar a saída como @joaquinvanschoren , o

type_of_target é bom para distinguir entre y_trues, @amueller

Em 9 de outubro de 2016 às 05:18, Andreas Mueller [email protected]
escreveu:

usar type_of_target é uma boa ideia. Embora no scikit-aprenda o
dimensionalidade de y é realmente o indicador se queremos fazer
multi-rótulo ou multi-alvo. Se você binarizar a saída como
@joaquinvanschoren https://github.com/joaquinvanschoren sugerido
O scikit-learn sempre assumirá vários rótulos.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252439908,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AAEz6wa5fnE_LX3LLXbCoc0Z4hBbSAQ0ks5qx95rgaJpZM4CFzud
.

Olá a todos, gostaria de informar que enviei um PR "preliminar". Estou interessado em ouvir alguns comentários sobre a implementação (por exemplo, tenho certeza de que existem maneiras de aproveitar numpy / etc. De uma maneira melhor do que estou fazendo agora), junto com as melhores práticas para adicionar novos testes, texto de documentação, etc.

Obrigado por toda a ajuda até agora!

Algum progresso na adição de suporte multiclasse para AUC?

@joaquinvanschoren : trabalhando nas revisões após uma revisão do código por @jnothman em # 7663. Provavelmente apresentarei outra atualização na próxima semana, quando eu terminar as provas

Olá @kathyxchen , @jnothman ,

Alguma atualização no PR?

Apenas checando para ver se há algum progresso na adição de suporte multiclasse para AUC?

temos problemas para determinar o que é aceito e baseado em princípios
formulação de ROC AUC para multiclasse. Ver
https://github.com/scikit-learn/scikit-learn/pull/7663#issuecomment -307566895
e abaixo.

Então, companheiros. Há algum progresso com a pontuação auc multiclasse? Achei o código de documentação oficial muito confuso com o conjunto de dados da íris. Porque esse método mostra que meu modelo prevê números aleatórios muito bem.

Isso está quase pronto, precisamos decidir sobre um detalhe da API antes de mesclar: https://github.com/scikit-learn/scikit-learn/pull/12789#discussion_r295693965

@trendsearcher você pode fornecer um exemplo, por favor? Agora está mesclado, mas gostaria de ver o problema que você enfrentou.

Feliz em ajudar. Como posso dar um exemplo (tem muito código e pode não ser
intuitivo)? Talvez eu possa escrever em texto simples?

чт, 18 июл. 2019 г. 00:35, Andreas Mueller [email protected] :

@trendsearcher https://github.com/trendsearcher você pode fornecer um
exemplo por favor? Agora está mesclado, mas gostaria de ver o problema que você
com experiência.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298?email_source=notifications&email_token=AKS7QOFYRQY7RZJBWUVVJSTP76GDFA5CNFSM4AQXHOO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD2GU7EI#issuecomment-512577425 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AKS7QOFQ5LAIZ2ZBR4M4EATP76GDFANCNFSM4AQXHOOQ
.

Olá, implementei um rascunho da pontuação ROC / AUC da macro média, mas não tenho certeza se caberá no sklearn.

Aqui está o código:

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)

Poderia ser tão simples assim?

@fbrundu Obrigado por compartilhar! Tentei seu código. Mas quando eu chamo essa função, encontro um problema dizendo "Dados de destino de várias saídas não são compatíveis com a binarização de rótulo". Em seguida, removo o código "pred = lb.transform (pred)" da função. No entanto, encontro outro problema que "variáveis ​​de entrada encontradas com números inconsistentes de amostras: [198, 4284]".

Posso perguntar se você pode me ajudar a resolver isso? Obrigado!

@ Junting-Wang

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

você tem que usar predizer em vez de prediz_proba

@fbrundu sua implementação está correta? Eu uso e funciona.

Esta página foi útil?
0 / 5 - 0 avaliações