การส่งเสริมและห่อต้นไม้ (XGBoost, LightGBM)


17

มีโพสต์บล็อกมากมายวิดีโอ YouTube และอื่น ๆ เกี่ยวกับแนวคิดของการห่อ หรือ เพิ่มต้นไม้ ความเข้าใจทั่วไปของฉันคือรหัสหลอกสำหรับแต่ละคือ:

บรรจุถุง:

  1. นำตัวอย่างแบบสุ่มจำนวน N% ของตัวอย่างและ y% ของฟีเจอร์
  2. ปรับโมเดลของคุณ (เช่นแผนผังการตัดสินใจ) ในแต่ละ N
  3. ทำนายผลด้วยแต่ละ N
  4. เฉลี่ยการคาดการณ์เพื่อให้ได้คำทำนายสุดท้าย

การส่งเสริมการ:

  1. ปรับโมเดลของคุณ (เช่นแผนผังการตัดสินใจ) กับข้อมูล
  2. รับส่วนที่เหลือ
  3. พอดีกับโมเดลของคุณกับของเหลือ
  4. ไปที่ 2 เพื่อเพิ่มรอบ N
  5. การทำนายขั้นสุดท้ายคือผลรวมถ่วงน้ำหนักของเครื่องทำนายลำดับ

ฉันจะขอชี้แจงความเข้าใจของฉันด้านบน แต่คำถามที่ฉันตั้งใจไว้มีดังนี้:

ทั้ง XGBoost และ LightGBM มี params ที่อนุญาตให้ใส่ถุงได้ แอปพลิเคชันไม่ได้บรรจุถุงหรือเพิ่มประสิทธิภาพ (ซึ่งเป็นสิ่งที่ทุกโพสต์ในบล็อกพูดถึง) แต่เป็นการบรรจุและเพิ่มประสิทธิภาพ รหัสหลอกสำหรับสถานที่และเวลาที่รวมถุงและการเพิ่มกำลังเกิดขึ้นคืออะไร?

ฉันคาดว่ามันจะเป็น "ต้นไม้ที่ถูกกระตุ้นให้มีต้นไม้เพิ่มขึ้น" แต่ดูเหมือนว่ามันจะเป็น ความแตกต่างดูเหมือนมาก

ต้นไม้ที่ได้รับการเสริมถุง:

  1. นำตัวอย่างแบบสุ่มจำนวน N% ของตัวอย่างและ y% ของฟีเจอร์
  2. พอดีกับต้นไม้ที่ได้รับการเร่งในแต่ละตัวอย่าง N
  3. ทำนายผลด้วยแต่ละ N
  4. เฉลี่ยการคาดการณ์เพื่อให้ได้คำทำนายสุดท้าย

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

อย่างไรก็ตามจากการมองผ่านตัวอย่างเช่นscikit-learn gradient_boosting.py (ซึ่งทำตัวอย่างการใส่ถุง แต่ไม่ใช่การเลือกคุณสมบัติแบบสุ่ม) และการวนนักเก็ตเล็ก ๆ ทั่วโพสต์เกี่ยวกับ LightGBM และ XGBoost ดูเหมือนว่า XGBoost และ LightGBM จะทำงานดังนี้:

ต้นไม้ที่ได้รับถุงเพิ่ม:

  1. ติดตั้งแผนผังการตัดสินใจกับข้อมูลของคุณ
  2. สำหรับฉันในการเพิ่มรอบ N:
    • รับส่วนที่เหลือ
    • ถ้าฉัน mod bag_frequency == 0 (เช่นกระเป๋าทุก ๆ 5 รอบ):
      • ใช้ตัวอย่างสุ่มเดียวของ x% ของกลุ่มตัวอย่างและ y% ของคุณสมบัติ ใช้ตัวอย่างแบบสุ่มนี้ไปข้างหน้า
    • ต้นไม้พอดีกับส่วนที่เหลือ
  3. การทำนายขั้นสุดท้ายคือผลรวมถ่วงน้ำหนักของเครื่องทำนายลำดับ

โปรดแก้ไขความเข้าใจของฉันที่นี่และกรอกรายละเอียด ต้นไม้ที่ถูกกระตุ้นเพิ่ม (มีเพียง 1 ต้นที่สุ่มต่อ bag_frequency) ดูเหมือนจะไม่ทรงพลังเท่ากับต้นไม้ที่ถูกกระตุ้นต้นไม้


2
+1 สำหรับคำถามที่น่าสนใจและมีรูปแบบที่ดีมาก และยินดีต้อนรับสู่เว็บไซต์
mkt - Reinstate Monica

คุณต้องมี "คำนวณข้อผิดพลาด" เพื่อเพิ่มประสิทธิภาพ ทำผิดที่ล้มเหลว น้ำหนักมีความสำคัญสำหรับ adaboost มันไม่ใช่เศษซากดิบ ... เราไม่ได้พูดถึงการไล่ระดับสีแบบสุ่มเมื่อจำเป็นในการเพิ่มระดับ
EngrStudent - Reinstate Monica

