Medindo a precisão de um modelo baseado em regressão logística

26

Eu tenho um modelo de regressão logística treinado que estou aplicando a um conjunto de dados de teste. A variável dependente é binária (booleana). Para cada amostra no conjunto de dados de teste, aplico o modelo de regressão logística para gerar uma% de probabilidade de que a variável dependente seja verdadeira. Depois, registro se o valor acutal era verdadeiro ou falso. Estou tentando calcular uma figura ou ajustado como em um modelo de regressão linear.R2R2

Isso me fornece um registro para cada amostra no conjunto de testes, como:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Eu estou querendo saber como testar a precisão do modelo. Minha primeira tentativa foi usar uma tabela de contingência e dizer "se prob_value_is_true> 0,80, acho que o valor real é verdadeiro" e depois medir a proporção de classificações corretas para incorretas. Mas não gosto disso, porque parece mais que estou apenas avaliando o 0,80 como um limite, não a precisão do modelo como um todo e em todos os prob_value_is_truevalores.

Tentei apenas olhar para cada valor discreto prob_value_is_true, como um exemplo, olhando para todas as amostras em que prob_value_is_true= 0,34 e medindo a% daquelas amostras em que o valor acutal é verdadeiro (nesse caso, a precisão perfeita seria se a% de amostras isso era verdade = 34%). Eu poderia criar uma pontuação de precisão do modelo somando a diferença em cada valor discreto de prob_value_is_true. Mas o tamanho das amostras é uma grande preocupação aqui, especialmente para os extremos (chegando a 0% ou 100%), de modo que as médias dos valores acutais não sejam precisas, portanto, usá-las para medir a precisão do modelo não parece correto.

Eu até tentei criar faixas enormes para garantir tamanhos de amostra suficientes (0-.25, .25-.50, .50-.75, .75-1.0), mas como medir a "bondade" dessa% do valor real me surpreende . Digamos que todas as amostras prob_value_is_trueentre 0,25 e 0,50 tenham uma média acutal_valuede 0,45. Isso é bom, já que está no intervalo? Ruim, já que não é perto de 37,5% (o centro da faixa)?

Portanto, estou preso ao que parece ser uma pergunta fácil, e espero que alguém possa me indicar um recurso ou método para calcular uma precisão estástica para um modelo de regressão logística.

John Reed
fonte
Eu acho que o exemplo de intervalos: (0-.25, .25-.50, .50-.75, .75-1.0) faz sentido. Seria útil se você restringisse os intervalos? Tais como: 0-.03, .03-.06, .06-.09, ..... ou seja, todos os .03. Isso pode ser útil para regiões com muitos pontos de dados.
mac

Respostas:

18

Uma medida que é freqüentemente usada para validar a regressão logística é a AUC da curva ROC (gráfico de sensibilidade contra a especificidade 1 - basta pesquisar no Google os termos, se necessário). Isso, em essência, avalia toda a faixa de valores limite.

O lado negativo: avaliar todo o intervalo de valores de limite pode não ser o que você procura, pois isso (normalmente) inclui limites que resultam em um número muito grande de falsos negativos ou positivos. Existem versões da AUC responsáveis ​​por isso (AUC parcial); portanto, se esse é um problema para você, você pode investigar isso.

Nick Sabbe
fonte
11
Deixando de lado a AUC por um momento, estou correto ao assumir que a construção da Curva ROC é algo assim? Para cada valor discreto de prob_value_is_true, crie uma tabela de contingência usando o valor discreto como limite. Em seguida, registre a taxa positiva verdadeira e a taxa de falso positivo de cada tabela de contingência. Plote as taxas para todas as tabelas de contingência em um gráfico de dispersão e você deverá ver a curva ROC? Isso soa certo?
John Reed
Eu montei algum código para fazer isso, apenas alimentando valores aleatórios como a probabilidade e o valor real, e era uma linha reta. Suponho que a AUC esteja medindo o desvio da "curva" de um modelo ajustado contra a "linha" ou aleatoriedade?
John Reed
Em relação ao ROC: sim, é isso mesmo. Existem algumas variantes (mais ou menos suavizadas; levando em consideração as probabilidades previstas para sua escolha de limites ou não). Observe que (dependendo do software / idioma de sua escolha) existe uma infinidade de ferramentas por aí que já fornecem isso. AUC Wrt: não é mais ou menos do que a área real sob a curva ROC. Não com um preditor aleatório perfeito, a curva ROC seria uma linha reta de (0,0) a (1,1), resultando em uma AUC de 0,5. A AUC tem algumas boas interpretações, embora (ver Google ou Wikipedia mesmo :-))
Nick Sabbe
8

