จำเป็นต้องดำเนินการ preprocessing ก่อนการทำนายโดยใช้ FinalModel ของ RandomForest กับ caret package หรือไม่


12

ฉันใช้ชุดคาเร็ตสำหรับฝึกวัตถุสุ่มป่าด้วย 10x10CV

library(caret)
tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T) 
RFFit <- train(Defect ~., data=trainingSet, method="rf", trControl=tc, preProc=c("center", "scale"))

หลังจากนั้นฉันทดสอบ randomForest บน testSet (ข้อมูลใหม่)

RF.testSet$Prediction <- predict(RFFit, newdata=testSet)

เมทริกซ์ความสับสนแสดงให้ฉันเห็นว่าแบบจำลองนั้นไม่เลว

confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
              Reference
    Prediction   0   1
             0 886 179
             1  53 126  

      Accuracy : 0.8135          
             95% CI : (0.7907, 0.8348)
No Information Rate : 0.7548          
P-Value [Acc > NIR] : 4.369e-07       

              Kappa : 0.4145 

ตอนนี้ฉันต้องการทดสอบ $ finalModel และฉันคิดว่ามันควรจะให้ผลลัพธ์แบบเดียวกัน แต่อย่างใดฉันก็จะได้รับ

> RF.testSet$Prediction <- predict(RFFit$finalModel, newdata=RF.testSet)
>  confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 323  66
         1 616 239

               Accuracy : 0.4518          
                 95% CI : (0.4239, 0.4799)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1               

                  Kappa : 0.0793 

ฉันกำลังคิดถึงอะไร

แก้ไข @topepo:

ฉันยังได้เรียนรู้เกี่ยวกับ randomForest ตัวอื่นโดยไม่มีตัวเลือก preProcessed และได้รับผลลัพธ์อื่น:

RFFit2 <- train(Defect ~., data=trainingSet, method="rf", trControl=tc)
testSet$Prediction2 <- predict(RFFit2, newdata=testSet)
confusionMatrix(data=testSet$Prediction2, testSet$Defect)

Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 878 174
         1  61 131

               Accuracy : 0.8111          
                 95% CI : (0.7882, 0.8325)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1.252e-06       

                  Kappa : 0.4167     

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

4
สำหรับtrainรุ่นที่2 คุณจะได้รับผลลัพธ์ที่แตกต่างกันเล็กน้อยเว้นแต่คุณจะตั้งค่าการสุ่มหมายเลขก่อนที่จะเรียกใช้ (ดู?set.seed) ค่าความแม่นยำคือ 0.8135 และ 0.8111 ซึ่งค่อนข้างใกล้เคียงและมีเพียงเนื่องจากการสุ่มตัวอย่างของการสุ่มใหม่และการคำนวณแบบจำลอง
topepo

คำตอบ:


17

ความแตกต่างคือการประมวลผลล่วงหน้า predict.trainจัดกึ่งกลางและปรับขนาดข้อมูลใหม่โดยอัตโนมัติ (นับตั้งแต่ที่คุณขอ) ในขณะที่predict.randomForestรับสิ่งที่ได้รับ เนื่องจากการแยกแผนภูมิขึ้นอยู่กับค่าที่ประมวลผลการคาดการณ์จึงจะปิด

แม็กซ์


แต่RFFitวัตถุนั้นถูกสร้างขึ้นด้วยtrainวิธีการpreProcessed ... ดังนั้นมันควรจะส่งคืนวัตถุกึ่งกลางและปรับขนาด (ไม่ควรหรือไม่) ถ้าเป็นเช่นนั้น -> $finalModelควรปรับและจัดกึ่งกลาง
Frank

2
ใช่ testSetแต่ตามรหัสข้างต้นคุณยังไม่ได้นำมาใช้ตรงกลางและปรับไป predict.trainทำอย่างนั้น แต่predict.randomForestไม่
topepo

ดังนั้นจึงไม่มีความแตกต่างในการใช้predict(RFFit$finalModel, testSet)และpredict(RFFit, testSet)ในชุดทดสอบเดียวกันคืออะไร?
แฟรงค์

6
predict(RFFit$finalModel, testSet)และpredict(RFFit, testSet)จะแตกต่างกันถ้าคุณใช้ตัวเลือกในpreProc trainหากคุณไม่ทำเช่นนั้นพวกเขากำลังฝึกอบรมในชุดข้อมูลเดียวกัน ในคำอื่น ๆ ใด ๆ randomForestก่อนการประมวลผลที่คุณขอจะทำเพื่อการฝึกอบรมชุดก่อนที่จะทำงาน นอกจากนี้ยังใช้การประมวลผลล่วงหน้าแบบเดียวกันกับข้อมูลใด ๆ ที่คุณคาดการณ์ไว้ (โดยใช้predict(RFFit, testSet)) ถ้าคุณใช้finalModelวัตถุคุณกำลังใช้predict.randomForestแทนpredict.trainและไม่มีการประมวลผลล่วงหน้าใด ๆ ก่อนการทำนาย
topepo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.