Tính toán độ chính xác và thu hồi trong R


8

Giả sử tôi đang xây dựng một phân loại hồi quy logistic dự đoán xem ai đó đã kết hôn hay độc thân. (1 = đã kết hôn, 0 = độc thân) Tôi muốn chọn một điểm trên đường cong gợi nhớ chính xác mang lại cho tôi độ chính xác ít nhất 75%, vì vậy tôi muốn chọn ngưỡng và , để:t1t2

  • Nếu đầu ra của trình phân loại của tôi lớn hơn , thì tôi xuất "kết hôn".t1
  • Nếu đầu ra dưới , tôi xuất "đơn".t2
  • Nếu đầu ra ở giữa, tôi xuất "Tôi không biết".

Một vài câu hỏi:

  1. Tôi nghĩ theo định nghĩa chuẩn về độ chính xác, độ chính xác sẽ đo lường độ chính xác của riêng lớp kết hôn (nghĩa là độ chính xác = # lần tôi dự đoán chính xác kết hôn / tổng số lần tôi dự đoán kết hôn). Tuy nhiên, điều tôi thực sự muốn làm là đo lường độ chính xác tổng thể (nghĩa là tổng số lần tôi dự đoán chính xác kết hôn hoặc độc thân / tổng số lần tôi dự đoán kết hôn hoặc độc thân). Đây có phải là một điều tốt để làm? Nếu không, tôi nên làm gì?
  2. Có cách nào để tính đường cong chính xác / thu hồi "tổng thể" này trong R (ví dụ: sử dụng gói ROCR hoặc một số thư viện khác) không? Tôi hiện đang sử dụng gói ROCR, nhưng dường như nó chỉ cung cấp cho tôi độ chính xác / thu hồi một lớp một lần.

Câu trả lời:


7

Tôi đã viết một chức năng cho mục đích này, dựa trên bài tập trong cuốn sách Khai thác dữ liệu với R:

# Function: evaluation metrics
    ## True positives (TP) - Correctly idd as success
    ## True negatives (TN) - Correctly idd as failure
    ## False positives (FP) - success incorrectly idd as failure
    ## False negatives (FN) - failure incorrectly idd as success
    ## Precision - P = TP/(TP+FP) how many idd actually success/failure
    ## Recall - R = TP/(TP+FN) how many of the successes correctly idd
    ## F-score - F = (2 * P * R)/(P + R) harm mean of precision and recall
prf <- function(predAct){
    ## predAct is two col dataframe of pred,act
    preds = predAct[,1]
    trues = predAct[,2]
    xTab <- table(preds, trues)
    clss <- as.character(sort(unique(preds)))
    r <- matrix(NA, ncol = 7, nrow = 1, 
        dimnames = list(c(),c('Acc',
        paste("P",clss[1],sep='_'), 
        paste("R",clss[1],sep='_'), 
        paste("F",clss[1],sep='_'), 
        paste("P",clss[2],sep='_'), 
        paste("R",clss[2],sep='_'), 
        paste("F",clss[2],sep='_'))))
    r[1,1] <- sum(xTab[1,1],xTab[2,2])/sum(xTab) # Accuracy
    r[1,2] <- xTab[1,1]/sum(xTab[,1]) # Miss Precision
    r[1,3] <- xTab[1,1]/sum(xTab[1,]) # Miss Recall
    r[1,4] <- (2*r[1,2]*r[1,3])/sum(r[1,2],r[1,3]) # Miss F
    r[1,5] <- xTab[2,2]/sum(xTab[,2]) # Hit Precision
    r[1,6] <- xTab[2,2]/sum(xTab[2,]) # Hit Recall
    r[1,7] <- (2*r[1,5]*r[1,6])/sum(r[1,5],r[1,6]) # Hit F
    r}

Trong trường hợp đối với bất kỳ tác vụ phân loại nhị phân nào, điều này trả về độ chính xác, thu hồi và chỉ số F cho mỗi phân loại và độ chính xác tổng thể như vậy:

> pred <- rbinom(100,1,.7)
> act <- rbinom(100,1,.7)
> predAct <- data.frame(pred,act)
> prf(predAct)
      Acc     P_0       R_0       F_0       P_1       R_1       F_1
[1,] 0.63 0.34375 0.4074074 0.3728814 0.7647059 0.7123288 0.7375887

Tính toán P, R và F cho mỗi lớp như thế này cho phép bạn xem liệu cái này hay cái kia có gây khó khăn hơn cho bạn hay không và thật dễ dàng để tính toán các chỉ số P, R, F tổng thể. Tôi chưa sử dụng gói ROCR, nhưng bạn có thể dễ dàng rút ra các đường cong ROC tương tự bằng cách đào tạo trình phân loại qua phạm vi của một số tham số và gọi hàm cho các trình phân loại tại các điểm dọc theo phạm vi.


Tôi nghĩ rằng bạn có độ chính xác và thu hồi mã đổi. Nó phải là r [1,5] <- xTab [2,2] / sum (xTab [2,])
danioyuan

6

Như Robert đã nói một cách chính xác, Độ chính xác là con đường để đi. Tôi chỉ muốn thêm rằng có thể tính toán nó với ROCR. Hãy xem trợ giúp (hiệu suất) để chọn các biện pháp khác nhau.

Ví dụ, trong ROCR chỉ có một ngưỡng quyết định được sử dụng được gọi là cắt . Đoạn mã sau biểu thị độ chính xác so với ngưỡng và trích xuất điểm cắt để có độ chính xác tối đa.

require(ROCR)

# Prepare data for plotting
data(ROCR.simple)
pred <- with(ROCR.simple, prediction(predictions, labels))
perf <- performance(pred, measure="acc", x.measure="cutoff")

# Get the cutoff for the best accuracy
bestAccInd <- which.max(perf@"y.values"[[1]])
bestMsg <- paste("best accuracy=", perf@"y.values"[[1]][bestAccInd], 
              " at cutoff=", round(perf@"x.values"[[1]][bestAccInd], 4))

plot(perf, sub=bestMsg)

kết quả là

nhập mô tả hình ảnh ở đây

Để hoạt động với hai ngưỡng để tạo vùng không chắc chắn ở giữa (đây là cách hợp lệ để thực hiện nếu hoàn cảnh / ứng dụng đích cho phép), người ta có thể tạo hai đối tượng hiệu suất với ROCR

  1. ngưỡng chính xác so với tỷ lệ tích cực thực (tpr) aka độ chính xác cho lớp dương
  2. mức cắt so với tỷ lệ âm tính thực (tnr) aka độ chính xác cho lớp âm

Chọn một điểm cắt phù hợp từ các vectơ hiệu suất (sử dụng phương pháp R) và kết hợp chúng để đạt được sự cân bằng mong muốn. Điều này nên đơn giản, do đó tôi để nó như một bài tập cho người đọc.

Một lưu ý cuối cùng: Sự khác biệt giữa Độ chính xác và độ chính xác tính toán cho cả hai lớp riêng biệt và ví dụ: kết hợp chúng ở mức trung bình (có trọng số) là gì?

Độ chính xác tính toán trung bình có trọng số, trong đó trọng số cho lớp c tương đương với số lượng phiên bản với lớp c. Điều này có nghĩa là nếu bạn bị lệch lớp nặng (ví dụ 98% âm), có thể chỉ cần "tối ưu hóa" độ chính xác bằng cách đặt dự đoán nhãn âm cho tất cả các trường hợp. Trong trường hợp như vậy, trung bình đồng bằng không trọng số của cả hai phân lớp đều ngăn cản việc chơi trò chơi số liệu. Trong trường hợp của một lớp cân bằng, cả hai phương pháp tính toán đều dẫn đến cùng một kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.