Você está certo ao se preocupar com a proporção classificada correta como refletindo principalmente o efeito de um limite arbitrário. Eu recomendaria duas medidas. Um deles é a área index ou ROC, como outros descreveram. Isso tem uma interpretação mais simples do que pensar em uma curva ROC e é uma medida de pura discriminação preditiva. Em segundo lugar, estime uma curva de calibração contínua sem nenhum agrupamento de dados. Se as previsões estiverem sendo avaliadas em um conjunto de dados independente, você poderá usar a detecção de outlier desativada para estimar a relação entre o Prob previsto e o real [Y = 1]. A função no pacote R fará as duas coisas. Outras funções emclowessval.probrmsrms fará o mesmo para a validação interna, usando a reamostragem para remover os efeitos do sobreajuste.

Frank Harrell
fonte
6

Se seus dados forem agrupados por valores , você poderá calcular o valor previsto do modelo e o intervalo de confiança associado e verificar se a porcentagem observada está dentro desse intervalo. Por exemplo, se houvesse 10 observações em , 10 obs a , 10 obs a , etc, em seguida , , etc., produziria percentagens que podem ser comparadas com as previsões. Lembre-se de que, mesmo que o modelo seja perfeito, algumas porcentagens observadas serão salvas fora do IC 95%, assim como na regressão OLS. Se seus dados não estiverem agrupados, você poderá formar seus próprios grupos, classificando-os de acordo com os intervalos dex = 10 x = 20 x = 30 xxx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xvariável, como você sugere. Isso não é totalmente válido, pois dependerá da escolha dos compartimentos, pode ser útil como uma maneira de explorar seu modelo.

Em geral, a tarefa que você se entregou aqui é difícil. Isso porque, com a regressão logística, você está lidando com dois tipos diferentes de coisas. As previsões do modelo são uma variável latente, enquanto sua variável de resposta observada (embora presumivelmente gerada por uma variável latente) não é. Obviamente, as pessoas geralmente querem saber qual é a resposta prevista e isso é totalmente razoável; esse é apenas um daqueles casos em que a vida não é justa.

Se você deseja prever o resultado, precisa decidir o que deseja maximizar. Se você tem apenas 1 caso e deseja que sua previsão seja mais provável, você deve prever , se . (Tudo isso é bastante intuitivo.) Por outro lado, se você deseja maximizar a precisão geral sobre sua amostra total (ou qualquer outro grupo), você deve prever , se . Por exemplo, digamos que em sua amostra, 30% de todos os casos sejam 1's, então se , você deve prever que será , mesmo que sejay0,5 y = 1 yp ( y = 1 ) y = 0,31 y 1 < 0,5y=1y^.5y=1y^p(y=1)y^=.31y1<.5. Isso é contra-intuitivo e muitas pessoas tropeçam aqui, mas esse algoritmo maximiza sua precisão.

Uma maneira mais abrangente de pensar em quanta informação há no seu modelo é integrar sobre a precisão com que você receberia todos os limites possíveis . Essa é a área sob a curva (AUC) da característica operacional do receptor do modelo (ROC), discutida por @Nick Sabbe. Lembre-se de que não há para regressão logística. Existem os chamados 'pseudo ', mas a AUC (ou a concordância, , um sinônimo) é provavelmente a melhor maneira de pensar sobre esse assunto. R 2 R 2 c(0,1)R2R2c

