Como determinar a qualidade de um classificador multiclasse

30

Dado

  • um conjunto de dados com instâncias juntamente com classes em que cada instância pertence exatamente a uma classexiNxiyi
  • um classificador multiclasse

Após o treinamento e o teste, basicamente tenho uma tabela com a classe verdadeira e a classe prevista para cada instância no conjunto de testes. Portanto, para cada instância, tenho uma correspondência ( ) ou uma falta ( ).yiaixiyi=aiyiai

Como posso avaliar a qualidade da partida? O problema é que algumas classes podem ter muitos membros, ou seja, muitas instâncias pertencem a ela. Obviamente, se 50% de todos os pontos de dados pertencem a uma classe e meu classificador final está 50% correto no geral, não ganhei nada. Eu poderia muito bem ter feito um classificador trivial que gera a maior classe, independentemente da entrada.

Existe um método padrão para estimar a qualidade de um classificador com base nos resultados conhecidos do conjunto de testes de correspondências e acertos para cada classe? Talvez seja importante distinguir as taxas de correspondência para cada classe em particular?

A abordagem mais simples que consigo pensar é excluir as correspondências corretas da maior classe. O quê mais?

Gerenuk
fonte
Não tenho certeza se entendi a pergunta corretamente. Você conhece a Matriz de Confusão e medidas derivadas ? Essa é a resposta para sua pergunta? Ou você se refere a algo mais complicado?
Steffen
Eu acho que essa é a fonte da minha confusão: no primeiro parágrafo, você declara .. onde yi são as classes reais e ... : Você quer dizer que uma instância pode pertencer a / tem mais de uma classe? Ou todo pertence a / tem exatamente uma classe? Você pode esclarecer por favor ? xixi
27612 steffen
@ steffen: Eu vi a matriz de confusão. No meu caso particular, tenho 4 aulas. Portanto, não tenho certeza de quais medidas derivadas podem ser usadas e que faria sentido. Cada pertence a apenas uma classe. No entanto, existem mais de duas classes possíveis no geral . xii[1,,N]
Gerenuk)
@steffen Essas medidas derivadas são aplicáveis ​​principalmente à classificação binária , enquanto esta pergunta está explicitamente relacionada a mais de duas classes. Isso requer uma compreensão modificada de termos como "verdadeiro positivo".
22612 Michael McGowan
@MichaelMcGowan Pedi esclarecimentos ao OP e depois realizei uma edição para refletir explicitamente o problema de várias classes, o que não era óbvio antes da edição (IMHO).
Steffen

Respostas:

16

Como a classificação binária, você pode usar a taxa de erro empírica para estimar a qualidade do seu classificador. Seja um classificador e e sejam respectivamente um exemplo em sua base de dados e em sua classe. Como você disse, quando as classes são desequilibradas, a linha de base não é 50%, mas a proporção da classe maior. Você pode adicionar um peso em cada classe para equilibrar o erro. Seja o peso da classe . Defina os pesos de modo que e defina o erro empírico ponderadogxiyi

err(g)=1nin1g(xi)yi
Wyy1Wy1nin1yi=y
errW(g)=1ninWyi1g(xi)yi

Como Steffen disse, a matriz de confusão pode ser uma boa maneira de estimar a qualidade de um classificador. No caso binário, você pode derivar alguma medida dessa matriz, como sensibilidade e especificidade, estimando a capacidade de um classificador para detectar uma classe específica. A fonte do erro de um classificador pode estar de uma maneira específica. Por exemplo, um classificador pode ser muito confiante ao prever um 1, mas nunca dizer errado ao prever um 0. Muitos classificadores podem ser parametrizados para controlar essa taxa (falsos positivos versus falsos negativos) e, em seguida, você está interessado na qualidade do família inteira de classificador, não apenas um. A partir disso, você pode plotar a curva ROC e medir a área sob a curva ROC fornece a qualidade desses classificadores.

As curvas ROC podem ser estendidas para o seu problema de multiclasse. Eu sugiro que você leia a resposta deste tópico .

Emile
fonte
11
Não é necessário dividir o erro empírico ponderado pelo número de classes, para estar na mesma escala que o erro empírico? Caso contrário, seria muito maior ...
PhilippPro
17

Para avaliar os sistemas de classificação de texto de múltiplas vias, utilizo F1 com média e macro médias (medida F). A medida F é essencialmente uma combinação ponderada de precisão e lembre-se disso. Para a classificação binária, as abordagens micro e macro são as mesmas, mas, para o caso de múltiplas vias, acho que elas podem ajudá-lo. Você pode pensar no Micro F1 como uma combinação ponderada de precisão e recall que confere peso igual a todos os documentos, enquanto a Macro F1 oferece peso igual a todas as classes. Para cada um deles, a equação da medida F é a mesma, mas você calcula a precisão e lembra de forma diferente:

F=(β2+1)PRβ2P+R,

onde é normalmente definido como 1. Em seguida,β

Pmicro=i=1|C|TPii=1|C|TPi+FPi,Rmicro=i=1|C|TPii=1|C|TPi+FNi

Pmacro=1|C|i=1|C|TPiTPi+FPi,Rmacro=1|C|i=1|C|TPiTPi+FNi

onde é verdadeiro positivo, é falso positivo, é falso negativo e é classe.TPFPFNC

Kyle.
fonte
1
# Function in R, using precision, recall and F statistics

check.model.accuracy <- function(predicted.class, actual.class){

  result.tbl <- as.data.frame(table(predicted.class,actual.class ) ) 

  result.tbl$Var1 <- as.character(result.tbl$predicted.class)
  result.tbl$Var2 <- as.character(result.tbl$actual.class)

  colnames(result.tbl)[1:2] <- c("Pred","Act")

  cntr <- 0  
  for (pred.class in unique(result.tbl$Pred) ){
    cntr <- cntr+ 1
    tp <- sum(result.tbl[result.tbl$Pred==pred.class & result.tbl$Act==pred.class, "Freq"])
    tp.fp <- sum(result.tbl[result.tbl$Pred == pred.class , "Freq" ])
    tp.fn <- sum(result.tbl[result.tbl$Act == pred.class , "Freq" ])
    presi <- tp/tp.fp 
    rec <- tp/tp.fn
    F.score <- 2*presi*rec/(presi+rec)
    if (cntr == 1 ) F.score.row <- cbind(pred.class, presi,rec,F.score)
    if (cntr > 1 ) F.score.row <- rbind(F.score.row,cbind(pred.class,presi,rec,F.score))
  }

  F.score.row <- as.data.frame(F.score.row) 
  return(F.score.row)
}

check.model.accuracy(predicted.df,actual.df) 
# For multiclass, average across all classes 
Ashish Markanday
fonte
5
Você pode adicionar algum texto para explicar isso?
gung - Restabelece Monica