कई श्रेणीबद्ध चर के साथ वर्गीकरण में सुधार करें


37

मैं 200,000+ नमूनों के साथ एक डेटासेट पर काम कर रहा हूं और प्रति नमूने लगभग 50 विशेषताएं: 10 निरंतर चर और अन्य ~ 40 श्रेणीबद्ध चर (देश, भाषा, वैज्ञानिक क्षेत्र आदि) हैं। इन श्रेणीबद्ध चरों के लिए, आपके पास 150 विभिन्न देशों, 50 भाषाओं, 50 वैज्ञानिक क्षेत्रों आदि के उदाहरण हैं ...

अब तक मेरा दृष्टिकोण है:

  1. कई संभावित मूल्य वाले प्रत्येक श्रेणीगत चर के लिए, केवल 10000 से अधिक नमूने वाले एक को ही लें, जो इस मूल्य को लेता है। यह 150 के बजाय 5-10 श्रेणियों तक कम हो जाता है।

  2. प्रत्येक श्रेणीबद्ध एक के लिए डमी चर बनाएं (यदि 10 देशों में प्रत्येक नमूने के लिए आकार 10 का एक द्विआधारी वेक्टर जोड़ें)।

  3. इस डेटा के साथ एक रैंडम फ़ॉरेस्ट क्लासिफ़ायर (मापदंडों आदि को क्रॉस-वैलिड करें ...) फ़ीड करें।

वर्तमान में इस दृष्टिकोण के साथ, मैं केवल 65% सटीकता प्राप्त करने का प्रबंधन करता हूं और मुझे लगता है कि अधिक किया जा सकता है। विशेष रूप से मैं अपने 1 से संतुष्ट नहीं हूं) क्योंकि मुझे लगता है कि मुझे मनमाने ढंग से "कम से कम प्रासंगिक मूल्यों" को नहीं निकालना चाहिए, क्योंकि उनके पास नमूना की संख्या है, क्योंकि ये कम प्रतिनिधित्व वाले मूल्य अधिक भेदभावपूर्ण हो सकते हैं। दूसरी ओर, मेरी रैम सभी संभावित मूल्यों को ध्यान में रखते हुए डेटा में 500 कॉलम * 200000 पंक्तियों को जोड़ नहीं सकती है।

क्या आपके पास इस श्रेणीबद्ध चर के साथ सामना करने के लिए कोई सुझाव होगा?


2
आप अभी भी रुचि रखते हैं, आप जांच करना चाह सकते मेरा उत्तर पर आयामी स्वरूप में कमी और मेरा उत्तर पर पदानुक्रमित वर्गीकरण
अलेक्सांद्र बेलेख

1
जब आप कहते हैं कि "प्रत्येक श्रेणी के लिए डमी चर बनाएं" , तो लगता है कि आप पायथन आर का उपयोग नहीं कर रहे हैं? Randomforest मूल रूप से श्रेणीबद्धता को संभाल सकता है, परिणामी स्मृति में कमी भी। आर। की कोशिश करें
12

जवाबों:


20

1) यादृच्छिक वनों को मूल रूप से श्रेणीबद्ध मूल्यों को संभालने में सक्षम होना चाहिए ताकि एक अलग कार्यान्वयन की तलाश करें ताकि आपको उन सभी विशेषताओं को सांकेतिक शब्दों में बदलना न हो और अपनी सभी मेमोरी का उपयोग करना पड़े।

2) उच्च कार्डिनैलिटी श्रेणीबद्ध विशेषताओं के साथ समस्या यह है कि उनके साथ फिट होना आसान है। आपके पास पर्याप्त डेटा हो सकता है कि यह कोई समस्या नहीं है, लेकिन इसके लिए देखें।

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

4) एक और कुछ समय के लिए इस्तेमाल किया गया विकल्प एल्गोरिथ्म को ट्विस्ट करना है, ताकि बैग मामलों में विभाजन को फिट करने के बाद अंतिम फीचर का चयन करने के लिए बैग के मामलों का उपयोग किया जाए जो कभी-कभी ओवरफिटिंग से लड़ने में मदद करता है।

यहाँ लगभग पूर्ण इक्का कार्यान्वयन है और मेरे पास अधिक मेमोरी पुतला / तेज़ आरएफ कार्यान्वयन है जो यहाँ देशी रूप से श्रेणीबद्ध चर संभालता है ... -वैलोबो विकल्प 4 विकल्प का समर्थन करता है मैं एसीई और अन्य एफई के एक जोड़े के लिए समर्थन जोड़ने पर काम कर रहा हूं आधारित सुविधा चयन के तरीके लेकिन यह अभी तक नहीं किया गया है।


4
ये सभी सुझाव दिलचस्प हैं, मैं मानता हूं कि यादृच्छिक वन को मूल रूप से श्रेणीबद्ध चर को संभालना चाहिए, लेकिन scikit-learn नहीं करता ... मुझे लगता है कि यह scikit के मुख्य दोष btw में से एक है। मैं अपने डेटा पर अपने कोड की कोशिश करूँगा कि क्या होता है, और मैं आपके अन्य सुझावों के बारे में देखूंगा!
बर्ट्रेंड आर

