Curva ROC per classificatori discreti come SVM: Perché la chiamiamo ancora una "curva"? Non è solo un "punto"?


25

Nella discussione: come generare una curva roc per la classificazione binaria , penso che la confusione fosse che un "classificatore binario" (che è qualsiasi classificatore che separa 2 classi) era per Yang quello che viene chiamato un "classificatore discreto" (che produce uscite discrete 0/1 come un SVM) e non uscite continue come classificatori ANN o Bayes ... ecc. Quindi, la discussione è stata su come il ROC è tracciato per "classificatori binari continui", e la risposta è che gli output sono ordinati dai loro punteggi poiché le uscite sono continue e viene utilizzata una soglia per produrre ciascun punto sulla curva ROC.

La mia domanda è per "classificatori discreti binari", come SVM, i valori di output sono 0 o 1. Quindi il ROC produce solo un punto e non una curva. Sono confuso sul perché la chiamiamo ancora una curva? !! Possiamo ancora parlare di soglie? Come si possono utilizzare le soglie in particolare in SVM? Come si può calcolare l'AUC ?, La validazione incrociata svolge un ruolo qui?


10
Un SVM emette un vero valore decisionale, vale a dire la distanza con segno per l'iperpiano di separazione nello spazio delle caratteristiche. Nella classificazione l'etichetta viene assegnata in base al segno di questo valore decisionale. Come tale, SVM fare uscita di più di un valore binario, la loro produzione è solo binarizzata come una fase di post-elaborazione nella classificazione.
Marc Claesen,

Risposte:


15
  • Sì, ci sono situazioni in cui non è possibile ottenere la normale curva operativa del ricevitore ed esiste solo un punto.

  • Le SVM possono essere impostate in modo tale da generare probabilità di appartenenza alla classe. Questi sarebbero i valori usuali per i quali una soglia sarebbe variata per produrre una curva operativa del ricevitore .
    È quello che stai cercando?

  • I passaggi nel ROC di solito si verificano con un numero limitato di casi di test anziché avere a che fare con variazioni discrete nella covariata (in particolare, si ottengono gli stessi punti se si scelgono le soglie discrete in modo che per ogni nuovo punto cambi solo un campione il suo incarico).

  • Ovviamente, la variazione continua di altri parametri (iper) del modello produce serie di coppie specificità / sensibilità che danno altre curve nel sistema di coordinate FPR; TPR.
    L'interpretazione di una curva ovviamente dipende da quale variazione ha generato la curva.

Ecco un normale ROC (ovvero richiesta di probabilità come output) per la classe "versicolor" del set di dati dell'iride:

  • FPR; TPR (γ = 1, C = 1, soglia di probabilità):
    ROC

Lo stesso tipo di sistema di coordinate, ma TPR e FPR in funzione dei parametri di regolazione γ e C:

  • FPR; TPR (γ, C = 1, soglia di probabilità = 0,5):
    gamma

  • FPR; TPR (γ = 1, C, soglia di probabilità = 0,5):
    costo

Queste trame hanno un significato, ma il significato è decisamente diverso da quello del solito ROC!

Ecco il codice R che ho usato:

svmperf <- function (cost = 1, gamma = 1) {
    model <- svm (Species ~ ., data = iris, probability=TRUE, 
                  cost = cost, gamma = gamma)
    pred <- predict (model, iris, probability=TRUE, decision.values=TRUE)
    prob.versicolor <- attr (pred, "probabilities")[, "versicolor"]

    roc.pred <- prediction (prob.versicolor, iris$Species == "versicolor")
    perf <- performance (roc.pred, "tpr", "fpr")

    data.frame (fpr = perf@x.values [[1]], tpr = perf@y.values [[1]], 
                threshold = perf@alpha.values [[1]], 
                cost = cost, gamma = gamma)
}

df <- data.frame ()
for (cost in -10:10)
  df <- rbind (df, svmperf (cost = 2^cost))
head (df)
plot (df$fpr, df$tpr)

cost.df <- split (df, df$cost)

cost.df <- sapply (cost.df, function (x) {
    i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y 
    x [i,]
})

cost.df <- as.data.frame (t (cost.df))
plot (cost.df$fpr, cost.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (cost.df$fpr, cost.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (cost.df),start=0, end=4/6)))

df <- data.frame ()
for (gamma in -10:10)
  df <- rbind (df, svmperf (gamma = 2^gamma))
head (df)
plot (df$fpr, df$tpr)

gamma.df <- split (df, df$gamma)

