Qual è la funzione di costo in cv.glm nel pacchetto di avvio di R?


14

Sto eseguendo una convalida incrociata utilizzando il metodo Leave-one-out. Ho una risposta binaria e sto usando il pacchetto di avvio per R e la funzione cv.glm . Il mio problema è che non capisco pienamente la parte "costo" in questa funzione. Da quello che posso capire questa è la funzione che decide se un valore stimato debba essere classificato come 1 o 0, ovvero il valore soglia per la classificazione. È corretto?

E, nella guida in R che utilizzano questa funzione per un modello binomiale: cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5). Come interpreto questa funzione? così posso modificarlo correttamente per la mia analisi.

Qualsiasi aiuto è apprezzato, non voglio usare una funzione che non capisco.

Risposte:


9

r è un vettore che contiene il risultato effettivo, pi è un vettore che contiene i valori adattati.

cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

coSt=Σ|rio-pioio|

mycost <- function(r, pi){
    weight1 = 1 #cost for getting 1 wrong
    weight0 = 1 #cost for getting 0 wrong
    c1 = (r==1)&(pi<0.5) #logical vector - true if actual 1 but predict 0
    c0 = (r==0)&(pi>=0.5) #logical vector - true if actual 0 but predict 1
    return(mean(weight1*c1+weight0*c0))
  }

e inserisci mycost come argomento nella funzione cv.glm.


coSt
Σ|rio-pio|0.5
|rio-pio|=112

@ feng-mai pi == 0 o pi <0,5? (e pi == 1 o pi> 0,5?) se si utilizza 0,5 come limite di decisione. Il pi non sono le probabilità previste ?
PM.

1
pio

1
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

Innanzitutto, hai impostato un valore di taglio su 0,5. La tua r è 0/1, ma pi è probabilità. Quindi il costo individuale è 1 se l'errore assoluto è maggiore di 0,5, altrimenti 0. Quindi, questa funzione calcola il tasso di errore medio. Ma ricorda, il cut-off è stato impostato prima di definire la funzione di costo.

In realtà, penso che abbia più senso se la scelta del cut-off è determinata dalla funzione di costo.


0

La risposta di @SLi spiega già molto bene cosa fa la funzione di costo che hai definito. Tuttavia, ho pensato di aggiungere che la funzione di costo viene utilizzata per calcolare il deltavalore da cv.glm, che è una misurazione dell'errore di convalida incrociata. Tuttavia, deltaè criticamente la media ponderata dell'errore di ogni piega data dal costo. Lo vediamo ispezionando il bit rilevante del codice:

for (i in seq_len(ms)) {
    j.out <- seq_len(n)[(s == i)]
    j.in <- seq_len(n)[(s != i)]
    Call$data <- data[j.in, , drop = FALSE]
    d.glm <- eval.parent(Call)
    p.alpha <- n.s[i]/n # create weighting for averaging later
    cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out, 
        , drop = FALSE], type = "response"))
    CV <- CV + p.alpha * cost.i # add previous error to running total
    cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm, 
        data, type = "response"))
}

e il valore restituito dalla funzione è:

  list(call = call, K = K, delta = as.numeric(c(CV, CV + cost.0)), 
    seed = seed)
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.