Exemplo ao usar a precisão como uma medida de resultado levará a uma conclusão errada

8

Estou analisando várias medidas de desempenho para modelos preditivos. Muito foi escrito sobre problemas no uso da precisão, em vez de algo mais contínuo para avaliar o desempenho do modelo. Frank Harrell http://www.fharrell.com/post/class-damage/ fornece um exemplo ao adicionar uma variável informativa a um modelo, levando a uma queda na precisão, claramente contra-intuitiva e conclusão errada.

insira a descrição da imagem aqui

No entanto, neste caso, isso parece ser causado por ter classes desequilibradas e, portanto, pode ser resolvido apenas com a precisão equilibrada ((sens + spec) / 2). Existe algum exemplo em que o uso da precisão em um conjunto de dados equilibrado levará a algumas conclusões claramente erradas ou contra-intuitivas?

Editar

Estou procurando algo em que a precisão caia mesmo quando o modelo é claramente melhor ou que o uso da precisão levará a uma seleção positiva falsa de alguns recursos. É fácil criar exemplos de falsos negativos, em que a precisão é a mesma para dois modelos em que um é claramente melhor usando outros critérios.

rep_ho
fonte
2
A publicação de Stephan, vinculada acima, é um recurso maravilhoso e tem tudo o que você precisa. Sua etapa inicial de assumir que uma classificação forçada (decisão prematura) é necessária levou a um problema. E (sens + spec) / 2 não é uma pontuação de precisão adequada; otimizá-lo levará à escolha dos recursos errados e ao fornecimento de pesos errados, sem mencionar a ignorância de informações úteis provenientes de probabilidades, como zonas "sem decisão".
Frank Harrell
Entendo o valor das previsões probabilísticas, mas estou procurando exemplos em que essas coisas ruins que você mencionou realmente acontecem para dados balanceados ou precisão balanceada.
rep_ho 27/09/18
BTW: de acordo com Gneiting & Raftery 2007, a precisão é adequada (embora não estritamente adequada). algum comentário sobre isso? amstat.tandfonline.com/doi/abs/10.1198/...
rep_ho
Espero que minha resposta seja útil. (@FrankHarrell: qualquer comentário seria bem-vindo.) A precisão equilibrada também não será útil aqui. Em relação à precisão como uma regra de pontuação adequada, mas não estritamente adequada: você pode estar interessado em A precisão é uma regra de pontuação inadequada em uma configuração de classificação binária? Se esse encadeamento não responder à sua pergunta, considere fazer uma nova pergunta (e apontar por que o encadeamento existente não é uma resposta e, portanto, não está fechado).
Stephan Kolassa

Respostas:

13

Vou trapacear.

Especificamente, argumentei com frequência (por exemplo, aqui ) que a parte estatística da modelagem e previsão se estende apenas a fazer previsões probabilísticas para associações de classe (ou fornecer densidades preditivas, no caso de previsão numérica). Tratar uma instância específica como se pertencesse a uma classe específica (ou previsões de pontos no caso numérico) não é mais uma estatística adequada. Faz parte do aspecto teórico da decisão .

E as decisões não devem ser baseadas apenas na previsão probabilística, mas também nos custos de classificações incorretas e em uma série de outras ações possíveis . Por exemplo, mesmo se você tiver apenas duas classes possíveis, "doente" vs. "saudável", poderá realizar uma grande variedade de ações possíveis, dependendo da probabilidade de um paciente sofrer da doença, de enviá-lo para casa porque é quase certamente saudável, dar a ele duas aspirinas, executar testes adicionais, chamar imediatamente uma ambulância e colocá-lo em suporte de vida.

A avaliação da precisão pressupõe essa decisão. A precisão como métrica de avaliação para classificação é um erro de categoria .

Portanto, para responder sua pergunta, seguirei o caminho de apenas um erro de categoria. Consideraremos um cenário simples com classes equilibradas em que a classificação sem levar em consideração os custos da classificação incorreta realmente nos enganará.


