2016-03-01 44 views
6

Versione corta:R accento circonflesso: Massimizzare la sensibilità per la classe positivo definito manualmente per la formazione (classificazione),

C'è un modo per istruire punto di inserimento di formare una regressione modello

  1. Utilizzo di un utente etichetta definita come "etichetta di classe positiva"?
  2. Ottimizza il modello per la sensibilità durante l'allenamento (anziché il ROC)?

Versione lunga:

Ho un dataframe

> feature1 <-     c(1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0) 
> feature2 <-     c(1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1) 
> feature3 <-     c(0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0) 
> TARGET <- factor(make.names(c(1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1))) 
> df <- data.frame(feature1, feature2, feature3, TARGET) 

E modello di formazione è implementato come

> ctrl <- trainControl(
+  method="repeatedcv", 
+  repeats = 2) 
> 
> tuneGrid <- expand.grid(k = c(2,5,7)) 
> 
> tune <- train(
+  TARGET ~ ., 
+  metric = '???', 
+  maximize = TRUE, 
+  data = df, 
+  method = "knn", 
+  trControl = ctrl, 
+  preProcess = c("center","scale"), 
+  tuneGrid = tuneGrid 
+) 
> sclasses <- predict(tune, newdata = df) 
> df$PREDICTION <- make.names(factor(sclasses), unique = FALSE, allow_ = TRUE) 

voglio massimizzare il sensitivity = precision = A/(A + C)

enter image description here

Dove Event (nell'immagine) dovrebbe essere nel mio caso X1 = action taken. Ma il numero di telefono utilizzaX0 = no action taken.

si imposta la classe di positivo per la mia matrice di confusione utilizzando l'argomento positive come

> confusionMatrix(df$PREDICTION, df$TARGET, positive = "X1") 

Ma esiste un modo per impostare questo tipo di formazione, mentre (massimizzando la sensibilità)?

Ho già controllato se c'è un'altra metrica che soddisfa il mio bisogno, ma non sono riuscito a trovarne uno nello documentation. Devo implementare il mio summaryFunction per trainControl?

Grazie!

+3

In classifica, si può usare come un summaryFunction' 'twoClassSummary'' 'all'interno trainControl (..., classProbs = TRUE, summaryFunction = twoClassSummary)'. Quindi usa 'metric' Sens dentro' treno (..., metric = "Sens") '. –

risposta

8

Per quanto ne so, non esiste un modo diretto per specificare questo nel corso di formazione (ho cercato questo da solo per un po 'di tempo). Tuttavia, ho trovato una soluzione: puoi semplicemente riordinare i livelli della variabile di destinazione nel dataframe. Poiché l'algoritmo di allenamento prenderà il primo livello rilevato come classe positiva per impostazione predefinita, questo risolve il tuo problema. Basta aggiungere questa semplice riga di codice e che fa il trucco:

TARGET <- factor(make.names(c(1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1))) 
TARGET <- relevel(TARGET, "X1") 
0

Ho scritto una funzione che ha un senso più intuitivo per me vale a dire in cui la classe positivo è il secondo livello (risultato di levels(TARGET)[2]) ed è quindi utilizzata per calcolare la sensibilità.

mySummary <- function(data, lev = NULL, model = NULL){ 

    lvls <- levels(data$obs) 

    if (length(lvls) > 2) 
    stop(paste("Your outcome has", length(lvls), "levels. The twoClassSummary() function isn't appropriate.")) 

    caret:::requireNamespaceQuietStop("ModelMetrics") 

    if (!all(levels(data[, "pred"]) == lvls)) 
    stop("levels of observed and predicted data do not match") 

    data$y = as.numeric(data$obs == lvls[2]) 

    rocAUC <- ModelMetrics::auc(ifelse(data$obs == lvls[1], 
            0, 
            1), 
           data[, lvls[2]]) 
    out <- c(rocAUC, 
      sensitivity(data[, "pred"], data[, "obs"], lvls[2]), 
      specificity(data[, "pred"], data[, "obs"], lvls[1])) 

    names(out) <- c("ROC", "Sens", "Spec") 

    out 

}