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?
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?
Respostas:
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
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.
Para a classificação de vários rótulos, você tem dois caminhos a seguir Primeiro considere o seguinte.
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.
Existem outras métricas também.
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édia
Micro médio
Aqui, o são as contagens positivas positivas, falsas positivas, verdadeiras negativas e falsas negativas, respectivamente, apenas para o rótulo . j t h
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.
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
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.
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)
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.
De Ozgur et al (2005), é possível ver que você deve calcular o Precision and Recall seguindo as expressões normais, mas, em vez de calcular a média do total de N instâncias no seu conjunto de dados, use N = [instâncias com pelo menos um rótulo com o classe em questão atribuída a].
aqui está a referência mencionada: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf
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']))