Misurazione della precisione di un modello basato sulla regressione logistica


26

Ho un modello di regressione logistica addestrato che sto applicando a un set di dati di test. La variabile dipendente è binaria (booleana). Per ogni campione nel set di dati di test, applico il modello di regressione logistica per generare una probabilità% che la variabile dipendente sia vera. Quindi registro se il valore acuto era vero o falso. Sto cercando di calcolare una cifra o rettificata come in un modello di regressione lineare.R 2R2R2

Questo mi dà un record per ogni campione nel set di test come:

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

Mi chiedo come testare l'accuratezza del modello. Il mio primo tentativo è stato quello di utilizzare una tabella di contingenza e dire "se prob_value_is_true> 0,80, indovinare che il valore reale è vero" e quindi misurare il rapporto tra classificazioni corrette e errate. Ma non mi piace, perché mi sembra più che sto solo valutando lo 0,80 come un limite, non l'accuratezza del modello nel suo insieme e tutti i prob_value_is_truevalori.

Quindi ho provato a guardare ogni valore discreto prob_value_is_true, ad esempio, guardando tutti i campioni in cui prob_value_is_true= 0,34 e misurando la% di quei campioni in cui il valore acutale è vero (in questo caso, la precisione assoluta sarebbe se la% dei campioni era vero = 34%). Potrei creare un punteggio di precisione del modello sommando la differenza per ogni valore discreto di prob_value_is_true. Ma le dimensioni del campione sono una grande preoccupazione qui, specialmente per gli estremi (vicino allo 0% o al 100%), in modo tale che le medie dei valori acuti non siano accurate, quindi usarle per misurare l'accuratezza del modello non sembra giusto.

Ho anche provato a creare enormi gamme per garantire sufficienti dimensioni del campione (0 -25, 0,25 -50, .50-.75, .75-1.0), ma il modo in cui misurare "bontà" di quella% del valore reale mi sorprende . Supponiamo che tutti i campioni prob_value_is_truecompresi tra 0,25 e 0,50 abbiano una media acutal_valuedi 0,45. È buono dal momento che è nella gamma? Cattivo dal momento che non è vicino al 37,5% (il centro dell'intervallo)?

Quindi sono bloccato su ciò che sembra dovrebbe essere una domanda facile e spero che qualcuno possa indicarmi una risorsa o un metodo per calcolare una precisione di precisione per un modello di regressione logistica.


Penso che l'esempio delle gamme: (0-.25, .25-.50, .50-.75, .75-1.0) abbia un senso. Sarebbe utile se restringessi i range? Come: 0-.03, .03-.06, .06-.09, ..... cioè, ogni .03. Questo potrebbe essere utile per le regioni con molti punti dati.
mac,

Risposte:


18

Una misura che viene spesso utilizzata per convalidare la regressione logistica, è l'AUC della curva ROC ( grafico della sensibilità rispetto alla specificità 1 - basta google per i termini se necessario). Questo, in sostanza, valuta l'intera gamma di valori di soglia.

Il rovescio della medaglia: la valutazione dell'intero intervallo di valori di soglia potrebbe non essere ciò che stai cercando, poiché questo (in genere) include soglie che comportano un numero molto elevato di falsi negativi o falsi positivi. Esistono versioni dell'AUC che tengono conto di questo (AUC parziale), quindi se questo è un problema per te, puoi esaminarlo.


1
Mettendo da parte l'AUC per un momento, ho ragione a supporre che la costruzione della curva ROC sia qualcosa del genere? Per ogni valore discreto di prob_value_is_true, creare una tabella di contingenza utilizzando il valore discreto come soglia. Quindi registrare il tasso positivo reale e il tasso falso positivo di ciascuna tabella di contingenza. Tracciare le tariffe per tutte le tabelle di contingenza su un diagramma a dispersione e dovresti vedere la curva ROC? Suona bene?
John Reed,

Ho messo insieme un po 'di codice per farlo, fornendo solo valori casuali come probabilità e valore reale, ed era una linea retta. Suppongo che l'AUC stia misurando la deviazione della "curva" da un modello montato rispetto alla "linea" o casualità?
John Reed,

Per quanto riguarda il ROC: sì, è giusto. Esistono alcune varianti (più o meno levigate; tenendo conto delle probabilità previste per la scelta delle soglie o meno). Si noti che (a seconda del software utilizzato / lingua scelta) ci sono una miriade di strumenti là fuori che già forniscono questo. Wrt AUC: non è più o meno l'area effettiva sotto la curva ROC. Non con un predittore casuale perfetto, la curva ROC sarebbe una linea retta da (0,0) a (1,1), con conseguente AUC di 0,5. L'AUC ha comunque delle belle interpretazioni (vedi anche Google o Wikipedia :-))
Nick Sabbe,