- Reinstate Monica
fonte
Ótima resposta! Portanto, no exemplo em que 30% de todos os casos são 1, a probabilidade prevista de 0,31 de um caso específico é como uma "classificação" desse caso em relação a outros casos em quão próximo ele é de 1 (quanto maior, mais próximo)? E não deve ser vista como a probabilidade prevista de que este caso em particular seja 1?
mac
11
Não tenho certeza se te sigo, @JunchiGuo. O significa que a probabilidade prevista de ser é . Porém, você pode classificar as observações em relação às probabilidades previstas, & seria maior que , por exemplo. 10,310,310,25y^i=.311.31.31.25
gung - Restabelece Monica
3

Eu acho que você poderia estabelecer um limite (digamos 0,5), portanto, quando sua probabilidade for igual ou superior a esse limite, sua classe prevista seria 1 e 0 caso contrário. Em seguida, você pode obter uma medida de sua precisão desta maneira:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Dado que sua probabilidade é a probabilidade de fornecer seus dados (x) e, usando seu modelo, seu valor de classe (y) é igual a 1, não entendo por que você sempre obtém valores de probabilidade inferiores a 0,5. Qual é a frequência das suas aulas reais (valor_real)?

Manuel Ramón
fonte
2

Você pode dar uma olhada no meu pacote softclassval(em softclassval.r-forge.r-project.org, você também encontrará duas apresentações orais que dei sobre as idéias por trás do pacote).

Eu o escrevi para um problema um pouco diferente, a saber, se a referência (por exemplo, patologista) "se recusa" a dar uma aula clara. No entanto, você pode usá-lo com classes rígidas "normais" e evita a definição de um limite para fortalecer a previsão originalmente contínua - para não avaliar o 0,8.

No entanto, eu recomendo usá-lo juntamente com, digamos, um ROC ou diagrama de sensibilidade à especificidade: os resultados geralmente parecerão muito ruins, já que os "meus" métodos penalizarão já pequenos desvios (por exemplo, 0,9 em vez de 1 dá 0,1 diferença para minhas medidas , mas todos os limites abaixo de 0,9 ignoram isso). Na verdade, acho que é uma vantagem: a falta dessa sensibilidade contra pequenos desvios é um dos principais pontos de crítica com as medidas "endurecidas", como precisão, sensibilidade, recordação, etc.

Além disso, comparando o erro médio absoluto médio (MAE) e o erro quadrático médio da raiz RMSE, é possível descobrir se há muitos pequenos desvios ou menos amostras grosseiramente mal avaliadas.

cbeleites suporta Monica
fonte
1

Aqui está minha sugestão rápida: Como sua variável dependente é binária, você pode assumir que segue uma distribuição de Bernoulli, com probabilidade dada pela regressão logística .Pri=invlogit(a+bxi)

Agora, defina uma simulação da seguinte forma: y.rep[i]Bernoulli(p[i])

Em seguida, execute esta simulação, digamos, 100 vezes. Você terá uma matriz com n linhas (n é o número de sujeitos) ek colunas (neste caso, k = 100, o número de simulações). No código r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Agora você calcula a diferença entre o previsto em cada simulação e o observado. Após calcular essa diferença, apenas calcule o número médio de verdadeiro positivo e falso positivo para cada linha (cada sujeito) e plote o histograma. Ou calcule ambos para cada coluna (simulação) e plote o histograma (eu prefiro isso).

Espero que ajude...

Manoel Galdino
fonte
1

Existem muitas maneiras de estimar a precisão de tais previsões e a escolha ideal realmente depende do que a estimativa será implementada.

Por exemplo, se você planeja selecionar alguns acertos com alta pontuação para um estudo de acompanhamento caro, convém maximizar a precisão com altas pontuações. Por outro lado, se o estudo de acompanhamento for barato, você poderá maximizar a recuperação (sensibilidade) em pontuações mais baixas. O ROC AUC pode ser adequado se você estiver comparando métodos diferentes etc.

No lado prático, Ro ROCRpacote contém 2 funções úteis

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Juntas, essas funções podem calcular uma ampla variedade de medidas de precisão, incluindo valores escalares globais (como "auc" ) e vetores dependentes de pontuação para plotar curvas Recall-precision e ROC ( "prec" , "rec" , "tpr" e "fpr" etc.)

Itamar
fonte
1

