เราจะวาด ROC curve สำหรับต้นไม้ตัดสินใจได้อย่างไร?


13

โดยปกติเราไม่สามารถวาดเส้นโค้ง ROC สำหรับตัวแยกประเภทแยกเช่นต้นไม้ตัดสินใจ ฉันถูกไหม? มีวิธีใดในการวาดเส้นโค้ง ROC สำหรับ Dtrees หรือไม่?


1
คุณสามารถหาแอสเวิร์
rapaio

[การประเมินโมเดลต้นไม้ตัดสินใจสำหรับ“ ชุดฝึกซ้อม” เทียบกับ“ ชุดทดสอบ” ใน R] [1] [1]: stats.stackexchange.com/questions/49416/ คุณสามารถหาคำตอบได้ที่นี่
Sangram

@rapaio ขออภัยลิงค์ของคุณแสดงเส้นโค้ง ROC เพื่อค้นหาขีด จำกัด ในตัวจําแนกซึ่งผลิตผลลัพธ์ระหว่าง 1 ถึง 0 (ค่าต่อเนื่อง)
DataMiner

@ Sangram เหล่านี้เป็นโซลูชั่นใน R แต่ฉันต้องการเพียงแค่เข้าใจว่ามันทำงานอย่างไร
DataMiner

คำตอบ:


15

(x,y)=(FPR,TPR)FPRTPR

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนี้คือการคำนวณบนหน้าวิกิพีเดีย

(0,0)(1,1)

TFTF(scoreT,scoreF)=(countTcountT+countF,countFcountT+countF)=(10/15,5/15)=(0.66,0.33)


13

สำหรับต้นไม้การตัดสินใจชั้นเรียนจะยังคงคาดการณ์ด้วยความมั่นใจในระดับหนึ่ง คำตอบได้รับโดย @rapaio แล้ว แต่ฉันจะขยายออกไปเล็กน้อย

ลองนึกภาพต้นไม้ตัดสินใจดังต่อไปนี้ (เป็นรุ่นบิตการแก้ไขเล็ก ๆ น้อย ๆ นี้อย่างใดอย่างหนึ่ง )

ตัวอย่างต้นไม้ตัดสินใจ

ในแต่ละโหนดนั้นไม่เพียง แต่ฉลากระดับเสียงส่วนใหญ่เท่านั้น แต่ยังรวมถึงสิ่งอื่น ๆ ที่จบลงที่ใบไม้นั้นดังนั้นเราจึงสามารถกำหนดระดับความแน่นอนให้กับใบไม้นั้นที่เราคาดการณ์ฉลากได้

ตัวอย่างเช่นพิจารณาข้อมูลต่อไปนี้

ข้อมูล

เราเรียกใช้และกำหนดคะแนนให้กับผลลัพธ์ไม่ใช่ป้ายกำกับจริง ด้วยสิ่งนี้เราสามารถวาดเส้นโค้ง ROC ตามที่แนะนำไว้ที่นี่

เส้นโค้ง

แม้ว่าจะมีความรู้สึกเล็กน้อยที่จะใช้เพื่อปรับเกณฑ์ของคุณ (เนื่องจากแน่นอนว่าไม่มีสิ่งใดเป็นเกณฑ์ในต้นไม้การตัดสินใจ) แต่ก็ยังสามารถใช้ในการคำนวณ AUC ซึ่งในกรณีนี้คือ 0.92

ใช้รหัส R ที่นี่:

outlook = c('rain', 'overcast', 'rain', 'sunny', 'rain', 
            'rain', 'sunny', 'overcast', 'overcast', 'overcast', 
            'sunny', 'sunny', 'rain', 'rain', 'overcast',
            'sunny', 'overcast', 'overcast', 'sunny', 'sunny',
            'sunny', 'overcast')
humidity = c(79, 74, 80, 60, 65, 79, 60, 74, 77, 80, 
             71, 70, 80, 65, 70, 56, 80, 70, 56, 70,
             71, 77)
windy = c(T, T, F, T, F, T, T, T, T, F, T, F, F, F, T, T, F, T, T, F, T, T)
play = c(F, F, T, F, T, F, F, T, T, T, F, F, T, T, T, T, T, T, F, T, F, T)

game = data.frame(outlook, humidity, windy, play)
game$score = NA

attach(game)
game$score[outlook == 'sunny' & humidity <= 70] = 5/8
game$score[outlook == 'sunny' & humidity > 70] = 1 - 3/4
game$score[outlook == 'overcast'] = 4/5
game$score[outlook == 'rain' & windy == T] = 1 - 2/2
game$score[outlook == 'rain' & windy == F] = 3/3
detach(game)

game$predict = game$score >= 0.5
game$correct = game$predict == game$play

library(ROCR)

pred = prediction(game$score, game$play)
roc = performance(pred, measure="tpr", x.measure="fpr")
plot(roc, col="orange", lwd=2) 
lines(x=c(0, 1), y=c(0, 1), col="red", lwd=2)

auc = performance(pred, 'auc')
slot(auc, 'y.values')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.