Suponha que uma epidemia de Gutrot Maligno ocorra galopante na população. Felizmente, podemos rastrear todos facilmente alguma característica t ( 0t1 ), e sabemos que a probabilidade de desenvolver MG depende linearmente de t , p=γt para algum parâmetro γ ( 0γ1 ). O traço t é uniformemente distribuído na população.

Felizmente, existe uma vacina. Infelizmente, é caro, e os efeitos colaterais são muito desconfortáveis. (Vou deixar sua imaginação fornecer os detalhes.) No entanto, eles são melhores do que sofrer de MG.

No interesse da abstração, afirmo que, de fato, existem apenas dois cursos de ação possíveis para um determinado paciente, dado o seu valor de característica t : vacinar ou não.

Assim, a pergunta é: como devemos decidir quem deve ser vacinado e quem não deve, dado t ? Seremos utilitários sobre isso e pretendemos ter os menores custos totais esperados. É óbvio que isso se resume em escolher um limiar θ e vacinar todos com tθ .


O modelo e a decisão 1 são orientados pela precisão. Encaixe um modelo. Felizmente, já conhecemos o modelo. Escolha o limiar θ que maximiza a precisão ao classificar os pacientes e vacine todos com tθ . Vemos facilmente que θ=12γ é o número mágico - todos comtθtêm uma chance maior de contrair MG do que não e vice-versa, portanto esselimite de probabilidade de classificaçãomaximizará a precisão. Supondo classes equilibradas,γ=1, vacinaremos metade da população. Curiosamente, seγ<12 , não vamos vacinarninguém. (Estamos principalmente interessados ​​em aulas equilibradas, então vamos desconsiderar que deixamos parte da população morrer por uma morte dolorosa horrível.)

Escusado será dizer que isso não leva em consideração os custos diferenciais da classificação incorreta.


Modelo-and-decisão 2 alavancagem tanto a nossa previsão probabilística ( "dada a sua característica t , sua probabilidade de contrair MG é γt ") e a estrutura de custos.

Primeiro, aqui está um pequeno gráfico. O eixo horizontal fornece a característica, o eixo vertical a probabilidade MG. O triângulo sombreado indica a proporção da população que contrairá MG. A linha vertical fornece algum θ particular . A linha tracejada horizontal em γθ tornará os cálculos abaixo um pouco mais fáceis de seguir. Assumimos γ>12 , apenas para facilitar a vida.

classificação

Vamos dar nomes aos nossos custos e calcular suas contribuições para os custos totais esperados, dados θ e γ (e o fato de que a característica é distribuída uniformemente na população).

  • Vamos c++ denotar o custo para um paciente que é vacinado e teria contraído MG. Dado θ , a proporção da população que incorre nesse custo é o trapézio sombreado no canto inferior direito com a área
    (1θ)γθ+12(1θ)(γγθ).
  • Vamos c+ denotar o custo para um paciente que é vacinado e não teria contraído MG. Dado θ , a proporção da população que incorre nesse custo é o trapézio sem sombra no canto superior direito com a área
    (1θ)(1γ)+12(1θ)(γγθ).
  • Vamos c denotar o custo para um paciente que não é vacinado e não teria contraído MG. Dado θ , a proporção da população que incorre nesse custo é o trapézio sem sombra no canto superior esquerdo com a área
    θ(1γθ)+12θγθ.
  • Vamos c+ denotar o custo para um paciente que não é vacinado e teria contraído MG. Dado θ , a proporção da população que incorre nesse custo é o triângulo sombreado na parte inferior esquerda da área
    12θγθ.

(Em cada trapézio, primeiro calculo a área do retângulo e depois adiciono a área do triângulo.)

Os custos totais esperados são

c++((1θ)γθ+12(1θ)(γγθ))+c+((1θ)(1γ)+12(1θ)(γγθ))+c(θ(1γθ)+12θγθ)+c+12θγθ.

Diferenciando e definindo a derivada como zero, obtemos que os custos esperados são minimizados por

θ=c+cγ(c++c+c++c).

Isso é apenas igual ao valor maximizador da precisão de θ para uma estrutura de custos muito específica, ou seja, se e somente se