1
आर कार्यान्वयन का प्रयास करें। इसे चलाना एक लाइनर है। डेटा पढ़ना बेहद आसान है और इसमें एक नया- ईएसएच पैरेलल कार्यान्वयन है जो तेजी से और मेमोरी कुशल है: दूसरी तरफ r-bloggers.com/… । क्या आपकी कक्षाएं असंतुलित हैं? आर कार्यान्वयन में आप प्रत्येक पेड़ को एक संतुलित बूटस्ट्रैप नमूने से नमूना बना सकते हैं = सी (एक्स, एक्स)। इसने मेरे लिए बेहतर द्विआधारी वर्गीकरण का उत्पादन किया है। आप आकारों के साथ खेल सकते हैं और OOB भ्रम मैट्रिक्स R आउटपुट का उपयोग करके वर्गीकरण को बहुत आसानी से ट्विक कर सकते हैं।
जेइकुआहुआ

2
आर के यादृच्छिक प्रदर्शन को अधिकतम 32 स्तरों वाले कारकों की अनुमति देता है। scikit-learn कम प्रतिबंधक है, जिससे आप पहली बार डमी वैरिएबल बनाते हैं ( pandas.get_dummiesफ़ंक्शन देखें )। यादृच्छिक वन के H2O के कार्यान्वयन ने मेरे लिए वास्तव में अच्छा प्रदर्शन किया है (देखें 0xdata.com/docs/master/model/rf )।
एलेक्स वूलफोर्ड

1
यादृच्छिक वन का एक नया और तेज़ कार्यान्वयन है, पैकेज को रेंजर कहा जाता है। महान सामान वास्तव में। परिमाण के आदेश तेजी से और 32 स्तर की सीमा नहीं है।
मारबेल

6

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


1
यह n <= 3 के साथ श्रेणीबद्ध विशेषताओं के लिए ठीक है, क्योंकि आप सभी समान विभाजन उत्पन्न कर सकते हैं जैसा कि आप मूल रूप से श्रेणीगत के रूप में सुविधा पर विचार करेंगे। बड़े n के लिए यह संभव है कि विभाजन के सेट को वर्गीकृत किया जा सके जो कि श्रेणीबद्ध विभाजन के बराबर है, लेकिन एल्गोरिथ्म उन्हें कुशलतापूर्वक नहीं खोज सकता है या नहीं ... लेकिन अगर आप फीचर को n संख्यात्मक विशेषताओं में विभाजित करते हैं तो आप उस दक्षता को भी कम कर रहे हैं जिसके साथ एल्गोरिथ्म विभाजन को पा सकता है। किसी को स्किटिट-लर्न कार्यान्वयन में श्रेणीबद्ध चर समर्थन जोड़ने की आवश्यकता है क्योंकि यह अन्यथा महान है।
रियान बेस्लर

जब आप कहते हैं कि मैं आपसे सहमत हूं कि यह स्पष्ट डेटा में अध्यादेश लागू करने के लिए संदेहास्पद लगता है ... मुझे ऐसा करने की ज़रूरत नहीं है, लेकिन मैं कम से कम इसे एक कोशिश दे सकता हूं और देख सकता हूं कि क्या होता है!
बर्ट्रेंड आर

4
मैंने इस सवाल के बारे में स्केलेर मेलिंग सूची पर लंबी चर्चा की थी (आप इसके कुछ हिस्सों को यहां पढ़ सकते हैं: mail-archive.com/scikit-learn-general@lists.sourceforge.net/… )। कार्यान्वयनकर्ताओं में से एक की राय यह थी कि पर्याप्त रूप से गहरे पेड़ों के साथ, क्रमिक-एन्कोडेड श्रेणीबद्ध विशेषताएं उचित रूप से अच्छी तरह से (अधिक कम्प्यूटेशनल रूप से कुशल होने के अलावा) काम कर सकती हैं। वैसे भी, यदि आप इसे आज़माते हैं, तो मुझे आपके परिणाम / निष्कर्ष के बारे में सुनने में बहुत दिलचस्पी होगी, क्योंकि यह एक ऐसा मुद्दा है जिसमें मैं टकराता रहता हूं।
cjauvin

1
इसलिए मैंने श्रेणीबद्ध लोगों के लिए एक एकल संख्यात्मक चर रखने की कोशिश की, और यह वास्तव में आश्चर्यजनक रूप से अच्छी तरह से काम करता है, और बड़ी संख्या में द्विआधारी प्रविष्टियों को जोड़ने की तुलना में बेहतर है ... मैंने लक्ष्य के अनुसार उनके अर्थ के अनुसार मानों को क्रमबद्ध करने की भी कोशिश की। । और यह ठीक भी काम करता है
बर्ट्रेंड आर

