Como calcular a precisão / recall para a classificação multiclass-multilabel?


72

Eu estou querendo saber como calcular medidas de precisão e recall para classificação de várias etiquetas multiclass, ou seja, classificação onde há mais de dois rótulos e onde cada instância pode ter vários rótulos?


11
a parte multilabel torna muito mais difícil e eu também estou interessado nisso. Eu acho que não é aplicável a problemas com vários rótulos, mas não confia em mim.
User798719

11
De fato, todos os problemas com várias etiquetas são multiclasses, portanto, você pode usar o pacote utiml no R, por exemplo, ou o Mulan, em Java.
Adriano Rivolli

Respostas:


19

Outra ferramenta popular para medir o desempenho do classificador é o ROC / AUC ; este também possui uma extensão multi-class / multi-label: veja [Hand 2001]

[Hand 2001]: Uma simples generalização da área sob a curva ROC para problemas de classificação de múltiplas classes


É popular, mas pode ser de buggy. Eu não confio inteiramente nisso. stats.stackexchange.com/questions/93901/…
EngrStudent

3
Nunca mude o estouro da pilha! Guy pede um problema, a resposta mais votada na verdade não responder a sua pergunta, mas salienta alguma outra ferramenta / biblioteca que seria melhor
ragvri

Sim, como esta resposta pode ter +20? Nem sequer contém as palavras precisão e recordação.
Simon Dirmeier 21/01

se você pensar bem, perceberá que a precisão e o recall são realmente capturados pela AUC.
oDDsKooL 30/01

16

Aqui estão algumas discussões sobre o tópico do fórum do Coursera sobre matriz de confusão e medição de precisão / recall de várias classes.

A idéia básica é calcular toda a precisão e recuperação de todas as classes e, em seguida, calculá-las para obter uma única medida de número real.

A matriz de confusão facilita o cálculo da precisão e recuperação de uma classe.

Abaixo está uma explicação básica sobre a matriz de confusão, copiada desse segmento:

Uma matriz de confusão é uma maneira de classificar verdadeiros positivos, verdadeiros negativos, falsos positivos e falsos negativos, quando há mais de 2 classes. É usado para calcular a precisão e o recall e, portanto, a pontuação f1 para problemas de várias classes.

Os valores reais são representados por colunas. Os valores previstos são representados por linhas.

Exemplos:

10 exemplos de treinamento que são realmente 8, são classificados (previstos) incorretamente como 5
13 exemplos de treinamento que são realmente 4, são classificados incorretamente como 9

Matriz de Confusão

cm =
     0 1 2 3 4 5 6 7 8 9 10
     1 298 2 1 0 1 1 3 1 1 0
     2 0 293 7 4 1 0 5 2 0 0
     3 1 3 263 0 8 0 0 3 0 2
     4 1 5 0 261 4 0 3 2 0 1
     5 0 0 10 0 254 3 0 10 2 1
     6 0 4 1 1 4 300 0 1 0 0
     7 1 3 2 0 0 0 264 0 7 1
     8 3 5 3 1 7 1 0 289 1 0
     9 0 1 3 13 1 0 11 1 289 0
    10 0 6 0 1 6 1 2 1 4 304

Para a classe x:

  • Verdadeiro positivo: posição diagonal, cm (x, x).

  • Falso positivo: soma da coluna x (sem diagonal principal), soma (cm (:, x)) - cm (x, x).

  • Falso negativo: soma da linha x (sem diagonal principal), soma (cm (x, :), 2) -cm (x, x).

Você pode calcular precisão, recall e pontuação F1 seguindo a fórmula do curso.

A média de todas as classes (com ou sem ponderação) fornece valores para o modelo inteiro.


2
Você tem seus eixos invertidos. Com base no que você escreveu, seu CM deve ser transposto.
Spacey

@ Tarantula Por que você acha isso? Eu acho que ele está correto.
21417 shahensha

@shahensha Experimente uma coluna, está errado.
Spacey

11
O link para o segmento Coursera está quebrado
shark8me

8
Não acredito que esta resposta lide com o problema de vários rótulos. aplica-se a problemas de várias classes. Qual é a noção de falso positivo ou falso negativo em problemas com vários rótulos?
User798719

13

Para a classificação de vários rótulos, você tem dois caminhos a seguir Primeiro considere o seguinte.

  • n é o número de exemplos.
  • Yi é a atribuição do rótulo de verdade do exemplo.ith
  • xi é o exemplo.ith
  • h(xi) são os rótulos previstos para o exemplo.ith

Baseado em exemplos

As métricas são calculadas de maneira por ponto de dados. Para cada rótulo previsto, apenas sua pontuação é calculada e, em seguida, essas pontuações são agregadas em todos os pontos de dados.

  • Precisão = , A proporção de quanto do previsto está correto. O numerador descobre quantos rótulos no vetor previsto têm em comum com a verdade básica e a razão calcula quantos dos verdadeiros rótulos reais previstos estão realmente na verdade básica.1ni=1n|Yih(xi)||h(xi)|
  • Lembre-se = , o proporção de quantos dos rótulos reais foram previstos. O numerador descobre quantos rótulos no vetor previsto têm comum com a verdade do terreno (como acima) e, em seguida, localiza a proporção do número de rótulos reais, obtendo, portanto, qual fração dos rótulos reais foram previstos.1ni=1n|Yih(xi)||Yi|

Existem outras métricas também.

Baseado em etiqueta

Aqui as coisas são feitas em termos de etiquetas. Para cada etiqueta, as métricas (por exemplo, precisão, recall) são computadas e, em seguida, essas métricas são agregadas. Portanto, nesse caso, você acaba computando a precisão / rechamada de cada rótulo em todo o conjunto de dados, como faz para uma classificação binária (como cada rótulo possui uma atribuição binária) e depois a agrega.