12γ=c+cγ(c++c+c++c),
ou
12=c+cc++c+c++c.

Como exemplo, suponha que γ=1 para classes equilibradas e que os custos sejam

c++=1,c+=2,c+=10,c=0.
Então a precisão maximizandoθ=12 produzirá custos esperados de1.875, enquanto o custo que minimizaθ=211 trará custos esperados de1.318.

Neste exemplo, basear nossas decisões em classificações não probabilísticas que maximizavam a precisão levavam a mais vacinas e custos mais altos do que o uso de uma regra de decisão que explicitamente usava as estruturas de custos diferenciais no contexto de uma previsão probabilística.


Conclusão: a precisão é apenas um critério de decisão válido se

  • existe um relacionamento individual entre classes e possíveis ações
  • e os custos das ações aplicadas às classes seguem uma estrutura muito específica.

No caso geral, avaliar a precisão faz uma pergunta errada e maximizar a precisão é o chamado erro do tipo III: fornecer a resposta correta para a pergunta errada.


Código R:

rm(list=ls())
gamma <- 0.7

cost_treated_positive <- 1          # cost of treatment, side effects unimportant
cost_treated_negative <- 2          # cost of treatment, side effects unnecessary
cost_untreated_positive <- 10       # horrible, painful death
cost_untreated_negative <- 0        # nothing

expected_cost <- function ( theta ) {
    cost_treated_positive * ( (1-theta)*theta*gamma + (1-theta)*(gamma-gamma*theta)/2 ) +
    cost_treated_negative * ( (1-theta)*(1-gamma) + (1-theta)*(gamma-gamma*theta)/2 ) +
    cost_untreated_negative *( theta*(1-gamma*theta) + theta*gamma*theta/2 ) +
    cost_untreated_positive * theta*gamma*theta/2
}

(theta <- optim(par=0.5,fn=expected_cost,lower=0,upper=1,method="L-BFGS-B")$par)
(cost_treated_negative-cost_untreated_negative)/
    (gamma*(cost_treated_negative+cost_untreated_positive-cost_treated_positive-cost_untreated_negative))

plot(c(0,1),c(0,1),type="n",bty="n",xaxt="n",xlab="Trait t",yaxt="n",ylab="MG probability")
rect(0,0,1,1)
axis(1,c(0,theta,1),c(0,"theta",1),lty=0,line=-1)
axis(2,c(0,1),lty=0,line=-1,las=1)
axis(4,c(0,gamma,1),c(0,"gamma",1),lty=0,line=-1.8,las=1)
polygon(c(0,1,1),c(0,0,gamma),col="lightgray")
abline(v=theta,col="red",lwd=2)
abline(h=gamma*theta,lty=2,col="red",lwd=2)

expected_cost(1/(2*gamma))
expected_cost(theta)
Stephan Kolassa
fonte
1
Ótimo post! Apenas logado para expressar meus agradecimentos!
Wolfone 12/03/19
"mas também nos custos das classificações incorretas" Não acho que seja verdade: assim como o seu próprio cálculo mostra, também (surpreendentemente!) depende também do custo das classificações corretas !
Tamas Ferenci
cd+=c-+-c++cd-=c+--c--θ=cd-γ(cd-+cd+)
Também poderíamos fazer um enredo disso:levelplot( thetastar ~ cdminus + cdplus, data = data.table( expand.grid( cdminus = seq( 0, 10, 0.01 ), cdplus = seq( 0, 10, 0.01 ) ) )[ , .( cdminus, cdplus, thetastar = cdminus/(cdminus + cdplus) ) ] )
Tamas Ferenci 29/06/19
θ=1/γ1+cd+cd-
4

Talvez valha a pena acrescentar outro exemplo, talvez mais direto, à excelente resposta de Stephen.

TDN(μ-,σ2)TDN(μ+,σ2).
pDBern(p)

bb

(DDTp(1-Φ+(b))(1-p)(1-Φ-(b))TpΦ+(b)(1-p)Φ-(b)).


Abordagem baseada em precisão

p(1-Φ+(b))+(1-p)Φ-(b),

b1πσ2

