असंतुलित डेटासेट के लिए xgboost में scale_pos_weight का उचित उपयोग क्या है?


26

मेरे पास बहुत असंतुलित डेटासेट है। मैं ट्यूनिंग सलाह का पालन करने और उपयोग करने की कोशिश कर रहा हूं scale_pos_weightलेकिन यह सुनिश्चित नहीं है कि मुझे इसे कैसे ट्यून करना चाहिए।

मैं देख सकता हूँ कि RegLossObj.GetGradientकरता है:

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

इसलिए एक सकारात्मक नमूने का एक ढाल अधिक प्रभावशाली होगा। हालाँकि, xgboost पेपर के अनुसार , ढाल सांख्यिकीय हमेशा स्थानीय रूप से उपयोग किया जाता है = एक विशिष्ट पेड़ में एक विशिष्ट नोड के उदाहरणों के भीतर:

  1. एक नोड के संदर्भ में, एक उम्मीदवार विभाजन के नुकसान में कमी का मूल्यांकन करने के लिए
  2. पत्ती नोड के संदर्भ में, उस नोड को दिए गए वजन का अनुकूलन करने के लिए

तो पहले से जानने का कोई तरीका नहीं है कि क्या अच्छा होगा scale_pos_weight- यह एक नोड के लिए एक बहुत अलग संख्या है जो सकारात्मक और नकारात्मक उदाहरणों के बीच 1: 100 के अनुपात के साथ समाप्त होती है, और 1: 2 के अनुपात के साथ नोड के लिए।

कोई संकेत?


शायद, आप सीवी में पैरामीटर को 5 गुना 5 रिपीट के साथ ट्यून कर सकते हैं। लेकिन, ऐसा करने के लिए आपको कोड लिखने की आवश्यकता हो सकती है।
user2149631

जवाबों:


22

आमतौर पर, Scale_pos_weight सकारात्मक वर्ग के लिए ऋणात्मक वर्ग की संख्या का अनुपात है। मान लीजिए, डेटासेट में नेगेटिव क्लास के 90 ऑब्जर्वेशन और पॉजिटिव क्लास के 10 ऑब्जर्वेशन हैं, तो scale_pos_Weight का आदर्श मूल्य 9. होना चाहिए। आप निम्न लिंक की जांच कर सकते हैं। http://xgboost.readthedocs.io/en/latest/parameter.html


1
यह एक बहु-विषयक डेटासेट के लिए कैसे लागू होगा? 28 वर्गों के बारे में कैसे? यह मेरे लिए स्पष्ट नहीं है
गेब्रियल ज़िग्लर 14

1
@ गैब्रिएल मेरा मानना ​​है कि तब क्लास वेट के लिए जाना बेहतर होगा। आप एक बनाम बाकी दृष्टिकोण का उपयोग करके, पैमाने_ का उपयोग कर सकते हैं। उदाहरण के लिए, 28 वर्गों के लिए डमी बनाएं। तब आप प्रत्येक को बाइनरी वर्गीकरण समस्या के रूप में उपयोग कर सकते हैं। इस तरह आप 28 विभिन्न मॉडलों के साथ काम करेंगे।
हर्षित मेहता

मैं देखता हूं, लेकिन जब मैं वनवेस्ट का उपयोग करता हूं तो क्लासिफायर मुझे मल्टीलेबेल आउटपुट भी नहीं देता है, है ना? 28 से बाहर केवल एक वर्ग नहीं
गेब्रियल ज़िगलर

किस तरह ?। उदाहरण के लिए: कक्षाएं A, B, C हैं। तो आपके पास वर्गीकृत करने के लिए बाइनरी क्लासिफायरफ़ायर (ए / नॉट ए) हो सकता है, एक और एक होगा (बी / नॉट बी)। आप इसे 'n' वर्गों की संख्या के लिए कर सकते हैं। फिर प्रत्येक क्लासिफायरियर के अनुरूप सभी संभावनाओं के बीच, आपको कक्षाओं को असाइन करने का एक तरीका खोजना होगा।
हर्षित मेहता

मैं मल्टीलेबल के लिए वनवेस्ट का उपयोग करने के लिए उपयोग किया जाता हूं, लेकिन मैं इसे आज़माऊंगा! धन्यवाद!
गेब्रियल ज़िगलर

3

सभी प्रलेखन कहते हैं कि होना चाहिए:

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

व्यवहार में, यह बहुत अच्छा काम करता है, लेकिन अगर आपका डेटासेट बहुत असंतुलित है, तो मैं कुछ और रूढ़िवादी का उपयोग करने की सलाह दूंगा:

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

यह बहुत अधिक वजन द्वारा सकारात्मक उदाहरणों के गुणन के प्रभाव को सीमित करने के लिए उपयोगी है।


1

मैं आपके प्रश्न और हताशा को समझता हूं, लेकिन मुझे यकीन नहीं है कि यह कुछ ऐसा है जिसे विश्लेषणात्मक रूप से गणना की जा सकती है, बल्कि आपको अपने डेटा के लिए अनुभवजन्य रूप से एक अच्छी सेटिंग निर्धारित करनी होगी, जैसा कि आप ज्यादातर हाइपर मापदंडों के लिए करते हैं, @ user214431 के रूप में क्रॉस सत्यापन का उपयोग करते हुए सुझाव दिया। मुझे Xgboost के साथ SelectFPR का उपयोग करने में कुछ सफलता मिली है और इसके बजाय फीचर चयन के माध्यम से XGBoost के लिए FPR को कम करने के लिए sklearn API, इसके बाद 0 और 1.0 के बीच के स्केल_पोस_वेट को आगे बढ़ाते हुए। O.9 अच्छी तरह से काम करने लगता है लेकिन कुछ भी, YMMV आपके डेटा के आधार पर। यदि आप उनके डॉक्स के माध्यम से देखते हैं तो प्रत्येक डेटा बिंदु को व्यक्तिगत रूप से XGboost पर भेज सकते हैं। आपको उनके API का उपयोग करना होगा न कि स्केलेर रैपर से। इस तरह से आप डेटा बिंदुओं के एक सेट को दूसरे की तुलना में बहुत अधिक वजन कर सकते हैं, और यह उपयोग करने वाले बूस्टिंग एल्गोरिदम को प्रभावित करेगा।


0

मैं भी इस दुविधा पर ठोकर खाई और अभी भी सबसे अच्छा समाधान के लिए देख रहा हूँ। हालाँकि, मैं आपको अपने क्लासिफायर के लिए सर्वोत्तम पैरामीटर ट्यूनिंग के लिए ग्रिड खोज (स्केलेर में ग्रिडसर्चसीवी) जैसे तरीकों का उपयोग करने का सुझाव दूंगा। हालांकि, यदि आपका डेटासेट अत्यधिक असंतुलित है, तो इसका नमूना लेने के तरीकों पर विचार करने के लिए सार्थक है (विशेष रूप से यादृच्छिक ओवरसम्पलिंग और एसएमओटीई ओवरसम्पलिंग के तरीके) और मॉडल सकारात्मक और नकारात्मक वर्ग उदाहरणों के विभिन्न अनुपातों के साथ डेटा नमूनों पर मिलते-जुलते हैं। यहाँ असंतुलित डेटासेट को संभालने के बारे में एक अच्छा और उपयोगी (लगभग व्यापक) ट्यूटोरियल है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.