การใช้แพ็กเกจคาเร็ตนั้นเป็นไปได้หรือไม่ที่จะได้รับเมทริกซ์ความสับสนสำหรับค่าเกณฑ์เฉพาะ


13

ผมเคยได้รับรูปแบบการถดถอยโลจิสติก (ผ่านtrain) สำหรับการตอบสนองไบนารีและฉันได้รับเมทริกซ์ความสับสนโลจิสติกผ่านทางในconfusionMatrix caretมันให้เมทริกซ์ความสับสนของโมเดลโลจิสติกถึงฉัน แต่ฉันไม่แน่ใจว่าจะใช้เกณฑ์ใดในการรับ ฉันจะรับเมทริกซ์ความสับสนสำหรับค่าเกณฑ์เฉพาะที่ใช้confusionMatrixในได้caretอย่างไร


ฉันไม่ได้รับคำตอบ แต่บ่อยครั้งที่คำถามเช่นนี้มีคำตอบอยู่ในไฟล์ช่วยเหลือ หากล้มเหลวคุณสามารถดูซอร์สโค้ดเองได้ คุณสามารถพิมพ์ซอร์สไปยังคอนโซลโดยพิมพ์confusionmatrixโดยไม่ต้องใส่วงเล็บ
shadowtalker

ยังไม่ชัดเจนว่าคุณได้ทำอะไรไปบ้าง คุณเรียกใช้glmฟังก์ชันจากstatsแพ็กเกจและส่งผลลัพธ์ให้confusionMatrixหรือไม่ ฉันไม่รู้ว่าจะทำอย่างนั้นได้และการอ่านคู่มือไม่สามารถทำได้เลย หรือว่าคุณทำpredictอะไร ตัวอย่างสั้น ๆ จะช่วย
Calimo

1
@ Calimo ฉันได้ใช้trainฟังก์ชั่นcaretเพื่อให้พอดีกับแบบจำลองซึ่งช่วยให้ฉันระบุว่าเป็น glm กับตระกูลทวินาม จากนั้นผมก็ใช้ฟังก์ชั่นบนวัตถุที่สร้างขึ้นผ่านทางpredict train
Black Milk

คำตอบ:


11

โมเดลการจำแนกประเภทส่วนใหญ่ใน R สร้างทั้งการทำนายคลาสและความน่าจะเป็นสำหรับแต่ละคลาส สำหรับข้อมูลไบนารีในเกือบทุกกรณีการคาดการณ์ของชั้นเรียนจะขึ้นอยู่กับการตัดความน่าจะเป็น 50%

glmเหมือนกัน. ด้วยการcaretใช้predict(object, newdata)จะช่วยให้คุณมีคลาสที่ทำนายไว้และpredict(object, new data, type = "prob")จะให้ความน่าจะเป็นเฉพาะคลาสของคุณ (เมื่อobjectสร้างโดยtrain)

คุณสามารถทำสิ่งต่าง ๆ โดยการกำหนดรูปแบบของคุณเองและใช้สิ่งที่คุณต้องการ caret เว็บไซต์นอกจากนี้ยังมีตัวอย่างที่ใช้ในการเพิ่มประสิทธิภาพ resampling ตัดความน่าจะเป็น

TL; DR

confusionMatrix ใช้คลาสที่คาดการณ์และทำให้ความน่าจะเป็นลดลง 50%

แม็กซ์


14

มีวิธีที่ง่ายมากสมมติว่า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)

เห็นได้ชัดว่าคุณสามารถตั้งค่าขีด จำกัด เป็นสิ่งที่คุณต้องการลองหรือเลือก "ดีที่สุด" ซึ่งหมายถึงความจำเพาะและความไวสูงสุดที่รวมกันสูงสุด:

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

หลังจากดูตัวอย่าง Max ที่โพสต์แล้วฉันไม่แน่ใจว่ามีความแตกต่างทางสถิติบ้างไหมที่ทำให้แนวทางของฉันต้องการน้อยลง


ในพล็อตเอาท์พุท rocCurve ทั้งสามค่าหมายถึงอะไร เช่นในข้อมูลของฉันมันบอกว่า 0.289 (0.853, 0.831) 0.289 หมายถึงเกณฑ์ที่ดีที่สุดที่ควรใช้ในการกำหนดเขตแดนผลลัพธ์ไบนารีหรือไม่? นั่นคือทุกกรณีที่มีความน่าจะเป็นที่คาดการณ์> 0.289 จะมีรหัส "1" และทุกกรณีที่มีความน่าจะเป็นที่คาดการณ์ <0.289 จะได้รับรหัส "0" แทนที่จะเป็นเกณฑ์เริ่มต้น 0.5 ของcaretแพคเกจ?
coip

2
อ๋อใช่แล้วและอีกสองค่าในวงเล็บคือความไวและความเฉพาะเจาะจง (โดยสุจริตแม้ว่าฉันลืมว่าอันไหน)
efh0888

2
นอกจากนี้ตั้งแต่นั้นฉันคิดว่าคุณสามารถดึงมันออกมาจากเส้นโค้ง roc โดยใช้rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]ซึ่งยังช่วยให้คุณมีความยืดหยุ่นในการชั่งน้ำหนักมันแตกต่างกันถ้าคุณต้องการ ... สิ่งสุดท้ายที่ควรทราบก็คือคุณอาจต้องการปรับแต่งธรณีประตู คุณจะมี hyperparameter รูปแบบใด) แม็กซ์อธิบายที่นี่
efh0888
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.