ข้อมูลมัลติคลาสที่ไม่สมดุลกับ XGBoost


20

ฉันมี 3 คลาสพร้อมการกระจายนี้:

Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163

และฉันใช้xgboostสำหรับการจำแนกประเภท scale_pos_weightฉันรู้ว่ามีพารามิเตอร์ที่เรียกว่า

แต่จะจัดการกับกรณี 'มัลติคลาส' ได้อย่างไรและฉันจะตั้งค่าได้อย่างไร

คำตอบ:


18

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

sum(negative instances) / sum(positive instances)

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

xgboost.DMatrix(..., weight = *weight array for individual weights*)

คุณสามารถกำหนดน้ำหนักได้ตามที่คุณต้องการและโดยการทำเช่นนั้นคุณสามารถจัดการความไม่สมดุลภายในชั้นเรียนรวมถึงความไม่สมดุลระหว่างชั้นเรียนที่แตกต่างกัน


> แนวทางที่ดีเมื่อกำหนดค่าให้กับ scale_pos_weight คือ: ผลรวม (อินสแตนซ์เชิงลบ) / ผลรวม (อินสแตนซ์ที่เป็นบวก)
lcrmorin

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

7

คำตอบนี้โดย @KeremT ถูกต้อง ฉันให้ตัวอย่างสำหรับผู้ที่ยังคงมีปัญหากับการใช้งานที่แน่นอน

weightพารามิเตอร์ใน XGBoost เป็นแบบไม่รวมต่อคลาส ดังนั้นเราจำเป็นต้องกำหนดน้ำหนักของแต่ละคลาสให้กับอินสแตนซ์ของมันซึ่งเป็นสิ่งเดียวกัน

ตัวอย่างเช่นถ้าเรามีคลาสที่ไม่สมดุลสามคลาสที่มีอัตราส่วน

class A = 10%
class B = 30%
class C = 60%

น้ำหนักของพวกเขาคือ (แบ่งชั้นเรียนที่เล็กที่สุดโดยผู้อื่น)

class A = 1.000
class B = 0.333
class C = 0.167

จากนั้นถ้าข้อมูลการฝึกอบรมเป็น

index   class
0       A
1       A
2       B
3       C
4       B

เราสร้างweightเวกเตอร์ดังต่อไปนี้:

index   class    weight
0       A        1.000
1       A        1.000
2       B        0.333
3       C        0.167
4       B        0.333

5

ทุกคนสะดุดกับคำถามนี้เมื่อจัดการกับปัญหาการจำแนกประเภทมัลติคลาสที่ไม่สมดุลโดยใช้ XGBoost ในอาร์ฉันก็ทำเช่นกัน!

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

/datascience//a/9493/37156

ขอบคุณwacax


1

เพียงแค่กำหนดข้อมูลรถไฟของคุณด้วยน้ำหนักระดับเดียวกัน ก่อนอื่นให้ทำการชั่งน้ำหนักด้วยclass_weight.compute_class_weightsklearn จากนั้นให้แต่ละแถวของข้อมูลรถไฟว่ามีน้ำหนักที่เหมาะสม

ฉันคิดว่าที่นี่ข้อมูลรถไฟมีคอลัมน์ 'คลาส' ที่มีหมายเลขคลาส ฉันสันนิษฐานว่ามี nb_classes ที่มาจาก 1 ถึง nb_classes

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

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