วิธีการให้คะแนน RandomForestClassifier OOB


16

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

ฉันมีชุดข้อมูลที่ไม่สมดุลอย่างมากและฉันใช้ AUC ของ ROC เป็นตัวชี้วัดการให้คะแนนของฉันในการค้นหากริด มีวิธีบอกลักษณนามให้ใช้วิธีการให้คะแนนแบบเดียวกันกับตัวอย่าง OOB หรือไม่?


oob_scoreพารามิเตอร์ของRandomForestClassifierชั้นไม่ได้ทำสิ่งที่คุณต้องการ?
Pierre

AFAIK oob_scoreรายงานความแม่นยำ ฉันต้องดูซอร์สโค้ดอีกครั้งแม้ว่า
darXider

คุณกำลังประเมินพารามิเตอร์อะไรกับการค้นหากริดของคุณ
JahKnows

^ ขออภัย แต่ฉันจำไม่ได้จริงๆตอนนี้! ฉันถามคำถามนี้เมื่อ 1.5 ปีก่อน
darXider

คำตอบ:


14

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

เกิดข้อผิดพลาดนอกถุง

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

ในการติดตั้ง oob ใน sklearn คุณจะต้องระบุเมื่อสร้างออบเจกต์ป่าสุ่มของคุณเป็น

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

จากนั้นเราสามารถฝึกฝนโมเดล

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

คะแนน: 0.979921928817

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

print(forest.oob_score_)

0.86453272101

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

print('Score: ', forest.score(X_test, y_test))

คะแนน: 0.86517733935

เราเห็นว่าความแม่นยำที่วัดได้จาก oob นั้นคล้ายคลึงกับที่ได้รับจากชุดทดสอบ ดังนั้นจึงผ่านทฤษฎีที่ว่าความแม่นยำของ oob นั้นเป็นตัวชี้วัดที่ดีกว่าซึ่งใช้ในการประเมินประสิทธิภาพของแบบจำลองของคุณแทนที่จะเป็นเพียงแค่คะแนน นี่เป็นผลสืบเนื่องมาจากรูปแบบการบรรจุถุงและไม่สามารถทำได้กับตัวแยกประเภทอื่น ๆ

การคำนวณ oob โดยใช้ตัวชี้วัดที่แตกต่างกัน

ใช่คุณสามารถทำได้! อย่างไรก็ตามขึ้นอยู่กับว่าโค้ดของคุณมีโครงสร้างอย่างไร ฉันไม่แน่ใจว่าคุณจะรวม oob และ AUC ทั้งหมดเข้ากับcross_val_scoreฟังก์ชันได้อย่างไร อย่างไรก็ตามหากคุณกำลังทำการตรวจสอบไขว้ด้วยตนเองคุณสามารถทำสิ่งต่อไปนี้อัลกอริธึมป่าแบบสุ่มใน sklearn ให้ฟังก์ชันการตัดสินใจของ oob ดังนี้

print(forest.oob_decision_function_)

ชั้นเรียนนั้นสามารถรับได้โดยใช้

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

จากนั้นเราสามารถคำนวณ AUC โดยใช้สิ่งต่อไปนี้

metrics.roc_auc_score(y_train, pred_train)

.86217157846471204


4
ขอบคุณ! ฉันรู้ว่ากระบวนการ OOB ทำงานอย่างไรในป่าสุ่ม ฉันถูกถามโดยเฉพาะว่าRandomForestClassifierสามารถให้คะแนน OOB ที่ไม่ถูกต้องได้หรือไม่และส่วนที่สองของคำตอบของคุณจะให้คำแนะนำที่ดีเกี่ยวกับวิธีการแก้ไขปัญหานี้ อย่างไรก็ตามฉันต้องเน้นว่าไม่ควรใช้ class label เพื่อคำนวณ AUC ของเส้นโค้ง ROC; ค่อนข้างน่าจะเป็นระดับที่ควรใช้โดยตรง pred_train = forest.oob_decision_function_[:, 1]ดังนั้นความหมายที่ถูกต้องจะเป็น
darXider

@darXider ไม่ใช่ความร่มรื่นเนื่องจาก forest.oob_decision_function_.shape [0] == X_train.shape [0] ในขณะที่ฉันคาดว่ามันจะเป็น == จำนวนตัวอย่าง OOB ซึ่งควรน้อยกว่าจำนวนตัวอย่าง ใน X_train? นอกจากนี้ส่วนตัวฉันสนใจที่จะคำนวณ logloss สำหรับคนอื่นที่ต้องการทำเช่นนี้ฉันคิดว่า pred_train ควรเป็น = forest.oob_decision_function_ แทน
Sander Vanden Hautte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.