A maneira mais fácil é apresentar a forma geral.

Esta é apenas uma extensão do equivalente padrão de várias classes.

  • Macro com média1qj=1qB(TPj,FPj,TNj,FNj)

  • Micro médioB(j=1qTPj,j=1qFPj,j=1qTNj,j=1qFNj)

Aqui, o são as contagens positivas positivas, falsas positivas, verdadeiras negativas e falsas negativas, respectivamente, apenas para o rótulo . j t hTPj,FPj,TNj,FNjjth

Aqui representa qualquer uma das métricas baseadas em matriz de confusão. No seu caso, você deve inserir as fórmulas padrão de precisão e recall. Para a média macro, você passa a contagem por etiqueta e depois soma; para a média média, você calcula a média primeiro das contagens e aplica sua função métrica.B

Você pode estar interessado em ter um olhar para o código para as métricas de marca mult aqui , que uma parte do pacote mldr em R . Além disso, você pode estar interessado em procurar na biblioteca MULTI -label Java .

Este é um artigo interessante para conhecer as diferentes métricas: Uma revisão sobre algoritmos de aprendizado de etiquetas múltiplas


Seria bom se você pudesse ter fornecido referências sobre a autenticidade das métricas que você escreveu, como algumas referências da Wikipedia. As referências que você mencionou são a parte de codificação das métricas ou do trabalho de pesquisa ..
hacker315

2
Um documento de revisão já está vinculado no final da resposta (Uma revisão sobre algoritmos de aprendizado de vários rótulos) ieeexplore.ieee.org/document/6471714 . Essas são métricas bem conhecidas na literatura, com base nas quais as implementações são feitas. Não sei como demonstrar autenticidade.
phoxis 6/03

8

Eu não sei sobre a parte com vários rótulos, mas para a classificação da classe mutli esses links o ajudarão

Este link explica como criar a matriz de confusão que você pode usar para calcular a precisão e recuperação de cada categoria

E este link explica como calcular medidas micro-f1 e macro-f1 para avaliar o classificador como um todo.

espero que você tenha achado isso útil.


4
O ponto principal é: existem várias maneiras válidas possíveis de calcular essas métricas (por exemplo, micro-F1 vs macro-F1) porque existem várias maneiras de definir o que é correto. Isso depende dos critérios de aplicação e validade.
Jack Tanner

Ahmed: Obrigado pelos links! @JackTanner Você talvez tenha uma referência para isso (no caso da classificação multi-rótulo com várias classes)?
Vam 28/01/12

11
@ MaVe, desculpe, não há links. Isto é apenas por experiência pessoal. Você chegará lá simplesmente pensando no que constitui, digamos, um verdadeiro positivo e um falso positivo para seus propósitos.
Jack Tanner

4
Primeiro link morreu
Nikana Reklawyks 03/08

1

este link me ajudou .. https://www.youtube.com/watch?v=HBi-P5j0Kec Espero que ajude você também

diga a distribuição como abaixo

    A   B   C   D
A   100 80  10  10
B   0    9   0   1
C   0    1   8   1
D   0    1   0   9

a precisão para A seria

P (A) = 100/100 + 0 + 0 +0 = 100

P (B) = 9/9 + 80 + 1 + 1 = 9/91 psst ... essencialmente, pegue o verdadeiro positivo da classe e divida pelos dados da coluna nas linhas

recordar para um seria

R (A) = 100 / 100+ 80 + 10 + 10 = 0,5

R (B) = 9/9 + 0 + 0 + 1 = 0,9

psst ... essencialmente pegue o verdadeiro positivo da classe e divida pelos dados da linha nas colunas

depois de obter todos os valores, faça a média macro

média (P) = P (A) + P (B) + P (C) + P (D) / 4

média (R) = R (A) + R (B) + R (C) + R (D) / 4

F1 = 2 * média (P) * média (R) / média (P) + média (R)


0

Confira esses slides em cs205.org em Harvard . Quando você chega à seção Medidas de erro, há uma discussão sobre precisão e recuperação em configurações de várias classes (por exemplo, um contra todos ou um contra um) e matrizes de confusão. Matrizes de confusão é o que você realmente deseja aqui.

Para sua informação, no pacote de software Python scikits.learn , existem métodos internos para calcular automaticamente coisas como a matriz de confusão de classificadores treinados em dados de várias classes. Provavelmente, ele também pode calcular diretamente plotagens de recall de precisão. Vale uma olhada.


4
Infelizmente, o link para os slides está morto e eu pude encontrá-los em outro lugar.
F3lix 5/10/12

Ele será reabastecido quando chegarem a essa palestra no curso deste ano. Se eu pudesse copiar o PDF para um local de link permanente, eu o faria, mas não posso, portanto a quebra periódica é inevitável e não haverá outro lugar para encontrar as anotações, elas são específicas para esse curso.
Ely

não sklearn não suporta multi-rótulo para matriz de confusão github.com/scikit-learn/scikit-learn/issues/3452
Franck Dernoncourt


0

Exatamente da mesma maneira que você faria em casos gerais, com conjuntos:

http://en.wikipedia.org/wiki/F1_score

http://en.wikipedia.org/wiki/Precision_and_recall

Aqui estão funções simples do Python que fazem exatamente isso:

def precision(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1


def recall(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    return len(i) / len(y_true)


def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    if p + r == 0:
        return 0
    else:
        return 2 * (p * r) / (p + r)


if __name__ == '__main__':
    print(f1(['A', 'B', 'C'], ['A', 'B']))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.