मैं वास्तव में आश्चर्यचकित नहीं हूँ .. यह मैंने कुछ अलग-अलग सेटिंग्स में देखा है, हालांकि अपवोट की संख्या को देखते हुए, यह एक उल्टा-सीधा विचार है।
cjauvin

5

मुझे लगता है कि आपको एक / अधिक परिवर्तनीय कमी तकनीक (ओं) पर विचार करना चाहिए । यह इतने प्रभावशाली भविष्यवक्ताओं से छुटकारा नहीं दिलाता है।

मैं डेटा पूर्व-प्रसंस्करण के बारे में बहुत कुछ पढ़ रहा हूं और यह आपके चर के n ° को कम करने के लिए एक शानदार समाधान है।

मेरे सुझाव इस प्रकार हैं:

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

इसके अलावा, मैं आरएफ के बजाय AdaBoost एल्गोरिथ्म का उपयोग करने का सुझाव दूंगा । व्यक्तिगत रूप से, मैंने जो शोध किए हैं, उन्होंने मुझे इन दोनों तरीकों के लिए बहुत समान Gini गुणांक दिए हैं। AdaBoost के बारे में अच्छी बात यह है कि R में, यह लापता टिप्पणियों को संभालता है। तो आप इस सूची के पहले चरण को छोड़ सकते हैं

मुझे उम्मीद है कि इससे थोड़ी मदद मिली। सौभाग्य


4

आप मिश्रित-प्रभाव मॉडल पर विचार करना चाह सकते हैं। वे उच्च-कार्डिनलिटी श्रेणीबद्ध डेटा पर अपने प्रदर्शन के कारण सामाजिक विज्ञान में लोकप्रिय हैं, और मैंने उन्हें बड़े पूर्वानुमान वाले मॉडल बनाने के लिए उपयोग किया है जो कि लोकप्रिय मशीन लर्निंग दृष्टिकोणों जैसे ग्रेडिएंट बूस्टेड पेड़, यादृच्छिक वन और लोचदार-नेट नियमित लॉजिस्टिक प्रतिगमन को बेहतर बनाते हैं। सबसे प्रसिद्ध कार्यान्वयन आर का lme4 पैकेज है; फ़ंक्शन जिसे आप वर्गीकरण के लिए उपयोग करेंगे, वह आकर्षक है, जो मिश्रित-प्रभाव लॉजिस्टिक प्रतिगमन को लागू करता है। आपके पास अपने डेटासेट में स्केलिंग के साथ समस्याएँ हो सकती हैं, लेकिन मैंने बहुत अधिक कठिनाई के बिना 15 फीचर्स वाली 80k पंक्तियाँ की हैं।


2
  1. जब आप कहते हैं कि "प्रत्येक श्रेणी के लिए डमी चर बनाएं" , तो लगता है कि आप पायथन आर का उपयोग नहीं कर रहे हैं? Randomforest मूल रूप से श्रेणीबद्धता को संभाल सकता है, परिणामी स्मृति में कमी भी। आर की कोशिश करो।

  2. इसके बाद, आपको मैन्युअल रूप से श्रेणीबद्ध स्तरों को prune / मर्ज करने की आवश्यकता नहीं है, जो एक प्रमुख दर्द की तरह लगता है। और यहां तक ​​कि अगर आपने किया, तो आपको गारंटी नहीं है कि सबसे अधिक आबादी वाली श्रेणियां सबसे अधिक पूर्वानुमान हैं। पैरामीटर नोड्स के साथ यादृच्छिक रूप से जटिलता को नियंत्रित करें : एक बड़े नोड के साथ शुरू करें , और उत्तरोत्तर इसे कम करें (यह हाइपरपरेटिव खोज है)।

  3. चर चयन उपयोगी होगा। @lorelai अच्छी सिफारिशें देता है। बेकार (कम महत्व या अत्यधिक सहसंबद्ध) सुविधाओं को खत्म करने की कोशिश करें। पेड़ों का निर्माण सुविधाओं की संख्या के लिए द्विघात है, इसलिए यदि आप एक तिहाई भी समाप्त करते हैं तो यह लाभांश का भुगतान करेगा।


0

आपको H2O.ai पैकेज को देखना चाहिए । यह किसी भी एन्कोडिंग को करने के बिना बॉक्स से बाहर श्रेणीबद्ध चर को संभालता है (सुनिश्चित करें कि चर कारक हैं)।

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

यदि आप अन्य मॉडलों का पता लगाना चाहते हैं, तो उनके पास हैं: जीएलएम, रैंडम फॉरेस्ट, नैवे बेस, डीप लर्निंग, आदि।

देखें: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

यह भी स्थापित करना आसान है (विंडोज, लिनक्स, मैक) और एपीआई के साथ आर, पायथन, जावा और स्काला का उपयोग करना आसान है।

यह चीजों को गति देने के लिए कई कोर का उपयोग कर सकता है।

निकट भविष्य में, वे GPU का समर्थन करेंगे।

यह ओपन सोर्स और फ्री (एंटरप्राइज सपोर्ट है)।

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