2016-01-03 26 views
5

Ho un set di dati molto grande (ds). Una delle sue colonne è Popularity, di tipo factor ('Alto'/'Basso').Valutazione di un modello statistico in R

Ho diviso i dati al 70% e al 30% per creare un set di allenamento (ds_tr) e un set di test (ds_te).

io ho creato il seguente modello utilizzando una regressione logistica:

mdl <- glm(formula = popularity ~ . -url , family= "binomial", data = ds_tr) 

poi ho creato un oggetto predict (lo farà ancora per ds_te)

y_hat = predict(mdl, data = ds_tr - url , type = 'response') 

Voglio trovare il valore di precisione che corrisponde a una soglia di interruzione di 0,5 e trova il valore di richiamo che corrisponde a una soglia di soglia di 0,5, così ho fatto:

library(ROCR) 
pred <- prediction(y_hat, ds_tr$popularity) 
perf <- performance(pred, "prec", "rec") 

Il risultato è una tabella di molti valori

str(perf) 

Formal class 'performance' [package "ROCR"] with 6 slots 
    [email protected] x.name  : chr "Recall" 
    [email protected] y.name  : chr "Precision" 
    [email protected] alpha.name : chr "Cutoff" 
    [email protected] x.values :List of 1 
    .. ..$ : num [1:27779] 0.00 7.71e-05 7.71e-05 1.54e-04 2.31e-04 ... 
    [email protected] y.values :List of 1 
    .. ..$ : num [1:27779] NaN 1 0.5 0.667 0.75 ... 
    [email protected] alpha.values:List of 1 
    .. ..$ : num [1:27779] Inf 0.97 0.895 0.89 0.887 ... 

Come faccio a trovare i valori di precisione e di richiamo specifici corrispondenti ad una soglia di taglio di 0,5?

+0

migliorare la spiegazione e spiegare come ottenere il valore richiesto. – PereG

risposta

1

Acces gli slot di oggetto di prestazione (attraverso la combinazione di @ + lista)

Creiamo un insieme di dati con tutti i possibili valori:

probab.cuts <- data.frame([email protected][[1]], [email protected][[1]], [email protected][[1]]) 

È possibile visualizzare tutti valori associati

probab.cuts 

Se si desidera selec t i valori richiesti, è banale da fare:

tail(probab.cuts[probab.cuts$cut > 0.5,], 1) 

Manuale controllo

tab <- table(ds_tr$popularity, y_hat > 0.5) 
tab[4]/(tab[4]+tab[2]) # recall 
tab[4]/(tab[4]+tab[3]) # precision 
+0

Grazie, ma ho ancora un problema quando provo a valutare il modello sul set di test (ds_te) poiché y_hat è di lunghezza diversa da ds_te $ popolarità. qualche idea? – user2878881

+0

In effetti, è più corretto valutare il modello utilizzando i dati di test. Quindi, stimare e utilizzare: "y_hat_test <- prevedere (mdl, data = ds_te - url, type = 'response')" e calcolare "pred" e "perf" con i nuovi dati. Infine, usa il codice di questa risposta con "ds_te $ popularity" e il nuovo "y_hat_test" nella funzione tabella. – PereG