Sử dụng gói caret có thể thu được ma trận nhầm lẫn cho các giá trị ngưỡng cụ thể không?


13

Tôi đã thu được một mô hình hồi quy logistic (thông qua train) cho một phản ứng nhị phân, và tôi đã thu được ma trận nhầm lẫn logistic qua confusionMatrixtrong caret. Nó cho tôi ma trận nhầm lẫn mô hình logistic, mặc dù tôi không chắc ngưỡng nào đang được sử dụng để có được nó. Làm thế nào để có được ma trận nhầm lẫn cho các giá trị ngưỡng cụ thể sử dụng confusionMatrixtrong caret?


Tôi không có câu trả lời, nhưng thường những câu hỏi như thế này được trả lời trong tệp trợ giúp. Nếu thất bại, bạn có thể xem mã nguồn. Bạn có thể in nguồn ra bàn điều khiển bằng cách gõ confusionmatrixmà không cần dấu ngoặc đơn.
Shadowtalker

Nó không rõ ràng những gì bạn đã làm chính xác. Bạn đã gọi glmhàm từ statsgói và chuyển kết quả của nó đến confusionMatrix? Tôi không biết người ta có thể làm điều đó, và đọc hướng dẫn thì không rõ ai có thể làm được. Hay bạn đã làm predictgì đó? Một ví dụ ngắn sẽ giúp.
Calimo

1
@Calimo Tôi đã sử dụng trainchức năng này caretđể phù hợp với mô hình, cho phép tôi chỉ định nó là một glm với họ nhị thức. Sau đó tôi đã sử dụng predicthàm trên đối tượng được tạo thông qua train.
Sữa đen

Câu trả lời:


10

Hầu hết các mô hình phân loại trong R tạo ra cả dự đoán lớp và xác suất cho mỗi lớp. Đối với dữ liệu nhị phân, trong hầu hết mọi trường hợp, dự đoán lớp dựa trên mức cắt xác suất 50%.

glmlà giống nhau. Với caret, việc sử dụng predict(object, newdata)cung cấp cho bạn lớp dự đoán và predict(object, new data, type = "prob")sẽ cung cấp cho bạn xác suất cụ thể của lớp (khiobject được tạo bởi train).

Bạn có thể làm những điều khác biệt bằng cách xác định mô hình của riêng bạn và áp dụng bất cứ điều gì bạn muốn. Các caret trang web cũng có một ví dụ có sử dụng resampling để tối ưu hóa cắt xác suất.

tl; dr

confusionMatrix sử dụng các lớp dự đoán và do đó cắt giảm xác suất 50%

Tối đa


14

Có một cách khá dễ dàng, giả sử tune <- train(...):

probsTest <- predict(tune, test, type = "prob")
threshold <- 0.5
pred      <- factor( ifelse(probsTest[, "yes"] > threshold, "yes", "no") )
pred      <- relevel(pred, "yes")   # you may or may not need this; I did
confusionMatrix(pred, test$response)

Rõ ràng, bạn có thể đặt ngưỡng cho bất cứ điều gì bạn muốn thử hoặc chọn "tốt nhất", trong đó tốt nhất có nghĩa là độ đặc hiệu và độ nhạy kết hợp cao nhất:

library(pROC)
probsTrain <- predict(tune, train, type = "prob")
rocCurve   <- roc(response = train$response,
                      predictor = probsTrain[, "yes"],
                      levels = rev(levels(train$response)))
plot(rocCurve, print.thres = "best")

Sau khi xem ví dụ Max được đăng, tôi không chắc có một số sắc thái thống kê làm cho cách tiếp cận của tôi ít được mong muốn hơn không.


Trong biểu đồ rocCurve xuất ra, ba giá trị có ý nghĩa gì? ví dụ: trên dữ liệu của tôi, nó ghi là 0,289 (0,853, 0,831). Liệu 0,289 có nghĩa là ngưỡng tốt nhất mà người ta nên sử dụng trong việc phân định kết quả nhị phân? tức là mọi trường hợp có xác suất dự đoán> 0,289 sẽ được mã hóa là "1" và mọi trường hợp có xác suất dự đoán <0,289 sẽ được mã hóa "0", thay vì ngưỡng 0,5 mặc định của caretgói?
coip

2
vâng, điều đó hoàn toàn chính xác và 2 giá trị khác trong ngoặc đơn là độ nhạy và độ đặc hiệu (tuy nhiên, thành thật mà nói, tôi quên đó là cái gì)
efh0888

2
Ngoài ra, kể từ đó tôi đã tìm ra bạn có thể trích xuất nó từ đường cong roc bằng cách sử dụng rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]nó cũng cho phép bạn linh hoạt để cân chúng khác nhau nếu bạn muốn ... một điều cuối cùng cần lưu ý là thực tế, bạn có thể muốn điều chỉnh ngưỡng (như bạn sẽ làm với bất kỳ siêu tham số mô hình nào) như Max mô tả ở đây .
efh0888
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.