การอภิปรายเกี่ยวกับ overfit ใน xgboost


20

การตั้งค่าของฉันมีดังต่อไปนี้:

ฉันกำลังติดตามแนวทางใน "การทำนายแบบจำลองประยุกต์" ดังนั้นฉันได้กรองคุณสมบัติที่เกี่ยวข้องและจบลงด้วยสิ่งต่อไปนี้:

  • จุดข้อมูล 4900 ในชุดฝึกอบรมและ 1600 จุดข้อมูลในชุดทดสอบ
  • ฉันมีคุณสมบัติ 26 อย่างและเป้าหมายเป็นตัวแปรต่อเนื่อง

ฉันใช้ crossvalidation 5 เท่ากับโมเดลรถไฟโดยใช้caretแพ็คเกจ เมื่อฉันใช้แบบจำลอง MARS ฉันจะได้รับข้อผิดพลาดแบบสัมบูรณ์ (MAE) ประมาณ 4 ในชุดฝึกอบรมและชุดทดสอบ

อย่างไรก็ตามการใช้ xgboost (เป็นอัลกอริทึมแบบต้นไม้หรือแบบเชิงเส้น) ฉันได้รับบางอย่างเช่น 0.32 (!) ในชุดการฝึกอบรมและ 2.4 ในชุดทดสอบ

ดังนั้นหากข้อผิดพลาดการทดสอบเป็น 8 เท่าของข้อผิดพลาดในการฝึกอบรมฉันจะบอกว่า: ฉันมีข้อมูลการฝึกอบรมมากเกินไป ฉันยังได้รับข้อผิดพลาดเล็กน้อยในการทดสอบอย่างไรก็ตาม

ฉันใช้พารามิเตอร์ต่อไปนี้ใน xgboost:

  • nrounds = 1000และeta = 0.01(การเพิ่ม nrounds และการลดลงของกทพ. สามารถช่วยได้ แต่ฉันมีหน่วยความจำไม่เพียงพอและเวลาในการรันนานเกินไป)
  • max_depth = 16: ถ้าฉันเปรียบเทียบการโพสต์อื่น ๆ และค่าเริ่มต้นของ 6 นี่มันดูใหญ่ แต่ปัญหาค่อนข้างซับซ้อน - บางที 16 อาจไม่ใหญ่เกินไปในกรณีนี้
  • colsample_bytree = 0.7, subsample = 0.8และmin_child_weight = 5: การทำเช่นนี้ฉันพยายามที่จะลด overfit

หากฉันลด max_depth ให้ทำการฝึกอบรมและข้อผิดพลาดให้เข้าใกล้ แต่ก็ยังมีช่องว่างขนาดใหญ่และข้อผิดพลาดในการทดสอบนั้นใหญ่กว่า (เล็กน้อยกว่า 3)

