Coleção modelos

Curva precisão-revocação

Precisão × revocação em todos os cortes, com a precisão média (AP).

O que o bloco faz

Ordena as linhas pela probabilidade da classe positiva e mostra, em cada corte, a precisão (dos previstos positivos, quantos são) contra a revocação (dos positivos, quantos foram achados). Calcula a precisão média (AP) e desenha a prevalência como a linha do acaso.

Antes de continuar

Termos que esta página usa, em poucas palavras. As definições completas estão no glossário.

População
O conjunto completo de unidades sobre o qual se quer concluir algo: todas as propriedades de uma região, todos os alunos de uma escola. Em geral não é possível medir todas, e por isso se mede uma amostra.
Amostra
A parte da população que é de fato observada. Quando é sorteada com probabilidades conhecidas, permite estimar características da população e medir a incerteza dessa estimativa.
Nível
Cada valor que um fator assume no estudo: as doses 0, 50 e 100 kg/ha são três níveis do fator dose.
Treino e teste
Dividir os dados em uma parte para ajustar o modelo (treino) e outra, guardada, para medir o desempenho (teste). O teste só é honesto se o modelo nunca o viu durante o ajuste.
Matriz de confusão
A tabela que cruza a classe verdadeira com a classe prevista. Dela saem acurácia, sensibilidade, especificidade e precisão, que podem contar histórias diferentes quando as classes têm tamanhos muito diferentes.

Quando usar

Quando a classe de interesse é rara. A ROC não muda com o desequilíbrio e pode parecer boa enquanto quase todos os alarmes são falsos; a curva precisão-revocação mostra isso diretamente (Saito & Rehmsmeier 2015).

Pressupostos

  • A medida que interessa é a fora da amostra: com o teste separado (ml/split) em dados, ou pela validação cruzada quando só o modelo está ligado. A resubstituição sai otimista, e mais ainda com muitos preditores e poucos casos. Previsões do treino marcado pelo ml/split são recusadas, salvo permitir_treino (que acrescenta a nota de otimismo); tabelas sem essa marca (divisão feita por fora, treino e teste juntados) são medidas como chegam, e num teste já usado para decidir a medida também sai otimista — isso nenhuma marca detecta.

    Se falhar: Ligue a saída teste do ml/split em dados, ou deixe a validacao em cruzada; se o teste já foi usado para escolher, reporte a medida como otimista.

  • A probabilidade é a da classe positiva** — a classe de interesse, em geral a rara; com três ou mais classes, ela contra as outras. Com positiva vazia: no modo tabela a classe vem do nome da coluna (prob_<classe>), e com coluna de nome livre o bloco pede positiva; com modelo, é o segundo nível.

    Se falhar: Preencha positiva com a classe cuja probabilidade a coluna contém.

  • A referência do acaso é a prevalência da classe positiva, não 0,5: a AP só diz algo comparada a ela, e a curva de um conjunto com outra prevalência não é comparável (Saito & Rehmsmeier 2015).

    Verificar:Agrupar e resumir

    Se falhar: Compare modelos no mesmo teste; para comparar populações diferentes, leia a ROC.

  • A AP (soma de ganho de revocação × precisão) e a área interpolada de Davis & Goadrich são estimativas diferentes da mesma área; ligar os pontos por reta superestima a área e não é usado (Davis & Goadrich 2006).

    Se falhar: Reporte uma delas nomeada; a AP é a do yardstick e do scikit-learn, a área é a do PRROC.

  • Com poucos positivos a curva tem poucos degraus e a AP varia muito de um teste para outro.

    Se falhar: Leia a quantidade de positivos (prevalencia × n) e repita a divisão com outras sementes.

Configuração

Como a models/roc, tem três modos: ligue só um modelo (a curva sai da validação, cruzada ou resubstituição), um modelo e uma tabela de teste em dados, ou só uma tabela com a classe e a probabilidade. No modo tabela, resposta é a classe observada e probabilidade a coluna prob_<classe> (de models/predict). positiva escolhe a classe de interesse: vazia, no modo tabela é a do nome da coluna (com coluna de nome livre o bloco pede positiva); com modelo, o segundo nível. Com três ou mais classes é obrigatória, e a curva é ela contra as outras.

Com três ou mais classes e Classe positiva vazia, sai uma curva por classe contra as outras, com a AP e o acaso (a prevalência) de cada uma na legenda.

Permitir avaliar o treino — com dados vindos do ml/split (a tabela leva a marca de treino/teste), previsões das linhas de treino são recusadas (tr_ml_error_train_eval): a medida no treino é otimista. Ligado, avalia assim mesmo e acrescenta a nota de otimismo. Tabela sem a marca é avaliada como chega.

Exemplo

d <- data.frame(y = c("sim", "nao", "sim", "nao", "sim"), prob_sim = c(.9, .8, .7, .6, .2))
p <- trama.models::tr_models_pr_curve(dados = d, resposta = "y", probabilidade = "prob_sim")
p$data

