Coleção modelos
Curva ROC
Sensibilidade × especificidade em todos os cortes, com a AUC.
O que o bloco faz
models/roc desenha, para cada corte de probabilidade, a sensibilidade contra 1 − especificidade, com a área sob a curva (AUC) no subtítulo. A saída é view/plot.
Antes de continuar
Termos que esta página usa, em poucas palavras. As definições completas estão no glossário.
- Intervalo de confiança
- Uma faixa de valores calculada a partir da amostra. Com 95% de confiança, o procedimento produz intervalos que contêm o valor verdadeiro em 95% das amostras possíveis; não quer dizer que um intervalo específico tenha 95% de probabilidade de acertar.
- Variância
- A média dos quadrados das distâncias de cada valor à média: mede o quanto os dados se espalham. O desvio padrão é a raiz quadrada da variância e fica na mesma unidade dos dados.
- 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.
- Normalidade
- Pressuposto de que os erros do modelo seguem a distribuição normal (em forma de sino). Em modelos lineares ele se confere nos resíduos, não nos dados brutos; desvios leves pesam pouco em amostras grandes.
- 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
Use para comparar classificadores sem fixar um corte, sobretudo com classes desbalanceadas, em que a taxa de acerto engana.
Pressupostos
A medida que interessa é a fora da amostra: com o teste separado (
ml/split) emdados, ou pela validaçãocruzadaquando só o modelo está ligado. A resubstituição sai otimista, e mais ainda com muitos preditores e poucos casos. Previsões do treino marcado peloml/splitsão recusadas, salvopermitir_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/splitemdados, ou deixe avalidacaoemcruzada; se o teste já foi usado para escolher, reporte a medida como otimista.A probabilidade é a da classe positiva. Com
positivavazia, na binária ela é o segundo nível; no modo tabela, com a colunaprobabilidadeinformada, a classe é deduzida do nomeprob_<classe>, e o bloco pedepositivase o nome não indicar uma classe observada. Classe e coluna trocadas espelham a curva (AUC = 1 − AUC).Se falhar: Com uma coluna de nome livre, preencha
positivacom a classe cuja probabilidade ela contém.A AUC resume todos os cortes, inclusive os que ninguém usaria, e não muda com o desequilíbrio das classes — por isso mesmo pode parecer boa quando a classe rara é mal prevista.
Verificar:Matriz de confusãoAgrupar e resumir
Se falhar: Leia junto a matriz de confusão, a acurácia balanceada no
models/evaluatee, com classe rara, amodels/pr_curve.Com três ou mais classes, cada curva é uma classe contra as outras: a AUC de cada uma não soma nem resume o classificador inteiro. O resumo é a AUC multiclasse M de Hand & Till (2001), no subtítulo (sem
positiva): média, sobre os pares de classes, da AUC do par; não depende das proporções das classes, mas pondera todos os pares igualmente e não tem intervalo.Se falhar: Para saber qual par se confunde, leia a matriz de confusão (
models/confusion).O intervalo de DeLong é assintótico (normal): com poucos positivos ou negativos, ou AUC perto de 1, a cobertura fica abaixo do nominal; o bloco corta os limites em [0, 1]. Com AUC = 0 ou 1 (variância zero) ou menos de duas linhas numa classe, o IC sai indisponível (NA), com a nota em
auc_notae na legenda; a curva e a AUC continuam.Se falhar: Leia o intervalo como aproximado e a largura como sinal de pouca informação; aumente a amostra da classe rara ou repita a divisão com outras sementes.
Com validação cruzada, as probabilidades vêm de n ajustes, e o intervalo as trata como um escore fixo: a incerteza de ter estimado o modelo não entra.
O corte de Youden é escolhido nas mesmas linhas em que é lido: a sensibilidade e a especificidade nele são otimistas, e J pesa igualmente falso positivo e falso negativo, o que raramente reflete os custos reais.
Se falhar: Escolha o corte num conjunto de validação (ou pelos custos do problema) e leia o desempenho dele no teste, com o
models/confusion.
Configuração
Mesmas entradas opcionais da matriz de confusão (só modelo, modelo e dados, ou só dados). Classe positiva vazia é o segundo nível; com três ou mais classes sai uma curva por classe, contra as outras. No modo tabela, Probabilidade vazia lê prob_<positiva>, a coluna que models/predict escreve.
Confiança do IC da AUC — cada AUC sai com o intervalo de DeLong, DeLong & Clarke-Pearson (1988), no nível pedido (padrão 0,95): assintótico, cortado em [0, 1]. Com AUC 0 ou 1 (variância zero) ou menos de duas linhas numa classe, o intervalo sai indisponível e a legenda explica, sem recusar a curva. Na curva de uma classe, o círculo vazio marca o corte de Youden (1950), que maximiza sensibilidade + especificidade − 1. Com três ou mais classes e positiva vazia, o subtítulo traz a AUC multiclasse M de Hand & Till (2001), a média das AUCs dos pares de classes, que não depende das proporções.
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
library(trama)
reg <- tr_registry()
tr_use("trama.models", registry = reg)
tr_flow(reg) |>
tr_add("dados", "models/example", dataset = "mtcars") |>
tr_add("logit", "models/glm", formula = "am ~ wt", familia = "binomial", from = "dados") |>
tr_add("roc", "models/roc", validacao = "cruzada", from = "logit")Como interpretar
A diagonal tracejada é o acaso (AUC 0,5); quanto mais a curva sobe para o canto superior esquerdo, melhor. O ponto marca o corte do modelo (0,5, ou o corte da logística multivariada).
Implementação
trama.models::tr_models_roc()versão 0.6.6Cálculo próprio: um ponto por escore distinto (empates andam na diagonal) e AUC de Mann-Whitney com meio ponto por empate, igual à área trapezoidal da curva; IC de DeLong pelas componentes estruturais (normal, cortado em [0, 1]), conferido contrapROC::ci.auc(method = "delong")a 1e-8; corte de Youden = máximo de sensibilidade + especificidade − 1 (empate: maior limiar), conferido contrapROC::coords(best.method = "youden"); M de Hand & Till conferido contrapROC::multiclass.roca 1e-10. Portes daml/roce damulti/rocda main.
No código O bloco chama trama.models::tr_models_roc(), em trama.models/R/avaliar.R:345.
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 (20)
stats::complete.cases(par$prob)stats::var(v10)stats::qnorm(1 - (1 - confianca)/2)ggplot2::ggplot(rd$curvas)ggplot2::geom_line(data = diag_df, ggplot2::aes(x = .data[["x"]], y = .data[["y"]]), colour = "#8b949e", linetype = "dashed")ggplot2::aes(x = .data[["x"]], y = .data[["y"]])ggplot2::geom_path(data = cur, ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]]), colour = .TR_MODELS_COR, linewidth = 0.9)ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]])ggplot2::geom_point(data = yd, ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]]), colour = .TR_MODELS_COR, shape = 21, fill = "white", size = 3, stroke = ...ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]])ggplot2::geom_point(data = rd$ponto, ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]]), colour = .TR_MODELS_COR_2, size = 3)ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]])ggplot2::labs(subtitle = sub)ggplot2::geom_path(data = cur, ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]], colour = .data[["grupo"]], group = .data[["grupo"]]), linewidth = 0.8)ggplot2::aes(x = .data[["fpr"]], y = .data[["tpr"]], colour = .data[["grupo"]], group = .data[["grupo"]])ggplot2::labs(colour = par$resposta, subtitle = if (is.na(rd$hand_till)) sprintf("Cada classe contra as outras · %s", par$origem) else sprintf("Cada classe c...ggplot2::labs(caption = paste(notas, collapse = "\n"))ggplot2::coord_equal(xlim = c(0, 1), ylim = c(0, 1))ggplot2::labs(x = "1 − especificidade (falsos positivos)", y = "sensibilidade (verdadeiros positivos)")trama.view::tr_view_finish(p, aspecto, tema, titulo, rotulo_x, rotulo_y, legenda)
Referências
Teoria
- Hanley, J. A.; McNeil, B. J. (1982). The meaning and use of the area under a receiver operating characteristic (ROC) curve. Radiology, 143(1), 29-36. doi:10.1148/radiology.143.1.7063747
- Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861-874. doi:10.1016/j.patrec.2005.10.010
- DeLong, E. R.; DeLong, D. M.; Clarke-Pearson, D. L. (1988). Comparing the areas under two or more correlated receiver operating characteristic curves: a nonparametric approach. Biometrics, 44(3), 837-845. doi:10.2307/2531595
- Hand, D. J.; Till, R. J. (2001). A simple generalisation of the area under the ROC curve for multiple class classification problems. Machine Learning, 45(2), 171-186. doi:10.1023/A:1010920819831
- Youden, W. J. (1950). Index for rating diagnostic tests. Cancer, 3(1), 32-35. doi:10.1002/1097-0142(1950)3:1<32::AID-CNCR2820030106>3.0.CO;2-3
Complementar
- 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
- Robin, X.; Turck, N.; Hainard, A.; Tiberti, N.; Lisacek, F.; Sanchez, J.-C.; Müller, M. (2011). pROC: an open-source package for R and S+ to analyze and compare ROC curves. BMC Bioinformatics, 12, 77. doi:10.1186/1471-2105-12-77