การใช้ตัวเพิ่มแรงเคลื่อนเชิงเส้นทำให้ฉันได้รับรถไฟและการทดสอบข้อผิดพลาดเดียวกันกับเครื่องตัดขนที่ดีที่สุด:

  • lambda = 90 และ `alpha = 0: พบโดยการตรวจสอบข้ามแลมบ์ดาควรป้องกันไม่ให้เกินพอดี
  • colsample_bytree = 0.8, subsample = 0.8และmin_child_weight = 5: การทำเช่นนี้ฉันพยายามที่จะลด overfit

ความรู้สึกของฉันคือ xgboost ยังคง overfits - แต่ข้อผิดพลาดการฝึกอบรมและเท่าที่ฉันสามารถเห็นในการทดสอบเรียลไทม์ (ฉันได้ใช้แบบจำลอง xgboost และชุดของพวกเขาในความเป็นจริงเป็นเวลา 4 วัน) ดู ok-ish (ข้อผิดพลาดคือ ใหญ่กว่าข้อผิดพลาดในการทดสอบ แต่มีความไม่แน่นอนในชีวิตจริงเกี่ยวกับการคาดการณ์คุณสมบัติและตัวแปรอื่น ๆ )

คุณคิดอย่างไร: ฉันสามารถยอมรับความเหมาะสมได้หากการดำเนินการในชีวิตจริง (ถ้าเป็นไปได้) นั้นเหนือกว่า? xgboost ในการตั้งค่าของฉันมีแนวโน้มที่จะ overfit?

คำตอบ:


34

การบรรจุมากเกินไปแย่มากจนคุณไม่ควรเลือกแบบจำลองที่มีน้ำหนักเกินแม้ว่าจะมีข้อผิดพลาดในการทดสอบน้อยกว่าหรือไม่? ไม่ แต่คุณควรมีเหตุผลในการเลือก

พฤติกรรมนี้ไม่ได้ จำกัด อยู่ที่ XGBoost มันเป็นเรื่องธรรมดาในทุกเทคนิคการเรียนรู้ของเครื่อง ค้นหาการแลกเปลี่ยนที่ถูกต้องระหว่างการทำ underfitting และ overfitting ความหมายอย่างเป็นทางการเป็นถ่วงดุลอำนาจอคติแปรปรวน (วิกิพีเดีย)

การแลกเปลี่ยนอคติแปรปรวน

ต่อไปนี้คือการทำให้ Bias-variance tradeoff ง่ายขึ้นเพื่อช่วยปรับการเลือกรูปแบบของคุณ

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

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

คำจำกัดความเหล่านั้นคล้ายกันมากกับคำจำกัดความของการ underfitting และ overfitting อย่างไรก็ตามคำจำกัดความเหล่านั้นมักจะง่ายเกินไปที่จะตรงกันข้าม

  • โมเดลกำลังอยู่ระหว่างการทดสอบและข้อผิดพลาดในการทดสอบสูง ซึ่งหมายความว่าแบบจำลองนั้นง่ายเกินไป
  • รูปแบบเป็น overfitting ถ้าข้อผิดพลาดการทดสอบสูงกว่าข้อผิดพลาดการฝึกอบรม ซึ่งหมายความว่าแบบจำลองนั้นซับซ้อนเกินไป

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

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

  • ความรู้เบื้องต้นเกี่ยวกับการเรียนรู้ทางสถิติและองค์ประกอบของการเรียนรู้ทางสถิติ(ที่นี่)
  • การจดจำรูปแบบและการเรียนรู้ของเครื่องโดย Christopher Bishop
  • การเรียนรู้ของเครื่อง: มุมมองที่น่าจะเป็น, โดย Kevin Murphy

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

ประยุกต์ใช้กับปัญหาของคุณ

ดังนั้นคุณมีสองรุ่น

รถไฟแม่ทดสอบแม่MARS~4.0~4.0ความแปรปรวนต่ำอคติที่สูงกว่า,XGBoost~0.3~2.4ความแปรปรวนที่สูงขึ้นอคติที่ต่ำกว่า,

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

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

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

คุณทำอะไรได้บ้าง

อย่างไรก็ตามคุณสามารถทำได้ดีกว่าโดยการปรับพารามิเตอร์ไฮเปอร์

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

  • ความลึกของต้นไม้ที่คุณปลูกเป็นจุดเริ่มต้นที่ดีมาก คุณต้องทราบว่าสำหรับความลึกทุกหน่วยคุณต้องเพิ่มจำนวนของใบไม้ที่จะสร้าง ถ้าคุณจะปลูกต้นไม้ขนาดสองแทนขนาด 16 มันจะต้องใช้1/214ของเวลา! คุณควรลองปลูกต้นไม้เล็ก ๆ ให้มากขึ้น เหตุผลก็คือว่าความลึกของต้นไม้ที่ควรจะเป็นตัวแทนระดับของการมีปฏิสัมพันธ์คุณลักษณะ นี่อาจเป็นศัพท์แสง แต่หากคุณลักษณะของคุณมีระดับของการโต้ตอบที่ 3 (ประมาณ: การรวมกันของ 4 คุณสมบัติไม่ได้มีประสิทธิภาพมากกว่าการรวม 3 ของคุณลักษณะเหล่านั้น + ที่สี่) ดังนั้นการปลูกต้นไม้ที่มีขนาดใหญ่กว่า 3 คือ เป็นอันตราย ต้นไม้สองต้นที่มีความลึกสามต้นจะมีอำนาจการวางนัยทั่วไปมากกว่าต้นไม้ที่มีความลึกสี่ต้น นี่เป็นแนวคิดที่ค่อนข้างซับซ้อนและฉันจะไม่เข้าไปในตอนนี้ แต่คุณสามารถตรวจสอบเอกสารชุดนี้เพื่อเริ่มต้นได้ นอกจากนี้โปรดทราบว่าต้นไม้ลึกนำไปสู่ความแปรปรวนสูง

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


1
เราไม่ควรแสดงความคิดเห็นว่า "ขอบคุณ" แต่สำหรับคำตอบที่ยาวและน่าสนใจนี้ฉันอยากจะพูดว่า "ขอบคุณ" ฉันมีความรู้บางอย่างเกี่ยวกับบางสิ่งที่คุณเขียน แต่นี่เป็นการรวมตัวกันจริงๆ ฉันจะผ่านการอ้างอิงของคุณและปลูกต้นไม้ใหม่และอาจกลับมาพร้อมกับความคิดเห็น สำหรับตอนนี้: ขอบคุณ! ที่ดี!
Ric

ลิงก์ไปยังหน้าการโต้ตอบ stat.columbia.edu/~jakulin/Intยอดเยี่ยมจริงๆ!
Ric

ฉันเอาคำแนะนำของคุณและ จำกัด ความลึกของต้นไม้ไว้ที่ 3 แต่เอา nrounds 1200 และ resuls รู้สึกดี: การคำนวณที่รวดเร็วมากความแตกต่างระหว่างรถไฟและการทดสอบลดลงและยังอยู่ในระดับที่ดี ส่วนที่เหลือของเรื่องราวอยู่ที่นี่: stats.stackexchange.com/questions/205858/…
Ric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.