gamma.df <- sapply (gamma.df, function (x) {
     i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
     x [i,]
})

gamma.df <- as.data.frame (t (gamma.df))
plot (gamma.df$fpr, gamma.df$tpr, type = "l", xlim = 0:1, ylim = 0:1, lty = 2)
points (gamma.df$fpr, gamma.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (gamma.df),start=0, end=4/6)))

roc.df <- subset (df, cost == 1 & gamma == 1)
plot (roc.df$fpr, roc.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (roc.df$fpr, roc.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (roc.df),start=0, end=4/6)))

1
Questo è molto chiaro, grazie. Ho avuto l'idea che variare b è come spostare l'iperpiano e quindi avere diversi (TPR, FPR)! ma con il classificatore SVM, il bias b viene appreso, quindi sembra essere il parametro migliore? no ?, in tal caso, non è necessario eseguire l'analisi ROC ?, no?
Abdelhak Mahmoudi,

@AbdelhakMahmoudi: immagino che i parametri appresi dal modello non siano ciò che si desidera variare. Ma dato che puoi avere un output di probabilità (non ho scavato nel codice, quindi non so se l'SVM di probabilità è veramente equivalente a quelli "difficili"), perché non usarlo? Questo è un risultato molto comune da cui viene generato il ROC. La funzione svm di R è un'interfaccia per libsvm ampiamente usato, quindi non sei limitato a usare R per farlo.
cbeleites supporta Monica il

these plots do have a meaning- qual è il significato di quelle trame?
Gulzar,

8

y^y^=cartello(wTX+B)wB

y^={0Se  wTX+B<01altrimenti

ηη

y^={0Se  wTX+B<η1altrimenti

η

wBη

>>> from sklearn.svm import SVC
>>> model = SVC(kernel='linear', C=0.001, probability=False, class_weight='balanced')
>>> model.fit(X, y)
>>> # The coefficients w are given by
>>> w = list(model.coef_)
>>> # The intercept b is given by
>>> b = model.intercept_[0]
>>> y_hat = X.apply(lambda s: np.sum(np.array(s)*np.array(w))+b, axis=1)
>>> y_hat = (y_hat > eta).astype(float)

3

La curva ROC traccia la specificità rispetto alla sensibilità che varia con la soglia di una covariata (che può essere continua o discreta). Penso che tu stia confondendo la covariata con la risposta e forse non capisci completamente cos'è una curva ROC. È certamente una curva se la covariata è continua e osserviamo una soglia per la covariata che cambia continuamente. Se la covariata è discreta, è ancora possibile tracciare è in funzione di una soglia continua. Quindi la curva sarebbe piatta con gradini verso l'alto (o verso il basso) alle soglie che corrispondono ai valori discreti della covariata. Quindi questo si applicherebbe a SVM e a qualsiasi altro classificatore discreto.

Per quanto riguarda l'AUC poiché abbiamo ancora un ROC (stimato) possiamo ancora calcolare l'area sottostante. Non sono sicuro di quale fosse il tuo pensiero in merito alla tua domanda sulla convalida incrociata. Nel contesto dei problemi di classificazione, la convalida incrociata viene utilizzata per ottenere stime imparziali o quasi imparziali dei tassi di errore per il classificatore. Quindi può entrare nel modo in cui stimiamo i punti sul ROC.


1
Ok, quali potrebbero essere le soglie per il classificatore svm?
Abdelhak Mahmoudi,

Non lo so. Quali sono le covariate? Se hai una covariata qualsiasi valore potrebbe essere una soglia. Se si dispone di più di una covariata, le prestazioni del classificatore dipendono dalla scelta di più valori anziché da una singola soglia, ma variano comunque nello spazio delle covariate.
Michael R. Chernick,

Ad esempio, le SVM lineari si basano sull'iperpiano di separazione che dipende dal valore C scelto (una C bassa tollera più errori di addestramento), un insieme di valori C potrebbe essere l'insieme delle soglie?
Abdelhak Mahmoudi,

Sì e i valori C non sono solo combinazioni lineari delle covariate?
Michael R. Chernick,

2
C è il fattore di penalità introdotto per controllare il compromesso tra la complessità dell'iperpiano e gli errori di addestramento. Un'altra alternativa potrebbe essere l'uso del bias b come soglia poiché b è la distanza dal centro dello spazio caratteristiche all'iperpiano di separazione. Quindi variare b è come spostare l'iperpiano e quindi avere TP e FP diversi! Questa è la mia comprensione!
Abdelhak Mahmoudi,
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.