निर्णय पेड़ / यादृच्छिक वन में सुविधाओं के रूप में तार


63

मैं निर्णय पेड़ / यादृच्छिक वन के एक आवेदन पर कुछ समस्याएं कर रहा हूं। मैं एक समस्या को फिट करने की कोशिश कर रहा हूं जिसमें नंबर और साथ ही तार (जैसे कि देश का नाम) भी हैं। अब लाइब्रेरी, स्किकिट-लर्न केवल नंबरों को पैरामीटर के रूप में लेता है, लेकिन मैं स्ट्रिंग्स को इंजेक्ट करना चाहता हूं और साथ ही वे एक महत्वपूर्ण मात्रा में ज्ञान भी लेते हैं।

मैं ऐसे परिदृश्य को कैसे संभाल सकता हूं?

मैं कुछ तंत्र जैसे कि पायथन में हैशिंग के द्वारा एक स्ट्रिंग को संख्या में बदल सकता हूं। लेकिन मैं सबसे अच्छा अभ्यास जानना चाहूंगा कि निर्णय पेड़ की समस्याओं में कैसे संभाला जाता है।


Sckitlearn के मामले में मैंने देखा है कि हमें श्रेणीबद्ध चर को एनकोड करने की आवश्यकता है, अन्यथा फिट विधि एक त्रुटि कहती है ValueError: स्ट्रिंग को फ्लोट में परिवर्तित नहीं कर सकता है
Kar

जवाबों:


55

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

इस प्रकार, बस हैश कोड के साथ तारों को बदलने से बचा जाना चाहिए, क्योंकि एक निरंतर संख्यात्मक विशेषता के रूप में माना जा रहा है कि आप जिस भी कोडिंग का उपयोग करेंगे, वह एक आदेश को प्रेरित करेगा जो आपके डेटा में मौजूद नहीं है।

एक उदाहरण को [1,2,3] के साथ ['लाल', 'हरा', 'नीला'] को कोडित करना है, 'लाल' जैसी अजीब चीजें पैदा करना 'नीली' से कम है, और यदि आप एक 'लाल' को औसत करते हैं और एक 'नीला' आपको एक 'हरा' मिलेगा। एक और अधिक सूक्ष्म उदाहरण तब हो सकता है जब आप [1,2,3] के साथ ['कम', 'मध्यम', 'उच्च'] कोड करते हैं। बाद के मामले में ऐसा हो सकता है कि एक आदेश हो जो समझ में आता है, हालांकि, कुछ सूक्ष्म असंगतताएं तब हो सकती हैं जब 'मध्यम' 'निम्न' और 'उच्च' के बीच में नहीं होता है।

अंत में, आपके प्रश्न का उत्तर श्रेणीबद्ध सुविधा को कई बाइनरी सुविधाओं में कोड करने में निहित है । उदाहरण के लिए, आप 3 कॉलम के साथ ['रेड', 'ग्रीन', 'ब्लू'] कोड कर सकते हैं, प्रत्येक श्रेणी के लिए एक, जिसमें 1 तब होगा जब श्रेणी मैच और 0 अन्यथा। इसे वन-हॉट-एन्कोडिंग , बाइनरी एन्कोडिंग, वन-ऑफ-के-एन्कोडिंग या जो भी कहा जाता है। आप इनकोडिंग श्रेणी के फीचर्स और फीचर एक्सट्रैक्शन - हैशिंग और डाइक्स के लिए प्रलेखन की जांच कर सकते हैं । जाहिर है एक-हॉट-एन्कोडिंग आपकी अंतरिक्ष आवश्यकताओं का विस्तार करेगी और कभी-कभी यह प्रदर्शन को भी नुकसान पहुंचाती है।


2
यह डरावना कार्यान्वयन है कि यह श्रेणीबद्ध चर को ठीक से नहीं संभालता है। यह जवाब देने का तरीका बताता है कि संभवत: सबसे अच्छा आप क्या कर सकते हैं। अधिक गंभीर उपयोगकर्ता वैकल्पिक पैकेज की तलाश कर सकता है।
स्मालचेयर

3
श्रेणीबद्ध चर के एक-गर्म-एन्कोडिंग के लिए sklearn.preprocessing.LabelBinarizer का उपयोग कर सकते हैं।
गुस्कु

@rapaio मुझे लगता है कि बाइनरी कोडिंग एक ही गर्म एन्कोडिंग नहीं है। बाइनरी कोडिंग तब होती है जब आप 3 कॉलम के साथ 8 श्रेणियों का प्रतिनिधित्व करते हैं, या 9 से 16 श्रेणियों के बीच 4 कॉलम और इसी तरह। क्या मै गलत हु?
आलोक नायक