Você precisa definir o que você quer dizer com "precisão". O que você gostaria de saber, por favor, me perdoe por colocar palavras em sua boca, é quão bem seu modelo se encaixa nos dados de treinamento e, mais importante, quão bem esse modelo "generaliza" para amostras que não estão nos seus dados de treinamento. Embora as curvas ROC possam ser úteis na análise da troca entre precisão e recuperação para vários valores do limiar, sugiro adicionar erro ao quadrado médio ou a pontuação Brier na sua caixa de ferramentas. É fácil calcular, e você pode ter uma idéia imediata de se as alterações nos recursos afetam o ajuste do modelo, quando aplicadas aos dados de treinamento. Como o super ajuste é possível nesse caso, seu trabalho não é feito aqui. Para avaliar o desempenho da generalização ou o desempenho dos dados que você não viu, não é ' o suficiente para analisar seu desempenho nas amostras de treinamento. É claro que seu modelo é bom naqueles, porque são os valores que você usou para determinar os coeficientes para sua logística. Você precisa reservar algumas amostras para os dados de teste. Seu desempenho MSE neste conjunto deve definir suas expectativas de generalização de acordo com a desigualdade de Hoeffding. Seu erro máximo de generalização dependerá do número de recursos em seu modelo, bem como do número de amostras usadas para calcular a estatística de teste. Lembre-se de que você precisará roubar algumas de suas amostras de treinamento para obter amostras de teste. Eu recomendo a validação cruzada de 10 vezes, onde você embaralha, escolhe 90% para treinamento, 10% para teste e, em seguida, mede, repete e calcula a média de todas as medidas. porque eles são os valores que você usou para determinar os coeficientes para sua logística. Você precisa reservar algumas amostras para os dados de teste. Seu desempenho MSE neste conjunto deve definir suas expectativas de generalização de acordo com a desigualdade de Hoeffding. Seu erro máximo de generalização dependerá do número de recursos em seu modelo, bem como do número de amostras usadas para calcular a estatística de teste. Lembre-se de que você precisará roubar algumas de suas amostras de treinamento para obter amostras de teste. Eu recomendo a validação cruzada de 10 vezes, onde você embaralha, escolhe 90% para treinamento, 10% para teste e, em seguida, mede, repete e calcula a média de todas as medidas. porque eles são os valores que você usou para determinar os coeficientes para sua logística. Você precisa reservar algumas amostras para os dados de teste. Seu desempenho MSE neste conjunto deve definir suas expectativas de generalização de acordo com a desigualdade de Hoeffding. Seu erro máximo de generalização dependerá do número de recursos em seu modelo, bem como do número de amostras usadas para calcular a estatística de teste. Lembre-se de que você precisará roubar algumas de suas amostras de treinamento para obter amostras de teste. Eu recomendo a validação cruzada de 10 vezes, onde você embaralha, escolhe 90% para treinamento, 10% para teste e, em seguida, mede, repete e calcula a média de todas as medidas. Seu desempenho MSE neste conjunto deve definir suas expectativas de generalização de acordo com a desigualdade de Hoeffding. Seu erro máximo de generalização dependerá do número de recursos em seu modelo, bem como do número de amostras usadas para calcular a estatística de teste. Lembre-se de que você precisará roubar algumas de suas amostras de treinamento para obter amostras de teste. Eu recomendo a validação cruzada de 10 vezes, onde você embaralha, escolhe 90% para treinamento, 10% para teste e, em seguida, mede, repete e calcula a média de todas as medidas. Seu desempenho MSE neste conjunto deve definir suas expectativas de generalização de acordo com a desigualdade de Hoeffding. Seu erro máximo de generalização dependerá do número de recursos em seu modelo, bem como do número de amostras usadas para calcular a estatística de teste. Lembre-se de que você precisará roubar algumas de suas amostras de treinamento para obter amostras de teste. Eu recomendo a validação cruzada de 10 vezes, onde você embaralha, escolhe 90% para treinamento, 10% para teste e, em seguida, mede, repete e calcula a média de todas as medidas.

KPickrell
fonte
1

0log(1p^)01log(p^)1

Isso não sofre de limites arbitrários. Quanto menor a medida, melhor.

probabilityislogic
fonte