2016-03-01 15 views
6

Version viết tắt:R caret: Tối đa hóa sự nhạy cảm cho các lớp học tích cực bằng tay được xác định cho đào tạo (phân loại),

Có cách nào để hướng dẫn caret để đào tạo một hồi quy mô hình

  1. Sử dụng một người sử dụng nhãn được xác định là "nhãn lớp dương"?
  2. Tối ưu hóa mô hình cho độ nhạy trong quá trình đào tạo (thay vì ROC)?

dài Version:

Tôi có một 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) 

Và mô hình đào tạo được thực hiện như

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

Tôi muốn tối đa hóa sensitivity = precision = A/(A + C)

enter image description here

đâu Event (trong ảnh) nên trong trường hợp của tôi X1 = action taken. Nhưng caret sử dụngX0 = no action taken.

tôi có thể thiết lập các lớp dương tính với ma trận nhầm lẫn của tôi bằng cách sử dụng các lập luận positive như

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

Nhưng có cách nào để thiết lập đào tạo trong khi điều này (tối đa hóa sự nhạy cảm)?

Tôi đã kiểm tra xem có số liệu nào khác phù hợp với nhu cầu của tôi hay không, nhưng tôi không thể tìm thấy số liệu trong số documentation. Tôi có phải triển khai summaryFunction của riêng mình cho trainControl không?

Cảm ơn!

+3

Trong phân loại, bạn có thể sử dụng dưới dạng 'summaryFunction'' haiClassSummary' bên trong 'trainControl (..., classProbs = TRUE, summaryFunction = twoClassSummary)'. Sau đó sử dụng 'metric' Sens bên trong' train (..., metric = "Sens") '. –

Trả lời

8

Theo như tôi biết, không có cách nào trực tiếp để xác định điều này trong quá trình đào tạo (tôi đã tự tìm kiếm trong thời gian này). Tuy nhiên, tôi đã tìm thấy giải pháp thay thế: bạn chỉ có thể sắp xếp lại cấp độ của biến mục tiêu trong khung dữ liệu. Theo thuật toán đào tạo sẽ có mức độ gặp phải đầu tiên là lớp tích cực theo mặc định, điều này giải quyết vấn đề của bạn. Chỉ cần thêm dòng này mã đơn giản và hiện các trick:

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

Tôi đã viết một chức năng mà làm cho cảm giác trực quan hơn cho tôi tức là nơi mà các lớp học tích cực là mức thứ hai (kết quả của levels(TARGET)[2]) và vì thế sử dụng để tính độ nhạy.

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 

} 
Các vấn đề liên quan