-pφ+(b)+φ-(b)-pφ-(b)=0 0e-(b-μ-)22σ2[(1-p)-pe-2b(μ--μ+)+(μ+2-μ-2)2σ2]=0 0
(1-p)-pe-2b(μ--μ+)+(μ+2-μ-2)2σ2=0 0-2b(μ--μ+)+(μ+2-μ-2)2σ2=registro1-pp2b(μ+-μ-)+(μ-2-μ+2)=2σ2registro1-pp
b=(μ+2-μ-2)+2σ2registro1-pp2(μ+-μ-)=μ++μ-2+σ2μ+-μ-registro1-pp.

Observe que isso - é claro - não depende dos custos.

Se as aulas são equilibradas, o ideal é a média dos valores médios dos testes em pessoas doentes e saudáveis, caso contrário, ela é deslocada com base no desequilíbrio.


Abordagem baseada em custos

Usando a notação de Stephen, o custo total esperado é

c++p(1-Φ+(b))+c+-(1-p)(1-Φ-(b))+c-+pΦ+(b)+c--(1-p)Φ-(b).
Tome seu derivado wrt b e defina-o como zero:
c++pφ+(b)c+(1p)φ(b)+c+pφ+(b)+c(1p)φ(b)==φ+(b)p(c+c++)+φ(b)(1p)(cc+)==φ+(b)pcd+φ(b)(1p)cd=0,
using the notation I introduced in my comments below Stephen's answer, i.e., cd+=c+c++ and cd=c+c.

The optimal threshold is therefore given by the solution of the equation

φ+(b)φ-(b)=(1-p)cd-pcd+.
Duas coisas devem ser observadas aqui:

  1. Esse resultado é totalmente genérico e funciona para qualquer distribuição dos resultados do teste, não apenas o normal. (φ nesse caso, é claro, significa a função de densidade de probabilidade da distribuição, não a densidade normal.)
  2. Qualquer que seja a solução para b é, certamente, uma função de (1-p)cd-pcd+. (Ou seja, vemos imediatamente como os custos são importantes - além do desequilíbrio de classe!)

Eu ficaria realmente interessado em ver se esta equação tem uma solução genérica para b (parametrizado pelo φs), mas eu ficaria surpreso.

No entanto, podemos resolver isso normalmente! 2πσ2s cancelar no lado esquerdo, por isso temos

e-12((b-μ+)2σ2-(b-μ-)2σ2)=(1-p)cd-pcd+(b-μ-)2-(b-μ+)2=2σ2registro(1-p)cd-pcd+2b(μ+-μ-)+(μ-2-μ+2)=2σ2registro(1-p)cd-pcd+
portanto, a solução é
b=(μ+2-μ-2)+2σ2registro(1-p)cd-pcd+2(μ+-μ-)=μ++μ-2+σ2μ+-μ-registro(1-p)cd-pcd+.

(Compare com o resultado anterior! Vemos que eles são iguais se e somente se cd-=cd+, ou seja, as diferenças no custo da classificação incorreta em comparação com o custo da classificação correta são as mesmas em pessoas doentes e saudáveis.)


Uma breve demonstração

Digamos c--=0 0 (é bastante natural em termos médicos), e que c++=1 (sempre podemos obtê-lo dividindo os custos com c++, medindo todos os custos em c++unidades). Digamos que a prevalência ép=0,2. Além disso, digamos queμ-=9,5, μ+=10,5 e σ=1.

Nesse caso:

library( data.table )
library( lattice )

cminusminus <- 0
cplusplus <- 1
p <- 0.2
muminus <- 9.5
muplus <- 10.5
sigma <- 1

res <- data.table( expand.grid( b = seq( 6, 17, 0.1 ),
                                cplusminus = c( 1, 5, 10, 50, 100 ),
                                cminusplus = c( 2, 5, 10, 50, 100 ) ) )
res$cost <- cplusplus*p*( 1-pnorm( res$b, muplus, sigma ) ) +
  res$cplusminus*(1-p)*(1-pnorm( res$b, muminus, sigma ) ) +
  res$cminusplus*p*pnorm( res$b, muplus, sigma ) +
  cminusminus*(1-p)*pnorm( res$b, muminus, sigma )

