ฉันมี 3 คลาสพร้อมการกระจายนี้:
Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163
และฉันใช้xgboost
สำหรับการจำแนกประเภท scale_pos_weight
ฉันรู้ว่ามีพารามิเตอร์ที่เรียกว่า
แต่จะจัดการกับกรณี 'มัลติคลาส' ได้อย่างไรและฉันจะตั้งค่าได้อย่างไร
ฉันมี 3 คลาสพร้อมการกระจายนี้:
Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163
และฉันใช้xgboost
สำหรับการจำแนกประเภท scale_pos_weight
ฉันรู้ว่ามีพารามิเตอร์ที่เรียกว่า
แต่จะจัดการกับกรณี 'มัลติคลาส' ได้อย่างไรและฉันจะตั้งค่าได้อย่างไร
คำตอบ:
scale_pos_weight
ใช้สำหรับการจำแนกประเภทไบนารีตามที่คุณระบุ มันเป็นวิธีการแก้ปัญหาทั่วไปมากขึ้นในการจัดการชั้นเรียนที่ไม่สมดุล แนวทางที่ดีเมื่อกำหนดค่าให้scale_pos_weight
คือ:
sum(negative instances) / sum(positive instances)
สำหรับกรณีเฉพาะของคุณมีตัวเลือกอื่นเพื่อให้น้ำหนักจุดข้อมูลของแต่ละบุคคลและคำนึงถึงน้ำหนักของพวกเขาในขณะที่ทำงานกับบูสเตอร์ คุณเพียงแค่ต้องใช้:
xgboost.DMatrix(..., weight = *weight array for individual weights*)
คุณสามารถกำหนดน้ำหนักได้ตามที่คุณต้องการและโดยการทำเช่นนั้นคุณสามารถจัดการความไม่สมดุลภายในชั้นเรียนรวมถึงความไม่สมดุลระหว่างชั้นเรียนที่แตกต่างกัน
คำตอบนี้โดย @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
ทุกคนสะดุดกับคำถามนี้เมื่อจัดการกับปัญหาการจำแนกประเภทมัลติคลาสที่ไม่สมดุลโดยใช้ XGBoost ในอาร์ฉันก็ทำเช่นกัน!
ฉันกำลังมองหาตัวอย่างเพื่อให้เข้าใจวิธีการใช้งานได้ดีขึ้น ลงทุนเกือบหนึ่งชั่วโมงเพื่อค้นหาลิงก์ที่กล่าวถึงด้านล่าง สำหรับผู้ที่กำลังมองหาตัวอย่างนี่ไป -
ขอบคุณwacax
เพียงแค่กำหนดข้อมูลรถไฟของคุณด้วยน้ำหนักระดับเดียวกัน ก่อนอื่นให้ทำการชั่งน้ำหนักด้วยclass_weight.compute_class_weight
sklearn จากนั้นให้แต่ละแถวของข้อมูลรถไฟว่ามีน้ำหนักที่เหมาะสม
ฉันคิดว่าที่นี่ข้อมูลรถไฟมีคอลัมน์ 'คลาส' ที่มีหมายเลขคลาส ฉันสันนิษฐานว่ามี 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)