8

clowessval.probrmsrms farà lo stesso per la validazione interna, usando il ricampionamento per rimuovere gli effetti del sovradimensionamento.


6

xx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xvariabile, come suggerisci. Questo non è del tutto valido, poiché dipenderà dalla scelta dei contenitori, può essere utile come modo per esplorare il tuo modello.

In generale, il compito che ti sei assegnato qui è difficile. Questo perché, con la regressione logistica, hai a che fare con due diversi tipi di cose. Le previsioni del modello sono una variabile latente, mentre la variabile di risposta osservata (mentre presumibilmente generata da una variabile latente) non lo è. Naturalmente, le persone vorranno spesso sapere qual è la risposta prevista, ed è del tutto ragionevole; questo è solo uno di quei casi in cui la vita non è giusta.

y=1y^.5y=1y^p(y=1)y^=.31y1<.5

(0,1)R2R2c


Bella risposta! Quindi nell'esempio che il 30% di tutti i casi sono 1, la probabilità prevista 0,31 di un caso particolare è come una "classifica" di questo caso rispetto ad altri casi su quanto è vicino a 1 (maggiore è il più vicino)? E non dovrebbe essere vista come la probabilità prevista che questo caso particolare sia 1?
mac,

1
y^i=.311.31.31.25

3

Penso che potresti stabilire una soglia (diciamo 0,5), quindi quando la tua probabilità è uguale o maggiore di quella soglia la tua classe prevista sarebbe 1, e 0 altrimenti. Quindi, potresti ottenere una misura della tua precisione in questo modo:

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

Dato che la tua probabilità è la probabilità di dare i tuoi dati (x) e usando il tuo modello il tuo valore di classe (y) è uguale a 1, non capisco perché ottieni sempre valori di probabilità inferiori a 0,5. Qual è la frequenza delle tue classi effettive (actual_value)?


2

Potresti voler dare un'occhiata al mio pacchetto softclassval(su softclassval.r-forge.r-project.org trovi anche due presentazioni orali che ho tenuto sulle idee alla base del pacchetto).

L'ho scritto per un problema leggermente diverso, vale a dire se il riferimento (ad es. Il patologo) "rifiuta" di dare una lezione chiara. Tuttavia, è possibile utilizzarlo con classi normali "normali" ed evita la definizione di una soglia per rafforzare la previsione originariamente continua , quindi non si valuta lo 0,8.

Tuttavia, raccomando di usarlo insieme a, diciamo, un ROC o un diagramma di sensibilità-specificità: i risultati appariranno spesso piuttosto negativi poiché i "miei" metodi penalizzeranno deviazioni già lievi (es. 0.9 invece di 1 dà 0.1 differenza per le mie misure , ma tutte le soglie inferiori a 0.9 lo ignoreranno). In realtà penso che sia piuttosto un vantaggio: la mancanza di questa sensibilità agaista piccole deviazioni è uno dei principali punti di critica con quelle misure "rafforzate" come accuratezza, sensibilità, richiamo, ecc.

Inoltre, confrontando l'errore assoluto medio (MAE) e l'errore quadratico medio radice RMSE puoi scoprire se hai molte piccole deviazioni o meno campioni gravemente mal giudicati.


1

Pri=invlogit(a+bxi)

y.rep[i]Bernoulli(p[i])

Quindi, esegui questa simulazione, diciamo, 100 volte. Avrai una matrice con n righe (n è il numero di soggetti) e k colonne (in questo caso, k = 100, il numero di simulazioni). Nel codice r:

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

Ora si calcola la differenza tra il previsto in ogni simulazione e osservato. Dopo aver calcolato questa differenza, calcola semplicemente il numero medio di vero positivo e falso positivo per ogni riga (ogni soggetto) e traccia l'istogramma. Oppure calcola entrambi per ogni colonna (simulazione) e traccia l'istogramma (preferisco questo).

Spero che sia d'aiuto...


1

Esistono molti modi per stimare l'accuratezza di tali previsioni e la scelta ottimale dipende realmente da quale sarà la stima implementata.

Ad esempio, se si prevede di selezionare alcuni risultati con punteggio elevato per uno studio di follow-up costoso, è possibile che si desideri massimizzare la precisione con punteggi elevati. D'altra parte, se lo studio di follow-up è economico, potresti voler massimizzare il richiamo (sensibilità) a punteggi più bassi. L'AUC di ROC può essere adatta se si stanno confrontando metodi diversi, ecc.

Sul lato pratico, Ril ROCRpacchetto contiene 2 utili funzioni

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