xyplot( cost ~ b | factor( cminusplus ), groups = cplusminus, ylim = c( -1, 22 ),
        data = res, type = "l", xlab = "Threshold",
        ylab = "Expected overall cost", as.table = TRUE,
        abline = list( v = (muplus+muminus)/2+
                         sigma^2/(muplus-muminus)*log((1-p)/p) ),
        strip = strip.custom( var.name = expression( {"c"^{"+"}}["-"] ),
                              strip.names = c( TRUE, TRUE ) ),
        auto.key = list( space = "right", points = FALSE, lines = TRUE,
                         title = expression( {"c"^{"-"}}["+"] ) ),
        panel = panel.superpose, panel.groups = function( x, y, col.line, ... ) {
          panel.xyplot( x, y, col.line = col.line, ... )
          panel.points( x[ which.min( y ) ], min( y ), pch = 19, col = col.line )
        } )

O resultado é (os pontos representam o custo mínimo e a linha vertical mostra o limite ideal com a abordagem baseada na precisão):

Custo total esperado

Podemos ver muito bem como o ótimo baseado em custo pode ser diferente do ideal baseado em precisão. É instrutivo pensar no porquê: se é mais caro classificar pessoas doentes erroneamente saudáveis ​​do que o contrário (c-+ é alto, c+- é baixo) do que o limiar diminui, pois preferimos classificar mais facilmente na categoria doente, por outro lado, se for mais caro classificar pessoas saudáveis ​​erroneamente doentes do que o contrário (c-+ é baixo, c+-é alto) do que o limite aumenta, pois preferimos classificar mais facilmente na categoria saudável. (Verifique estes na figura!)


Um exemplo da vida real

Vamos dar uma olhada em um exemplo empírico, em vez de uma derivação teórica. Este exemplo será diferente basicamente de dois aspectos:

  • Em vez de assumir a normalidade, simplesmente usaremos os dados empíricos sem essa hipótese.
  • Em vez de usar um único teste e seus resultados em suas próprias unidades, usaremos vários testes (e os combinaremos com uma regressão logística). O limite será dado à probabilidade final prevista. Esta é realmente a abordagem preferida, consulte o Capítulo 19 - Diagnóstico - no BBR de Frank Harrell .

O conjunto de dados ( acathdo pacote Hmisc) é do Banco de Dados de Doenças Cardiovasculares da Universidade de Duke e contém se o paciente teve doença coronariana significativa, avaliada por cateterismo cardíaco, este será nosso padrão ouro, ou seja, o verdadeiro status da doença e o "teste "será a combinação da idade, sexo, nível de colesterol e duração dos sintomas do sujeito:

library( rms )
library( lattice )
library( latticeExtra )
library( data.table )

getHdata( "acath" )
acath <- acath[ !is.na( acath$choleste ), ]
dd <- datadist( acath )
options( datadist = "dd" )

fit <- lrm( sigdz ~ rcs( age )*sex + rcs( choleste ) + cad.dur, data = acath )

Vale a pena traçar os riscos previstos em escala logit, para ver como eles são normais (essencialmente, foi o que assumimos anteriormente, com um único teste!):

densityplot( ~predict( fit ), groups = acath$sigdz, plot.points = FALSE, ref = TRUE,
             auto.key = list( columns = 2 ) )

Distribuição dos riscos previstos

Bem, eles não são normais ...

Vamos continuar e calcular o custo total esperado:

ExpectedOverallCost <- function( b, p, y, cplusminus, cminusplus,
                                 cplusplus = 1, cminusminus = 0 ) {
  sum( table( factor( p>b, levels = c( FALSE, TRUE ) ), y )*matrix(
    c( cminusminus, cplusminus, cminusplus, cplusplus ), nc = 2 ) )
}

table( predict( fit, type = "fitted" )>0.5, acath$sigdz )

ExpectedOverallCost( 0.5, predict( fit, type = "fitted" ), acath$sigdz, 2, 4 )

