จะเปลี่ยน threshold สำหรับการจำแนกใน R สุ่มป่าได้อย่างไร


10

วรรณกรรมแบบจำลองการกระจายพันธุ์ทุกชนิดชี้ให้เห็นว่าเมื่อทำนายการมีอยู่ของสายพันธุ์โดยใช้แบบจำลองที่มีความน่าจะเป็นผลลัพธ์ (เช่น RandomForests) การเลือกเกณฑ์ความน่าจะเป็นที่จะจำแนกประเภทของสิ่งมีชีวิตที่มีอยู่จริง ไม่พึ่งพาค่าเริ่มต้น 0.5 เสมอไป ฉันต้องการความช่วยเหลือในเรื่องนี้! นี่คือรหัสของฉัน:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

จากนี้ฉันได้พิจารณาแล้วว่าเกณฑ์ที่ฉันต้องการใช้สำหรับการจำแนกสถานะจากความน่าจะเป็นที่คาดการณ์คือ 0.7 ไม่ใช่ค่าเริ่มต้น 0.5 ฉันไม่เข้าใจว่าจะทำอย่างไรกับข้อมูลนี้ ฉันเพียงแค่ใช้ขีด จำกัด นี้เมื่อสร้างแผนที่ผลลัพธ์ของฉันหรือไม่? ฉันสามารถสร้างผลลัพธ์ที่แมปได้อย่างง่ายดายด้วยความน่าจะเป็นอย่างต่อเนื่องจากนั้นเพียงจัดประเภทใหม่ด้วยค่าที่มากกว่า 0.7 ในปัจจุบันและที่ <0.7 ไม่อยู่

หรือฉันต้องการใช้ข้อมูลนี้และเรียกใช้การสร้างแบบจำลองป่าสุ่มใหม่โดยใช้พารามิเตอร์การตัดออกหรือไม่ พารามิเตอร์ cut-off ทำอะไรกันแน่? มันเปลี่ยนการโหวตผลลัพธ์? (ปัจจุบันบอกว่ามันเป็น "ส่วนใหญ่") ฉันจะใช้พารามิเตอร์การตัดออกนี้ได้อย่างไร ฉันไม่เข้าใจเอกสาร! ขอบคุณ!


2
ฉันจะบอกว่านี่อาจจะอยู่ที่นี่: ปัญหาของ (1) การประมาณความน่าจะเป็นจาก RF, (2) ว่าคุณสามารถกำหนดฟังก์ชันต้นทุนในรูปแบบหรือต้องสร้างเป็นแบบจำลองและ (3) วิธีการใช้ฟังก์ชันต้นทุน ใน RF เป็นปัญหาที่เกิดขึ้นซ้ำ ๆ ที่ไม่เกี่ยวข้องกับการเขียนโปรแกรม
charles

คำตอบ:


7

#set threshold หรือค่า cutoff เป็น 0.7

cutoff=0.7

#all ค่าต่ำกว่าค่า cutoff 0.7 จะถูกจัดประเภทเป็น 0 (มีอยู่ในกรณีนี้)

RFpred[RFpred<cutoff]=0

#all ค่าที่มากกว่าค่า cutoff 0.7 จะถูกจัดประเภทเป็น 1 (ไม่มีในกรณีนี้)

 RFpred[RFpred>=cutoff]=1

1
คุณช่วยขยายคำตอบให้หน่อยได้ไหม? อย่างน้อยมันจะมีประโยชน์ในการใส่คำอธิบายประกอบรหัสของคุณ
Patrick Coulombe

2
FWIW ฉันคิดว่ามันเพียงพอแล้ว
Sycorax พูดว่า Reinstate Monica

คำตอบนี้ให้เสียงสมบูรณ์แบบ ฉันเห็นด้วย.
Seanosapien

7