Insieme, queste funzioni sono in grado di calcolare una vasta gamma di misure di precisione, inclusi valori scalari globali (come "auc" ) e vettori dipendenti dal punteggio per tracciare curve di precisione e ROC di richiamo ( "prec" , "rec" , "tpr" e "fpr" , ecc.)


1

Devi definire cosa intendi per "precisione". Quello che vorresti sapere, ti prego di scusarmi per aver messo le parole in bocca, è quanto bene il tuo modello si adatta ai dati di allenamento e, cosa più importante, quanto bene questo modello "generalizza" ai campioni non nei tuoi dati di allenamento. Sebbene le curve ROC possano essere utili nell'analisi del compromesso tra precisione e richiamo per vari valori della soglia, suggerisco di aggiungere un errore quadratico medio o il punteggio di Brier alla casella degli strumenti. È facile da calcolare e puoi immediatamente capire se le modifiche alle funzionalità influiscono sull'adattamento del modello, quando applicate ai dati di allenamento. Poiché in questo caso è possibile un eccesso di vestibilità, il tuo lavoro non viene svolto qui. Per valutare le prestazioni di generalizzazione o quanto bene fai sui dati che non hai visto, non è Abbastanza per guardare le tue prestazioni sui campioni di allenamento. Ovviamente il tuo modello è bravo in quelli, perché hanno i valori che hai usato per determinare i coefficienti per la tua logistica. Devi mettere da parte alcuni campioni per i dati di test. Le tue prestazioni MSE su questo set dovrebbero impostare le tue aspettative di generalizzazione in base alla disuguaglianza di Hoeffding. Il massimo errore di generalizzazione dipenderà dal numero di funzioni nel modello e dal numero di campioni utilizzati per calcolare la statistica del test. Ricorda che dovrai rubare alcuni dei tuoi campioni di allenamento per i campioni di prova. Raccomando una convalida incrociata di 10 volte, in cui mescoli, scegli il 90% per l'allenamento, il 10% per i test, quindi misura, ripeti e quindi calcola la media di tutte le misurazioni. perché sono i valori che hai usato per determinare i coefficienti per la tua logistica. Devi mettere da parte alcuni campioni per i dati di test. Le tue prestazioni MSE su questo set dovrebbero impostare le tue aspettative di generalizzazione in base alla disuguaglianza di Hoeffding. Il massimo errore di generalizzazione dipenderà dal numero di funzioni nel modello e dal numero di campioni utilizzati per calcolare la statistica del test. Ricorda che dovrai rubare alcuni dei tuoi campioni di allenamento per i campioni di prova. Raccomando una convalida incrociata di 10 volte, in cui mescoli, scegli il 90% per l'allenamento, il 10% per i test, quindi misura, ripeti e quindi calcola la media di tutte le misurazioni. perché sono i valori che hai usato per determinare i coefficienti per la tua logistica. Devi mettere da parte alcuni campioni per i dati di test. Le tue prestazioni MSE su questo set dovrebbero impostare le tue aspettative di generalizzazione in base alla disuguaglianza di Hoeffding. Il massimo errore di generalizzazione dipenderà dal numero di funzioni nel modello e dal numero di campioni utilizzati per calcolare la statistica del test. Ricorda che dovrai rubare alcuni dei tuoi campioni di allenamento per i campioni di prova. Raccomando una convalida incrociata di 10 volte, in cui mescoli, scegli il 90% per l'allenamento, il 10% per i test, quindi misura, ripeti e quindi calcola la media di tutte le misurazioni. Le tue prestazioni MSE su questo set dovrebbero impostare le tue aspettative di generalizzazione in base alla disuguaglianza di Hoeffding. Il massimo errore di generalizzazione dipenderà dal numero di funzioni nel modello e dal numero di campioni utilizzati per calcolare la statistica del test. Ricorda che dovrai rubare alcuni dei tuoi campioni di allenamento per i campioni di prova. Raccomando una convalida incrociata di 10 volte, in cui mescoli, scegli il 90% per l'allenamento, il 10% per i test, quindi misura, ripeti e quindi calcola la media di tutte le misurazioni. Le tue prestazioni MSE su questo set dovrebbero impostare le tue aspettative di generalizzazione in base alla disuguaglianza di Hoeffding. Il massimo errore di generalizzazione dipenderà dal numero di funzioni nel modello e dal numero di campioni utilizzati per calcolare la statistica del test. Ricorda che dovrai rubare alcuni dei tuoi campioni di allenamento per i campioni di prova. Raccomando una convalida incrociata di 10 volte, in cui mescoli, scegli il 90% per l'allenamento, il 10% per i test, quindi misura, ripeti e quindi calcola la media di tutte le misurazioni.


1

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

Ciò non soffre di soglie arbitrarie. Più piccola è la misura, meglio è.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.