E vamos plotá-lo para todos os custos possíveis (uma observação computacional: não precisamos iterar irremediavelmente através de números de 0 a 1, podemos reconstruir perfeitamente a curva calculando-a para todos os valores exclusivos de probabilidades previstas):

ps <- sort( unique( c( 0, 1, predict( fit, type = "fitted" ) ) ) )

xyplot( sapply( ps, ExpectedOverallCost,
                p = predict( fit, type = "fitted" ), y = acath$sigdz,
                cplusminus = 2, cminusplus = 4 ) ~ ps, type = "l", xlab = "Threshold",
        ylab = "Expected overall cost", panel = function( x, y, ... ) {
          panel.xyplot( x, y, ... )
          panel.points( x[ which.min( y ) ], min( y ), pch = 19, cex = 1.1 )
          panel.text( x[ which.min( y ) ], min( y ), round( x[ which.min( y ) ], 3 ),
                      pos = 3 )
        } )

Custo total esperado em função do limite

Podemos ver muito bem onde devemos colocar o limite para otimizar o custo geral esperado (sem usar sensibilidade, especificidade ou valores preditivos em qualquer lugar!). Essa é a abordagem correta.

É especialmente instrutivo contrastar essas métricas:

ExpectedOverallCost2 <- function( b, p, y, cplusminus, cminusplus,
                                  cplusplus = 1, cminusminus = 0 ) {
  tab <- table( factor( p>b, levels = c( FALSE, TRUE ) ), y )
  sens <- tab[ 2, 2 ] / sum( tab[ , 2 ] )
  spec <- tab[ 1, 1 ] / sum( tab[ , 1 ] )
  c( `Expected overall cost` = sum( tab*matrix( c( cminusminus, cplusminus, cminusplus,
                                                   cplusplus ), nc = 2 ) ),
     Sensitivity = sens,
     Specificity = spec,
     PPV = tab[ 2, 2 ] / sum( tab[ 2, ] ),
     NPV = tab[ 1, 1 ] / sum( tab[ 1, ] ),
     Accuracy = 1 - ( tab[ 1, 1 ] + tab[ 2, 2 ] )/sum( tab ),
     Youden = 1 - ( sens + spec - 1 ),
     Topleft = ( 1-sens )^2 + ( 1-spec )^2
  )
}

ExpectedOverallCost2( 0.5, predict( fit, type = "fitted" ), acath$sigdz, 2, 4 )

res <- melt( data.table( ps, t( sapply( ps, ExpectedOverallCost2,
                                        p = predict( fit, type = "fitted" ),
                                        y = acath$sigdz,
                                        cplusminus = 2, cminusplus = 4 ) ) ),
             id.vars = "ps" )

p1 <- xyplot( value ~ ps, data = res, subset = variable=="Expected overall cost",
              type = "l", xlab = "Threshold", ylab = "Expected overall cost",
              panel=function( x, y, ... ) {
                panel.xyplot( x, y,  ... )
                panel.abline( v = x[ which.min( y ) ],
                              col = trellis.par.get()$plot.line$col )
                panel.points( x[ which.min( y ) ], min( y ), pch = 19 )
              }  )
p2 <- xyplot( value ~ ps, groups = variable,
              data = droplevels( res[ variable%in%c( "Expected overall cost",
                                                     "Sensitivity",
                                                     "Specificity", "PPV", "NPV" ) ] ),
              subset = variable%in%c( "Sensitivity", "Specificity", "PPV", "NPV" ),
              type = "l", xlab = "Threshold", ylab = "Sensitivity/Specificity/PPV/NPV",
              auto.key = list( columns = 3, points = FALSE, lines = TRUE ) )
doubleYScale( p1, p2, use.style = FALSE, add.ylab2 = TRUE )

Custo total esperado e métricas tradicionais em função do limite

Agora, podemos analisar as métricas que às vezes são anunciadas especificamente como capazes de criar um ponto de corte ideal sem custos, e contrastá-lo com nossa abordagem baseada em custos! Vamos usar as três métricas mais usadas:

  • Precisão (maximizar precisão)
  • Regra de Youden (maximizar Sens+Spec-1)
  • Regra de Topleft (minimizar (1-Sens)2+(1-Spec)2)

