การใช้ scale_pos_weight ที่เหมาะสมใน xgboost สำหรับชุดข้อมูลที่ไม่สมดุลคืออะไร


26

ฉันมีชุดข้อมูลที่ไม่สมดุลมาก ฉันพยายามทำตามคำแนะนำในการจูนและใช้scale_pos_weightแต่ไม่แน่ใจว่าฉันควรจูนอย่างไร

ฉันเห็นได้ว่าRegLossObj.GetGradient:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

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

  1. ภายในบริบทของโหนดเพื่อประเมินการลดการสูญเสียของการแบ่งผู้สมัคร
  2. ภายในบริบทของ leaf node เพื่อปรับน้ำหนักให้เหมาะสมกับโหนดนั้น

ดังนั้นจึงไม่มีทางรู้ล่วงหน้าว่าอะไรจะดีscale_pos_weight- เป็นจำนวนที่แตกต่างกันมากสำหรับโหนดที่ลงท้ายด้วยอัตราส่วน 1: 100 ระหว่างอินสแตนซ์บวกและลบและสำหรับโหนดที่มีอัตราส่วน 1: 2

คำใบ้ใด ๆ


อาจเป็นไปได้ว่าคุณสามารถปรับพารามิเตอร์ใน CV ด้วย 5 เท่า 5 ซ้ำ แต่คุณอาจต้องเขียนรหัสเพื่อทำเช่นนั้น
user2149631

คำตอบ:


22

โดยทั่วไป Scale_pos_weight คืออัตราส่วนของจำนวนคลาสลบต่อคลาสบวก สมมติว่าชุดข้อมูลมี 90 การสังเกตของคลาสลบและ 10 การสังเกตของคลาสบวกจากนั้นค่าอุดมคติของ scale_pos_Weight ควรเป็น 9 คุณสามารถตรวจสอบลิงค์ต่อไปนี้ http://xgboost.readthedocs.io/en/latest/parameter.html


1
วิธีนั้นจะนำไปใช้กับชุดข้อมูลหลายคลาสได้อย่างไร 28 คลาสเรียนได้อย่างไร นั่นไม่ชัดเจนสำหรับฉัน
Gabriel Ziegler

1
@ กาเบรียลฉันเชื่อว่ามันจะดีกว่าถ้าได้น้ำหนักที่เพิ่ม คุณสามารถใช้ scale_pos_weight โดยใช้วิธีเทียบกับวิธีที่เหลือ ตัวอย่างเช่นสร้างหุ่นสำหรับ 28 ชั้นเรียน จากนั้นคุณสามารถใช้แต่ละคนเป็นปัญหาการจำแนกเลขฐานสอง ด้วยวิธีนี้คุณจะได้พบกับ 28 รุ่นที่แตกต่างกัน
Harshit Mehta

ฉันเห็น แต่เมื่อฉันใช้ onevsrest ตัวแยกประเภทไม่ได้ให้เอาท์พุทมัลติเลเบลให้ฉันด้วยใช่ไหม ไม่เพียงชั้นเดียวออกจาก 28
กาเบรียล Ziegler

ได้อย่างไร ตัวอย่างเช่น: คลาสคือ A, B, C ดังนั้นคุณสามารถมีตัวจําแนกแบบไบนารีสําหรับการจําแนก (A / Not A) อีกตัวหนึ่งจะเป็น (B / Not B) คุณสามารถทำสิ่งนี้เพื่อเรียนจำนวน 'n' จากนั้นในบรรดาความน่าจะเป็นทั้งหมดที่เกี่ยวข้องกับตัวจําแนกแต่ละตัวคุณต้องหาวิธีในการกําหนดคลาส
Harshit Mehta

ฉันเคยใช้ onevsrest สำหรับ multilabel แต่ฉันจะลองดู! ขอบคุณ!
Gabriel Ziegler

3

เอกสารทั้งหมดบอกว่าควรจะเป็น:

scale_pos_weight = count(negative examples)/count(Positive examples)

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

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

สิ่งนี้มีประโยชน์ในการ จำกัด ผลกระทบของการคูณตัวอย่างบวกด้วยน้ำหนักที่สูงมาก


1

ฉันเข้าใจคำถามและความคับข้องใจของคุณ แต่ฉันไม่แน่ใจว่านี่เป็นสิ่งที่สามารถคำนวณเชิงวิเคราะห์ได้ แต่คุณต้องพิจารณาการตั้งค่าที่ดีในเชิงประจักษ์สำหรับข้อมูลของคุณเช่นเดียวกับพารามิเตอร์ไฮเปอร์ส่วนใหญ่โดยใช้การตรวจสอบข้าม ข้อเสนอแนะ ฉันประสบความสำเร็จในการใช้ SelectFPR กับ Xgboost และ sklearn API เพื่อลด FPR สำหรับ XGBoost ผ่านการเลือกคุณสมบัติแทนจากนั้นปรับ scale_pos_weight ระหว่าง 0 และ 1.0 เพิ่มเติม O.9 ดูเหมือนจะทำงานได้ดี แต่มีอะไรก็ได้ YMMV ขึ้นอยู่กับข้อมูลของคุณ นอกจากนี้คุณยังสามารถลดน้ำหนักแต่ละจุดข้อมูลเมื่อส่งไปยัง XGboost หากคุณดูเอกสารของพวกเขา คุณต้องใช้ API ของพวกเขาไม่ใช่เสื้อคลุม sklearn ด้วยวิธีนี้คุณสามารถถ่วงน้ำหนักชุดข้อมูลหนึ่งชุดได้สูงกว่าชุดข้อมูลอื่นและจะส่งผลต่ออัลกอริทึมการเร่งความเร็วที่ใช้


0

ฉันเจอปัญหานี้และยังมองหาทางออกที่ดีที่สุด อย่างไรก็ตามฉันขอแนะนำให้คุณใช้วิธีต่าง ๆ เช่น Grid Search (GridSearchCV in sklearn) เพื่อการปรับพารามิเตอร์ที่ดีที่สุดสำหรับลักษณนามของคุณ อย่างไรก็ตามถ้าชุดข้อมูลของคุณมีความไม่สมดุลสูงมันก็คุ้มค่าที่จะพิจารณาวิธีการสุ่มตัวอย่าง (โดยเฉพาะการสุ่มแบบสุ่มและการสุ่มแบบ SMOTE) และแบบจำลองประกอบกับตัวอย่างข้อมูลที่มีอัตราส่วนต่าง ๆ ของตัวอย่างชั้นบวกและลบ นี่คือการสอนที่ดีและมีประโยชน์ (เกือบจะครอบคลุม) เกี่ยวกับการจัดการชุดข้อมูลที่ไม่สมดุล

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

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