पैटी पायथन पैकेज श्रेणीबद्ध चर के एक-गर्म एन्कोडिंग से निपटेगा। patsy.readthedocs.io/en/latest/quickstart.html
zhespelt

5
लेबलबिनेराइज़र का उपयोग न करें, sklearn.preprocessing.OneHotEncoder का उपयोग करें । यदि आप अपने डेटा को आयात और पूर्व-संसाधित करने के लिए पांडा का उपयोग कर रहे हैं, तो आप सीधे pandas.get_dumesies का उपयोग करके भी कर सकते हैं । यह बेकार है कि scikit- सीखें श्रेणीबद्ध चर का समर्थन नहीं करता है।
रिकार्डो क्रूज़

11

आपको अपने स्ट्रिंग्स को सांख्यिक सुविधाओं के रूप में एन्कोड करना होगा जो कि विज्ञान-किट एमएल एल्गोरिदम के लिए उपयोग कर सकते हैं। इस कार्यक्षमता को प्रीप्रोसेसिंग मॉड्यूल में संभाला जाता है (उदाहरण के लिए, sklearn.preprocessing.LabelEncoder को देखें )।


3
rapaio अपने जवाब में बताता है कि यह गलत परिणाम क्यों मिलेगा
कीथ

7

आपको रैंडम फ़ॉरेस्ट सहित स्किटिट-लर्न मॉडल के लिए आमतौर पर एक-हॉट एन्कोडर श्रेणीबद्ध चर चाहिए । रैंडम फॉरेस्ट अक्सर एक-हॉट एन्कोडिंग के बिना ठीक काम करेगा लेकिन आमतौर पर यदि आप एक-हॉट एनकोड करते हैं तो बेहतर प्रदर्शन करते हैं। एक-गर्म एन्कोडिंग और "डमीइंग" चर का अर्थ इस संदर्भ में एक ही बात है। स्किकिट-लर्न में sklearn.preprocessing.OneHotEncoder है और पंडों के पास इसे पूरा करने के लिए pandas.get_dummies है।

हालांकि, वहाँ विकल्प हैं। लेख KDnuggets पर "एक-गर्म परे" समझा तुम क्यों एक गर्म एन्कोडिंग को स्पष्ट चर और विकल्प सांकेतिक शब्दों में बदलना करने की जरूरत का एक बड़ा काम करता है।

यादृच्छिक वन के वैकल्पिक कार्यान्वयन हैं जिन्हें आर या एच 2 ओ जैसे एक-गर्म एन्कोडिंग की आवश्यकता नहीं है। आर में कार्यान्वयन कम्प्यूटेशनल रूप से महंगा है और अगर आपकी सुविधाओं में कई श्रेणियां हैं, तो यह काम नहीं करेगा । एच 2 ओ बड़ी संख्या में श्रेणियों के साथ काम करेगा। कॉन्टिनम ने H2O को एनाकोंडा पायथन में उपलब्ध कराया है।

वहाँ एक है scikit सीखने सीधे स्पष्ट सुविधाओं को संभाल करने के लिए प्रयास चल रहे हैं

इस लेख में एच 2 ओ में प्रयुक्त एल्गोरिथ्म का स्पष्टीकरण है। यह अकादमिक पेपर ए स्ट्रीमिंग समानांतर निर्णय ट्री एल्गोरिथम और उसी पेपर के एक लंबे संस्करण का संदर्भ देता है।


5

2018 अपडेट!

आप अपने श्रेणीबद्ध चर के लिए एक एम्बेडिंग (घने वेक्टर) स्थान बना सकते हैं। आप में से कई लोग word2vec और fastext से परिचित हैं, जो शब्दों को अर्थपूर्ण सघन सदिश स्थान में एम्बेड करते हैं। यहाँ एक ही विचार - अपने श्रेणीबद्ध चर कुछ अर्थ के साथ एक वेक्टर के लिए मैप करेंगे।

से गुओ / Berkhahn कागज :

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

लेखकों ने पाया कि इस तरह से श्रेणीबद्ध चर का प्रतिनिधित्व करने से यादृच्छिक वन सहित सभी मशीन लर्निंग एल्गोरिदम की प्रभावशीलता में सुधार हुआ।

सबसे अच्छा उदाहरण समूह से संबंधित पिंस के लिए तकनीक के Pinterest का अनुप्रयोग हो सकता है :

यहाँ छवि विवरण दर्ज करें

Fastai के लोगों ने श्रेणीबद्ध एम्बेडिंग को लागू किया है और साथी डेमो नोटबुक के साथ एक बहुत अच्छा ब्लॉग पोस्ट बनाया है ।

अतिरिक्त विवरण और स्पष्टीकरण