(Por uma questão de simplicidade, subtrairemos os valores acima de 1 para a regra de Youden e de Precisão, para que tenhamos um problema de minimização em todos os lugares.)

Vamos ver os resultados:

p3 <- xyplot( value ~ ps, groups = variable,
              data = droplevels( res[ variable%in%c( "Expected overall cost", "Accuracy",
                                                     "Youden", "Topleft"  ) ] ),
              subset = variable%in%c( "Accuracy", "Youden", "Topleft"  ),
              type = "l", xlab = "Threshold", ylab = "Accuracy/Youden/Topleft",
              auto.key = list( columns = 3, points = FALSE, lines = TRUE ),
              panel = panel.superpose, panel.groups = function( x, y, col.line, ... ) {
                panel.xyplot( x, y, col.line = col.line, ... )
                panel.abline( v = x[ which.min( y ) ], col = col.line )
                panel.points( x[ which.min( y ) ], min( y ), pch = 19, col = col.line )
              } )
doubleYScale( p1, p3, use.style = FALSE, add.ylab2 = TRUE )

Opções para selecionar o ponto de corte ideal

Obviamente, isso se refere a uma estrutura de custos específica, c--=0 0, c++=1, c+-=2, c-+=4(isso obviamente é importante apenas para a decisão de custo ideal). Para investigar o efeito da estrutura de custos, escolha apenas o limite ideal (em vez de rastrear toda a curva), mas plote-o em função dos custos. Mais especificamente, como já vimos, o limite ideal depende dos quatro custos apenas através docd-/cd+ , vamos traçar o ponto de corte ideal em função disso, juntamente com as métricas normalmente usadas que não usam custos:

res2 <- data.frame( rat = 10^( seq( log10( 0.02 ), log10( 50 ), length.out = 500 ) ) )
res2$OptThreshold <- sapply( res2$rat,
                             function( rat ) ps[ which.min(
                               sapply( ps, Vectorize( ExpectedOverallCost, "b" ),
                                       p = predict( fit, type = "fitted" ),
                                       y = acath$sigdz,
                                       cplusminus = rat,
                                       cminusplus = 1,
                                       cplusplus = 0 ) ) ] )

xyplot( OptThreshold ~ rat, data = res2, type = "l", ylim = c( -0.1, 1.1 ),
        xlab = expression( {"c"^{"-"}}["d"]/{"c"^{"+"}}["d"] ), ylab = "Optimal threshold",
        scales = list( x = list( log = 10, at = c( 0.02, 0.05, 0.1, 0.2, 0.5, 1,
                                                   2, 5, 10, 20, 50 ) ) ),
        panel = function( x, y, resin = res[ ,.( ps[ which.min( value ) ] ),
                                             .( variable ) ], ... ) {
          panel.xyplot( x, y, ... )
          panel.abline( h = resin[variable=="Youden"] )
          panel.text( log10( 0.02 ), resin[variable=="Youden"], "Y", pos = 3 )
          panel.abline( h = resin[variable=="Accuracy"] )
          panel.text( log10( 0.02 ), resin[variable=="Accuracy"], "A", pos = 3 )
          panel.abline( h = resin[variable=="Topleft"] )
          panel.text( log10( 0.02 ), resin[variable=="Topleft"], "TL", pos = 1 )
        } )

Limiares ideais para diferentes custos

Linhas horizontais indicam as abordagens que não usam custos (e, portanto, são constantes).

Novamente, vemos bem que, à medida que o custo adicional da classificação incorreta no grupo saudável aumenta em comparação com o grupo doente, o limiar ideal aumenta: se realmente não queremos que as pessoas saudáveis ​​sejam classificadas como doentes, usaremos pontos de corte mais altos (e o contrário, é claro!).

E, finalmente, mais uma vez vemos por que os métodos que não usam custos nem sempre são ( e não podem! ) Ser sempre ótimos.

Tamas Ferenci
fonte