2016-03-01 8 views
6

wersji krótkiej:R daszka: Zwiększanie czułość ręcznie określony dodatni klasy szkolenia (klasyfikacja)

istnieje sposób poinstruować daszka trenować regresji model

  1. Stosując użytkownikowi zdefiniowana etykieta jako "pozytywna etykieta klasy"?
  2. Optymalizować model czułości podczas treningu (zamiast ROC)?

Długa wersja:

Mam 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) 

i model szkoleniowy jest realizowany jak

> 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) 

chcę maksymalizować sensitivity = precision = A/(A + C)

enter image description here

Gdzie Event (na zdjęciu) powinny być w moim przypadku X1 = action taken. Ale opiekun używaX0 = no action taken.

mogę ustawić pozytywny klasę dla mojej macierzy błędów za pomocą positive argumentu jak

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

Ale czy jest jakiś sposób, aby ustawić ten trening while (maksymalizując czułość)?

Już sprawdziłem, czy istnieje inna miara odpowiadająca mojej potrzebie, ale nie udało mi się znaleźć jej w documentation. Czy muszę zaimplementować własne summaryFunction dla trainControl?

Dzięki!

+3

W klasyfikacji można używać jako 'summaryFunction'' twoClassSummary' wewnątrz 'trainControl (..., classProbs = TRUE, summaryFunction = twoClassSummary)'. Następnie użyj 'metric' Sens wewnątrz' train (..., metric = "Sens") '. –

Odpowiedz

8

O ile mi wiadomo, nie ma bezpośredniego sposobu na określenie tego w szkoleniu (od pewnego czasu szukam tego sam). Jednak znalazłem obejście: można po prostu zmienić kolejność poziomów zmiennej docelowej w ramce danych. Jako że algorytm treningowy przyjmuje domyślnie pierwszy napotkany poziom jako klasę dodatnią, rozwiązuje to Twój problem. Wystarczy dodać ten prosty wiersz kodu i że załatwia sprawę:

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

Pisałem funkcję, która sprawia, że ​​bardziej intuicyjny sens dla mnie znaczy gdzie pozytywne klasa jest drugi poziom (wynikiem levels(TARGET)[2]) i dlatego jest stosowany obliczyć czułość.

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 

}