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*)

आप अपनी पसंद के अनुसार वज़न को परिभाषित कर सकते हैं और ऐसा करके, आप कक्षाओं के भीतर असंतुलन के साथ-साथ विभिन्न वर्गों में असंतुलन को भी संभाल सकते हैं।


> स्केल_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

धन्यवाद वैक्सक्स


1

बस अपने ट्रेन डेटा के प्रत्येक उदाहरण को उसके वर्ग भार के साथ असाइन करें। पहले class_weight.compute_class_weightस्केलेर के साथ वर्ग वजन प्राप्त करें फिर ट्रेन डेटा की प्रत्येक पंक्ति को उसके उचित वजन को असाइन करें।

मैं यहां मानता हूं कि ट्रेन डेटा में क्लास नंबर वाला कॉलम 'क्लास' होता है। मैंने यह भी मान लिया कि 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.