एक तंत्रिका जाल का उपयोग एम्बेडिंग बनाने के लिए किया जाता है अर्थात प्रत्येक श्रेणीगत मान के लिए एक वेक्टर असाइन किया जाता है। एक बार जब आपके पास वैक्टर होते हैं, तो आप उन्हें किसी भी मॉडल में उपयोग कर सकते हैं जो संख्यात्मक मानों को स्वीकार करता है। वेक्टर का प्रत्येक घटक एक इनपुट चर बन जाता है। उदाहरण के लिए, यदि आपने रंगों की अपनी श्रेणीबद्ध सूची को एम्बेड करने के लिए 3-डी वैक्टर का उपयोग किया है, तो आपको कुछ मिल सकता है जैसे: लाल = (0, 1.5, -2.3), नीला = (1, 1, 0) आदि। आप तीन का उपयोग करेंगे। तीन घटकों के अनुरूप आपके यादृच्छिक वन में इनपुट चर। लाल चीजों के लिए, c1 = 0, c2 = 1.5, और c3 = -2.3। नीली चीजों के लिए, c1 = 1, c2 = 1, और c3 = 0।

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

  1. RGB वैक्टर को मैप कलर।
  2. लैट / लंबे वैक्टर के लिए मानचित्र स्थान।
  3. एक अमेरिकी राजनीतिक मॉडल में, कुछ वेक्टर घटकों के लिए शहरों को मैप करें जो बाएं / दाएं संरेखण, कर बोझ आदि का प्रतिनिधित्व करते हैं।

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

@ एक तंत्रिका जाल का उपयोग एम्बेडिंग बनाने के लिए किया जाता है अर्थात प्रत्येक श्रेणीगत मान के लिए एक वेक्टर प्रदान करते हैं। एक बार जब आपके पास वैक्टर होते हैं, तो आप उन्हें किसी भी मॉडल में उपयोग कर सकते हैं जो संख्यात्मक मानों को स्वीकार करता है। वेक्टर का प्रत्येक घटक एक इनपुट चर बन जाता है। उदाहरण के लिए, यदि आपने रंगों की अपनी श्रेणीबद्ध सूची को एम्बेड करने के लिए 3-डी वैक्टर का उपयोग किया है, तो आपको कुछ मिल सकता है जैसे: लाल = (0, 1.5, -2.3), नीला = (1, 1, 0)आदि। आप तीन घटकों के अनुरूप अपने यादृच्छिक वन में तीन इनपुट चर का उपयोग करेंगे। लाल चीजों के लिए, c1 = 0, c2 = 1.5, और c3 = -2.3। नीली चीजों के लिए, c1 = 1, c2 = 1, और c3 = 0.
पीट

मैं पूरी तरह से अवधारणा प्राप्त करता हूं क्योंकि यह बहुत सरल है। मेरा मतलब है कि कार्यान्वयन में यह कैसे होगा? आपके द्वारा लिंक की जाने वाली fast.ai डेमो नोटबुक में अंत में एक randomForestRegressor होता है, लेकिन मैं वास्तव में नहीं देखता कि यह एम्बेडिंग में कैसे जोड़ता है।
कीथ

मुझे लगता है कि यह Keras में कोड का एक अच्छा उदाहरण हो सकता है github.com/entron/entity-embedding-rossmann
कीथ

3

आप ऐसे परिदृश्यों में डमी चर का उपयोग कर सकते हैं। पांडा के साथ panda.get_dummiesआप डिसिजन ट्री या रैंडम फॉरेस्ट में डालने के लिए स्ट्रिंग्स के लिए डमी वैरिएबल बना सकते हैं।

उदाहरण:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

2

उदाहरण के लिए, प्रत्येक अद्वितीय देश को एक अद्वितीय संख्या (जैसे 1,2,3 और ...) के लिए उन्हें संख्या में बदल दें।

आपको यह भी मत का प्रयोग करना होगा एक-गर्म एन्कोडिंग (जैसे रैखिक / रसद प्रतिगमन के रूप में) (उर्फ डमी चर) जब, यादृच्छिक वन के साथ काम करने की वजह से पेड़ अन्य एल्गोरिथ्म की तरह काम नहीं करते और वे दूर से काम नहीं करते हैं (वे अपनी सुविधाओं के लिए अच्छा विभाजन खोजने के साथ काम करें) इसलिए वन-हॉट एन्कोडिंग के लिए NO NEED


1
यह वास्तव में पेड़ को प्रशिक्षित करने वाले विशेष एल्गोरिथ्म पर निर्भर करता है। विशेष रूप से, scitit श्रेणीबद्ध चर का समर्थन नहीं करता है।
च्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.