Como interpretar

No exemplo, os cortes dão (revocação, precisão) = (0,33; 1), (0,33; 0,5), (0,67; 0,67), (0,67; 0,5) e (1; 0,6). A AP soma ganho de revocação × precisão: (1 + 0,667 + 0,6)/3 = 0,756. A area, com a interpolação de Davis & Goadrich (2006), é 0,716 — menor porque entre dois cortes a precisão não varia em linha reta. Compare as duas com a prevalência, 0,6 aqui: um classificador ao acaso fica nessa linha.

Previsões do treino

Se as linhas vierem do treino marcado pelo ml/split, o bloco recusa por padrão (tr_ml_error_train_eval): a avaliação no treino é otimista e não mede generalização. Para medir o ajuste no treino de propósito (por exemplo, comparar com o teste e ver o sobreajuste), ligue permitir_treino; o resultado vem com um aviso e a nota de otimismo. O mesmo vale para uma tabela marcada como teste que traz linhas de fora dele (previsões do treino juntadas às do teste). Tabelas sem a marca do ml/split são avaliadas como chegam.

Implementação

  • trama.models::tr_models_pr_curve() versão 0.6.6Cálculo próprio (porte da ml/pr_curve da main): um ponto por limiar distinto (empates num degrau); AP = Σ ΔR·P; área com a interpolação de Davis & Goadrich integrada em forma fechada. Conferido contra yardstick::average_precision e PRROC::pr.curve (auc.integral).

No código O bloco chama trama.models::tr_models_pr_curve(), em trama.models/R/avaliar.R:400.

A conta é implementada pelo próprio trama, sem um pacote R de referência por trás.

Outras funções de pacotes que o bloco usa (16)
  • stats::complete.cases(par$prob)

    em .tr_models_sem_na() · trama.models/R/avaliar.R:93

  • ggplot2::ggplot(d, ggplot2::aes(x = .data[["recall"]], y = .data[["precision"]], colour = .data[["grupo"]], group = .data[["grupo"]]))

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:373

  • ggplot2::aes(x = .data[["recall"]], y = .data[["precision"]], colour = .data[["grupo"]], group = .data[["grupo"]])

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:373

  • ggplot2::geom_step(direction = "vh", linewidth = 0.8)

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:373

  • ggplot2::coord_cartesian(xlim = c(0, 1), ylim = c(0, 1))

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:373

  • ggplot2::labs(colour = par$resposta, x = "Revocação", y = "Precisão", subtitle = sprintf("Cada classe contra as outras · %s", par$origem), caption = if (nzch...

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:373

  • trama.view::tr_view_finish(p, aspecto, tema, titulo, rotulo_x, rotulo_y, legenda)

    em .tr_models_pr_multiclasse() · trama.models/R/avaliar.R:380

  • ggplot2::ggplot(d, ggplot2::aes(x = .data$recall, y = .data$precision))

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::aes(x = .data$recall, y = .data$precision)

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::geom_hline(yintercept = d$prevalencia[[1]], linetype = 2, colour = "#94a3b8")

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::geom_step(direction = "vh", linewidth = 1, colour = .TR_MODELS_COR)

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::geom_point(size = 1.6, colour = .TR_MODELS_COR)

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::coord_cartesian(xlim = c(0, 1), ylim = c(0, 1))

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::annotate("text", x = 0.3, y = 0.08, label = sprintf("AP = %.3f  (acaso = %.3f)", d$ap[[1]], d$prevalencia[[1]]))

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • ggplot2::labs(x = "Revocação", y = "Precisão", subtitle = sprintf("AP %s · acaso %s · área (Davis & Goadrich) %s · %s · positivo: %s", .tr_models_virgula(d$a...

    em tr_models_pr_curve() · trama.models/R/avaliar.R:427

  • trama.view::tr_view_finish(p, aspecto, tema, titulo, rotulo_x, rotulo_y, legenda)

    em tr_models_pr_curve() · trama.models/R/avaliar.R:439

Referências

Teoria

  • Saito, T.; Rehmsmeier, M. (2015). The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets. PLOS ONE, 10(3), e0118432. doi:10.1371/journal.pone.0118432
  • Davis, J.; Goadrich, M. (2006). The relationship between Precision-Recall and ROC curves. Proceedings of the 23rd International Conference on Machine Learning (ICML), 233-240. doi:10.1145/1143844.1143874

Complementar

  • Keilwagen, J.; Grosse, I.; Grau, J. (2014). Area under Precision-Recall Curves for Weighted and Unweighted Data. PLoS ONE, 9(3), e92209. doi:10.1371/journal.pone.0092209
  • Su, W.; Yuan, Y.; Zhu, M. (2015). A Relationship between the Average Precision and the Area Under the ROC Curve. Proceedings of the 2015 International Conference on the Theory of Information Retrieval (ICTIR), 349-352. doi:10.1145/2808194.2809481

Ver a bibliografia completa do trama