ป่าที่สุ่มขึ้นมามากเกินไป?


19

ฉันกำลังทดลองกับป่าสุ่มที่มี scikit เรียนรู้และฉันได้รับผลลัพธ์ที่ยอดเยี่ยมจากชุดการฝึกอบรมของฉัน แต่ผลลัพธ์ที่ได้ค่อนข้างแย่ในชุดการทดสอบของฉัน ...

นี่คือปัญหา (ได้รับแรงบันดาลใจจากโป๊กเกอร์) ที่ฉันพยายามจะแก้ไข: เมื่อได้ไพ่ของผู้เล่น A, ไพ่ในหลุมของผู้เล่น B และไพ่ปัด (3 ใบ), ผู้เล่นคนไหนมีมือที่ดีที่สุด? ในทางคณิตศาสตร์นี่คือ 14 อินพุต (7 ใบ - หนึ่งอันดับและหนึ่งชุดสำหรับแต่ละคน) และหนึ่งเอาต์พุต (0 หรือ 1)

นี่คือผลลัพธ์บางส่วนของฉัน:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

นี่คือรหัสที่เกี่ยวข้องที่ใช้:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

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


2
ฉันไม่เห็นประมาณหนึ่งโหลของ 'หมุน' สำหรับป่าสุ่มที่นี่ การตรวจสอบข้าม? Bayesian Priors ธรรมชาติของการ resampling หรือไม่ ชุดฝึกอบรมสำหรับต้นไม้แต่ละต้น? ส่วนย่อยของต้นไม้แต่ละต้นมีกี่เปอร์เซ็นต์? ... มีอีกมากมายที่สามารถระบุได้ แต่ประเด็นของฉันคือคุณมีปัจจัยอื่นที่ต้องพิจารณา
EngrStudent - Reinstate Monica

1
คุณช่วยอธิบายปัญหาให้กับคนที่ไม่รู้จักโปกเกอร์ได้ไหม .. มีการคำนวณคะแนนโป๊กเกอร์อย่างง่ายไหม? แล้วมันง่ายกว่าที่จะเข้าใจว่ามีบางอย่างผิดปกติกับการใช้ RF หรือไม่ ... ฉันไม่รู้โป๊กเกอร์ แต่ฉันคิดว่า RF น่าจะเป็นวิธีที่ผิด - นั่นคือขั้นตอนแรกใน RF คือการใช้เพียงเศษเสี้ยวของอินพุต ในขณะที่ฉันจะปรากฏว่าไม่มีวิธีการสร้างลักษณนามที่ดีโดยใช้เพียงส่วนหนึ่งของอินพุต - อินพุตทั้งหมดจะต้อง
seanv507

คำตอบ:


45

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

หากคุณส่งข้อมูลการฝึกอบรมกลับไปยังวิธีการทำนาย (ตามที่คุณทำ) คุณจะได้รับการคาดการณ์ที่สมบูรณ์แบบที่สุด (ซึ่งเป็นแง่ดีในเชิงบวก) แทนที่จะเป็นข้อผิดพลาด OOB ที่ถูกต้อง อย่าทำอย่างนี้ วัตถุฟอเรสต์ที่ผ่านการฝึกอบรมควรจะจำข้อผิดพลาด OOB ได้ ฉันไม่คุ้นเคยกับการใช้งาน scikit-Learn แต่ดูที่เอกสารที่นี่ดูเหมือนว่าคุณจะต้องระบุoob_score=Trueเมื่อเรียกวิธีการพอดีและจากนั้นข้อผิดพลาดทั่วไปจะถูกเก็บไว้เป็นoob_score_ในวัตถุที่ส่งคืน ในแพ็คเกจ R "randomForest" การเรียกใช้วิธีการทำนายโดยไม่มีข้อโต้แย้งบนวัตถุที่ส่งคืนจะส่งคืนการทำนาย OOB ในชุดฝึกอบรม ที่ช่วยให้คุณกำหนดข้อผิดพลาดโดยใช้การวัดอื่น การส่งชุดฝึกอบรมกลับสู่วิธีการทำนายจะให้ผลที่แตกต่างเช่นเดียวกับที่ใช้ต้นไม้ทั้งหมด ฉันไม่รู้ว่าscikit-learnการนำไปปฏิบัติจะทำได้หรือไม่

มันเป็นความผิดพลาดในการส่งข้อมูลการฝึกอบรมกลับสู่วิธีการทำนายเพื่อทดสอบความถูกต้อง มันเป็นความผิดพลาดที่เกิดขึ้นบ่อยมากดังนั้นอย่ากังวลไป


1
ขอบคุณ! อย่างไรก็ตามฉันยังมีข้อกังวล: ด้วยตัวอย่างการฝึกอบรม 400k และ 50 ต้นฉันได้ 89.6% ถูกต้องในขณะที่มีข้อมูลมากและต้นไม้มากเป็นสองเท่าฉันได้ 89.7% ถูกต้อง ... นี่เป็นการแนะนำว่า RF ไม่ดีหรือไม่ วิธีการนี้ ฉันเคยใช้เครือข่ายนิวรัล MLP ในอดีตและมีความแม่นยำถึง 98.5% ในชุดทดสอบ ...
Uwat

5
เป็นไปได้แม้ว่าจะดูเหมือนว่าคุณไม่ได้ใช้ต้นไม้เกือบพอ โดยทั่วไปคุณต้องการพัน โปรดทราบว่าจำนวนต้นไม้ไม่ได้เป็นพารามิเตอร์ที่จะปรับในอัลกอริทึม RF มากขึ้นจะดีกว่าเสมอ แต่เมื่อคุณมี 'พอ' (ที่จะพิจารณาเชิงประจักษ์) ข้อผิดพลาด OOB ไม่ดีขึ้นด้วยต้นไม้มากขึ้น แม้แต่ชุดข้อมูลขนาดเล็กธรรมดา ๆ สิ่งที่น้อยกว่า 500 ต้นก็ไม่เพียงพอ
Bogdanovist

1
มีคำเตือนเล็ก ๆ น้อย ๆ สำหรับ 'more จะดีกว่าเสมอ' สำหรับจำนวนต้นไม้ แต่เป็นความเข้าใจของฉันที่คุณต้องการ gazjillions ของต้นไม้ก่อนที่คุณจะเริ่มการแสดงที่ยอดเยี่ยม จากประสบการณ์ของฉันต้นไม้มากเท่าที่คุณมีทรัพยากร CPU และความอดทนในการสร้างที่ดีขึ้นแม้ว่าจะมีผลตอบแทนลดลงเมื่อ OBB (ntrees) โค้งโค้ง
Bogdanovist

12

ฉันคิดว่าคำตอบคือพารามิเตอร์ max_features: int, string หรือ None, พารามิเตอร์ (default =” auto”) เป็นทางเลือก โดยพื้นฐานแล้วสำหรับปัญหานี้คุณควรตั้งค่าเป็นไม่มีเพื่อให้ต้นไม้แต่ละต้นถูกสร้างด้วยอินพุตทั้งหมดเนื่องจากเห็นได้ชัดว่าคุณไม่สามารถสร้างตัวจําแนกที่เหมาะสมโดยใช้เพียงเศษเสี้ยวของการ์ด (เริ่มต้น "อัตโนมัติ" คือการเลือก sqrt อินพุตสำหรับต้นไม้แต่ละต้น)


1
นั่นมัน! ความแม่นยำ 95% พร้อมต้นไม้ 50 ต้นและตัวอย่างการฝึกอบรม 600k
Uwat

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