ขออภัยคุณไม่ได้รับและพยายามตอบคำถาม จะแนะนำหนังสือของ Max Kuhn สำหรับความครอบคลุมของปัญหานี้ นี่เป็นปัญหาที่ค่อนข้างกว้าง เพียงเพิ่มบิต:

  1. เส้นโค้งของ ROC นั้นเป็นที่นิยม แต่ก็สมเหตุสมผลถ้าคุณพยายามที่จะเข้าใจถึงการแลกเปลี่ยนระหว่างผลลัพธ์ที่เป็นค่าลบและผลบวกที่เป็นเท็จ หาก CostFN = CostFP ไม่แน่ใจว่าเหมาะสมหรือไม่ c-statistic และมาตรการอื่น ๆ ที่ได้รับยังมีการใช้งานอยู่ หากคุณต้องการความแม่นยำสูงสุด - เพียงแค่ปรับโมเดลของคุณสำหรับสิ่งนี้ (caret package ทำให้มันง่าย) อย่าไปทำโค้ง ROC
  2. ทุกคนใช้ความน่าจะเป็นที่ได้รับจากโมเดล RF ฉันคิดว่าควรให้ความคิดบางอย่างกับการทำเช่นนี้ไม่ใช่แบบจำลองความน่าจะเป็นพวกเขาไม่ได้สร้างขึ้นเพื่อทำสิ่งนี้ มันใช้งานได้บ่อย อย่างน้อยที่สุดฉันจะสร้างพล็อตการตรวจสอบความถูกต้องของ RF probabilies สำหรับข้อมูลใหม่ถ้าฉันสนใจ probabilies จริง ๆ
  3. วิธีที่ง่ายที่สุดคือการใช้ "เพียงจัดประเภทใหม่ด้วยค่าที่มากกว่า 0.7 ในปัจจุบันและที่ <0.7 ไม่อยู่"
  4. ถ้า cost (FN) ไม่เท่ากับ cost (FP) คุณต้องทำให้ RF มีความอ่อนไหว R ไม่ได้ทำให้เป็นเรื่องง่าย ฟังก์ชั่นการถ่วงน้ำหนักในแพ็คเกจ RandomForest ไม่ทำงาน ตัวเลือกที่ดีที่สุดคือการเล่นด้วยการสุ่มตัวอย่างกรณีส่วนใหญ่ที่ไม่เน้นเพื่อรับฟังก์ชั่นค่าใช้จ่ายที่คุณต้องการ แต่ความสัมพันธ์ระหว่างอัตราส่วนตัวอย่างและค่าใช้จ่ายไม่ได้โดยตรง ดังนั้นคุณอาจต้องการติดกับ (3)

อัปเดต เกี่ยวกับตุ้มน้ำหนัก Class Andy Liaw:
ตัวเลือก "classwt" ปัจจุบันในแพ็คเกจ randomForest มีมาตั้งแต่ต้นและแตกต่างจากรหัส Fortran อย่างเป็นทางการ (เวอร์ชัน 4 และใหม่กว่า) ใช้ตุ้มน้ำหนัก Class เพียงแค่บัญชีสำหรับชั้นเรียน น้ำหนักในการคำนวณดัชนี Gini เมื่อแยกโหนดเหมือนกับวิธีการทำ CART tree แบบเดียวเมื่อให้น้ำหนักคลาส Prof. Breiman เกิดขึ้นกับรูปแบบการถ่วงน้ำหนักระดับที่ใหม่กว่าที่ใช้ในรหัส Fortran รุ่นใหม่หลังจากที่เราพบว่าใช้เพียง น้ำหนักในดัชนี Gini ดูเหมือนจะไม่ได้ช่วยในข้อมูลที่ไม่สมดุลมากนัก (พูด 1: 100 หรือแย่กว่านั้น) ถ้าใช้ Gini ถ่วงน้ำหนักช่วยในสถานการณ์ของคุณโดยทั้งหมดทำได้เลยฉันสามารถพูดได้ว่าในอดีตเท่านั้น ไม่ได้ให้ผลลัพธ์ที่เราคาดหวัง "


คุณช่วยอธิบายเกี่ยวกับ subpoint (4) ว่าทำไมการโต้แย้งเรื่องน้ำหนักจึงไม่ทำงาน
Sycorax พูดว่า Reinstate Monica

2
ความเข้าใจของฉันคือการใช้อย่างถูกต้องในรหัส Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) แต่ไม่ใช่แพ็คเกจ R สิ่งนี้ถูกกล่าวถึง: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) และศูนย์รอบ ๆ ที่จำเป็นต้องใช้น้ำหนักในการสร้างต้นไม้ทุกขั้นตอนไม่ใช่แค่แยกจาก Gini ดังนั้นการนำ R ไปใช้ในปัจจุบัน - การใช้น้ำหนักเพียงอย่างเดียวที่แยกไม่ได้ผลดีมาก
charles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.