วิธีการตีความ OOB และเมทริกซ์ความสับสนสำหรับป่าสุ่ม?


35

ฉันได้สคริปต์ R จากบางคนเพื่อใช้โมเดลฟอเรสต์แบบสุ่ม ฉันแก้ไขและรันด้วยข้อมูลพนักงานบางส่วน เราพยายามทำนายการแยกโดยสมัครใจ

นี่คือข้อมูลเพิ่มเติม: นี่คือรูปแบบการจัดหมวดหมู่คือ 0 = พนักงานยังคงอยู่ 1 = พนักงานถูกยกเลิกตอนนี้เรากำลังดูตัวแปรทำนายโหลเพียงอย่างเดียวข้อมูลคือ "ไม่สมดุล" ในคำว่าระเบียนทำขึ้นประมาณ 7 % ของชุดระเบียนทั้งหมด

ฉันรันโมเดลด้วยการเลือก mtry และ ntree ที่หลากหลาย แต่ตัดสินที่ด้านล่าง OOB คือ 6.8% ซึ่งฉันคิดว่าดี แต่เมทริกซ์ความสับสนดูเหมือนจะบอกเล่าเรื่องราวที่แตกต่างกันสำหรับการทำนายเงื่อนไขเนื่องจากอัตราความผิดพลาดค่อนข้างสูงที่ 92.79% ฉันคิดถูกว่าฉันไม่สามารถพึ่งพาและใช้โมเดลนี้ได้เพราะ อัตราความผิดพลาดสูงสำหรับการทำนายคำศัพท์คืออะไร? หรือมีบางอย่างที่ฉันสามารถทำได้เพื่อใช้ RF และได้รับอัตราความผิดพลาดน้อยลงสำหรับการทำนายคำศัพท์?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

คำตอบ:


20

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

เพื่อจุดประสงค์นี้ฉันขอแนะนำให้วางแผน (i) a ROC curve (ii) ความแม่นยำในการเรียกคืนและ (iii) กราฟการปรับเทียบเพื่อเลือก cutoff ที่เหมาะกับวัตถุประสงค์ของคุณมากที่สุด สิ่งเหล่านี้สามารถลงจุดได้อย่างง่ายดายโดยใช้ 2 ฟังก์ชั่นต่อไปนี้จากไลบรารี ROCR R (ยังมีในCRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

ตัวอย่างเช่น:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

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

ฉันขอแนะนำให้คุณเริ่มต้นด้วยรายการสำหรับเส้นโค้ง ROCที่เชื่อมโยงกับรายการด้านบนและอื่น ๆ ที่กล่าวถึงที่นั่น
Itamar

คำตอบไม่ได้ระบุถึงข้อ จำกัด ของโครงสร้างการตัดสินใจโดยตรงในชุดข้อมูลที่มีความเบ้สูง
SmallChess

19

ชุดของคุณไม่สมดุลอย่างมาก - RF มักจะล้มเหลวในสถานการณ์นี้ (เช่นคาดการณ์เฉพาะคลาสที่ใหญ่กว่าเท่านั้น)

คุณควรลองปรับสมดุลชุดของคุณด้วยการสุ่มคลาส "0" เท่านั้นเพื่อให้มีขนาดใกล้เคียงกับคลาส "1" หรือเล่นกับclasswtพารามิเตอร์


1
แม้จะมีการเป็นclasswtพารามิเตอร์ที่ผมไม่คิดว่ามันจะดำเนินการเลยในrandomForest()การทำงานของrandomForestแพคเกจในอาร์ต่อการเชื่อมโยง คุณได้ใช้มันมาก่อนหรือไม่? ฉันพยายามมันมีค่าแตกต่างกัน classwt=NULLแต่มีผลเหมือนกับการเริ่มต้น
Zhubarb

9

จากเมทริกซ์ความสับสนของคุณคุณมีจุดข้อมูล 5,908 จุดและส่วนใหญ่กว้างใหญ่นั้นเป็นประเภท 0 ('พนักงานพัก') ลักษณนามสามารถหนีไปได้ด้วยการ "ขี้เกียจ" และเลือกคนส่วนใหญ่เว้นแต่จะแน่ใจว่าเป็นตัวอย่างของคลาสอื่น โปรดทราบว่าอัตราความผิดพลาดโดยรวมของคุณคือ ~ 7% ซึ่งค่อนข้างใกล้เคียงกับเปอร์เซ็นต์ของตัวอย่าง Class1!

คุณมีตัวเลือกน้อย:

  • ละทิ้งตัวอย่าง Class0 จนกว่าคุณจะมีคลาสที่มีความสมดุล ฉันไม่รู้ว่ามีวรรณกรรมเกี่ยวกับวิธีเลือกชุดย่อยตัวแทนที่เหมาะสมหรือไม่ (อาจมีบางคนที่สามารถชั่งน้ำหนักได้) แต่คุณสามารถเริ่มต้นด้วยการวางตัวอย่างโดยการสุ่ม คุณสามารถส่งผ่านsubsetข้อโต้แย้งไปยังป่าสุ่มซึ่งควรทำการทดสอบนี้เล็กน้อย

  • ปรับฟังก์ชั่นการสูญเสีย / ตุ้มน้ำหนักระดับเพื่อชดเชยจำนวนที่ไม่สมส่วนของ Class0 คุณต้องการทำให้มันมีราคาแพงมากขึ้นสำหรับลักษณนามในการจำแนกประเภท Class1 ตัวอย่างกว่า Class0 หนึ่ง มันอาจสมเหตุสมผลที่จะลอง Class0 = 1 / 0.07 ~ = 14x Class1 เพื่อเริ่มต้น แต่คุณอาจต้องการปรับเปลี่ยนนี้ตามความต้องการทางธุรกิจของคุณ ฉันคิดว่าclasswtพารามิเตอร์คือสิ่งที่คุณกำลังมองหาที่นี่

  • ใช้การสุ่มตัวอย่างแบบแบ่งชั้นเพื่อให้แน่ใจว่าคุณได้รับตัวอย่างจากทั้งสองคลาสในข้อมูลการฝึกอบรมของต้นไม้ เป็นไปได้ว่าต้นไม้บางต้นของคุณได้รับการฝึกฝนบนข้อมูล Class0 เท่านั้นซึ่งจะเป็นลางบอกเหตุที่ไม่ดีต่อประสิทธิภาพการทำงานทั่วไป ตรวจสอบstrataข้อโต้แย้ง


การเลือกแบบสุ่มจากคลาสที่มีอิทธิพลนั้นสมเหตุสมผล พวกเขาไม่จำเป็นต้องเท่ากัน: แม้แต่อัตราส่วน 1: 5 ก็ควรปรับปรุง
Itamar

@ Itmar นั่นคือสิ่งที่ฉันจะลองก่อน อย่างไรก็ตามดูเหมือนว่าจะต้องมีวิธีการบางอย่างเพื่อให้แน่ใจว่าตัวอย่างที่คุณเก็บไว้เป็นตัวแทนของชุดข้อมูลขนาดใหญ่
Matt Krause

1
ทางเลือกหนึ่งอาจจะเรียกใช้ PCA (การวิเคราะห์องค์ประกอบหลัก) ในชุดที่ใหญ่กว่าจัดกลุ่มคะแนนตามองค์ประกอบหลักแรกและเลือกหนึ่งตัวอย่างจากแต่ละคลัสเตอร์
Itamar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.