นี่คือการเพิ่มถุง แทนต้นไม้ใหม่สำหรับแต่ละขั้นตอนของซีรีส์คุณจะได้รับฟอเรสต์ใหม่พร้อมผลผลิตเฉลี่ย Eugene Tuv และ Kari Torkkola jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
EngrStudent - Reinstate Monica

การเพิ่มถุงจะทำให้ป่าของชุดตระการตาและเอาท์พุทเฉลี่ย มันอาจมีส่วนร่วมในการปรับแต่งที่เกินกว่าที่วงดนตรีซีรีย์ (เพิ่มขึ้น) สามารถสร้างและให้ผลลัพธ์ที่แข็งแกร่งกว่า แต่การได้รับไม่มาก
EngrStudent - Reinstate Monica

คำตอบ:


13

การห่อ: นำตัวอย่างแบบสุ่มจำนวน N% ของ x ตัวอย่างและ y% ของคุณสมบัติ

อินสแตนซ์ถูกสุ่มตัวอย่างย่อยซ้ำ ๆ ในการบรรจุถุงแต่ไม่ใช่คุณลักษณะ ( RandomForests , XGBoostและCatBoostทำทั้งสองอย่าง):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

รวมถึงขั้นตอนการเริ่มต้นของคุณในการส่งเสริมรหัสเทียมเพื่อกำจัดความซ้ำซ้อน:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

ต้นไม้ Boosted ที่ได้รับถุง (ตามที่คุณเรียก) เป็นวิธีการที่เหมาะสม แต่แตกต่างจากXGBoostหรือCatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoostและCatBoostมีทั้งการเพิ่มและใช้ข้อมูลการฝึกอบรมทั้งหมด พวกเขายังใช้การบรรจุถุงโดยการสุ่มอีกครั้งในการทำซ้ำการส่งเสริมทุกครั้ง:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

ถ้าคุณต้องการที่จะ "พอดีกับรูปแบบที่เหลือ" นี่จะเทียบเท่ากับ "พอดีกับรูปแบบของข้อมูลในตัวอย่าง bootstrap "


ข้อสังเกตเพิ่มเติม :

ไม่มี " วิธีที่ดีที่สุดที่จะทำ " ตามที่คุณแนะนำ (ไม่มีทฤษฎีอาหารกลางวันฟรี) "ต้นไม้ที่ได้รับการเสริมถุง" อาจมีประสิทธิภาพเหนือกว่า XGBoost ในชุดข้อมูลบางอย่าง

ใช้ตัวอย่างสุ่มเดียวของ x% ของกลุ่มตัวอย่าง

บรรทัดนี้ทำให้เกิดความสับสน คุณได้สิ่งนี้มาจากไหน

ถ้าฉัน mod bag_frequency == 0 (เช่นกระเป๋าทุก ๆ 5 รอบ):

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


(+1) คำตอบที่ดี! ในการชี้แจง: OP ไม่ถูกต้องในการระบุ " XGBoost และ LightGBM มี params ที่อนุญาตให้ใส่ถุง " หรือไม่?
mkt - Reinstate Monica

ทั้งอนุญาตให้มีการบรรจุถุง: bagging_fractionในLightGBMและsubsampleในXGBoost ไม่แน่ใจว่าทำไมฉันถึงเรียก CatBoost ตลอดเวลา แต่พวกเขาทั้งหมดทำงานในลักษณะเดียวกันกับที่เกี่ยวข้องกับคำถาม
Laksan Nathan

ความผิดพลาดของฉันฉันคิดถึงคำตอบของคุณที่กล่าวไว้ คุณสามารถอธิบาย " subsampling หนึ่งครั้งในการทำซ้ำการส่งเสริมทุกครั้ง " ได้หรือไม่? คุณหมายถึงว่าในการทำซ้ำการส่งเสริมแต่ละชุดย่อยจำนวนมากจะถูกนำต้นไม้ที่เหมาะสมกับแต่ละกลุ่มย่อยและจากนั้นอัตราการจำแนกประเภทจะถูกคำนวณขึ้นอยู่กับต้นไม้ถุงและในที่สุดก็มีการปรับปรุงน้ำหนัก? ถ้าเป็นเช่นนั้นคุณช่วยอธิบายสิ่งนี้ในรหัสเทียมของคุณได้ไหม
mkt - Reinstate Monica

มีตัวอย่างย่อยจำนวนไม่มากที่วาดเพียงอันเดียว: แทนที่จะทำการปรับโมเดลให้เหมาะกับอินสแตนซ์ที่มีน้ำหนักทั้งหมดโมเดลจะได้รับการฝึกฝนในตัวอย่างบูตสแตรป
Laksan Nathan

เกี่ยวกับ "ใช้ตัวอย่างสุ่มเดียวของ x% ของกลุ่มตัวอย่าง"; ดีกว่าจะเป็น "ใช้ตัวอย่างเดียวของ x% ของแถว" ฉันมีที่มาจากที่นี่
Jonathan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.