2016-07-27 8 views
6

मैं एक समस्या के लिए एक बेवकूफ बेयस मॉडल सीखना चाहता हूं जहां कक्षा बूलियन है (दो मानों में से एक पर ले जाती है)। कुछ विशेषताएं बूलियन हैं, लेकिन अन्य विशेषताएं स्पष्ट हैं और कुछ छोटी संख्याओं (~ 5) पर ले सकती हैं।मैं (एकाधिक) स्पष्ट सुविधाओं के साथ sklearn.naive_bayes का उपयोग कैसे कर सकता हूं?

यदि मेरी सभी सुविधाएं बूलियन थी तो मैं sklearn.naive_bayes.BernoulliNB का उपयोग करना चाहूंगा। ऐसा लगता है कि sklearn.naive_bayes.MultinomialNB नहीं है जो मैं चाहता हूं।

एक समाधान मेरी स्पष्ट विशेषताओं को बूलियन सुविधाओं में विभाजित करना है। उदाहरण के लिए, यदि एक चर "एक्स" मान "लाल", "हरा", "नीला" मान लेता है, तो मेरे पास तीन चर हो सकते हैं: "एक्स लाल है", "एक्स हरा है", "एक्स नीला है"। यह वर्ग को दिए गए चर के सशर्त स्वतंत्रता की धारणा का उल्लंघन करता है, इसलिए यह पूरी तरह से अनुचित लगता है।

एक और संभावना वैरिएबल को एक वास्तविक मूल्यवान चर के रूप में एन्कोड करना है जहां 0.0 का मतलब लाल है, 1.0 का मतलब हरा है, और 2.0 का मतलब नीला है। यह GaussianNB (स्पष्ट कारणों से) का उपयोग करने के लिए पूरी तरह से अनुचित लगता है।

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

[क्यों मुझे नहीं लगता कि बहुपद नायब समझाने संपादित करने के लिए है जो मैं चाहता]:

मेरे समझ के साथ कि बहुपद एनबी में फीचर वेक्टर कितनी बार की गिनती एक टोकन k में मनाया गया के होते है आईआईडी नमूने हैं।

मेरी समझ यह है कि यह वर्गीकरण के दस्तावेज़ के लिए उपयुक्त है जहां दस्तावेज़ की अंतर्निहित कक्षा है, और फिर दस्तावेज़ में प्रत्येक शब्द को उस वर्ग के विशिष्ट वितरण से खींचा जाता है। एक दस्तावेज़ में k टोकन होंगे, फीचर वेक्टर शब्दावली आकार के बराबर लंबाई होगी, और फीचर गणनाओं का योग k होगा।

मेरे मामले में, मेरे पास कई बर्नौली चर हैं, साथ ही कुछ स्पष्ट हैं। लेकिन यहां "गिनती" की कोई अवधारणा नहीं है।

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

मुझे नहीं लगता कि यह बहुमत से फिट बैठता है क्योंकि यहां कोई गणना नहीं है।

+0

क्या आप विस्तारित कर सकते हैं क्यों बहुराष्ट्रीय बेवकूफ बेयस आपके लिए अच्छा नहीं है? –

उत्तर

8

कुछ विशेषताएं बूलियन हैं, लेकिन अन्य विशेषताएं स्पष्ट हैं और कुछ छोटी संख्या (~ 5) ले सकती हैं।

यह एक दिलचस्प सवाल है, लेकिन यह वास्तव में एक भी एक से अधिक है:

  1. नायब में एक स्पष्ट सुविधा के साथ कैसे निपटने के लिए।
  2. एनबी में गैर-सजातीय सुविधाओं से निपटने के लिए कैसे करें (और, जैसा कि मैं निम्नलिखित में इंगित करता हूं, यहां तक ​​कि दो स्पष्ट विशेषताएं गैर-सजातीय हैं)।
  3. sklearn में यह कैसे करें।

पहले एक एकल स्पष्ट सुविधा पर विचार करें। एनबी मानता है/सरल बनाता है कि विशेषताएं स्वतंत्र हैं। इसे कई बाइनरी चर में बदलने का आपका विचार बिल्कुल dummy variables है। जाहिर है, ये डमी चर कुछ भी स्वतंत्र हैं। परिणामस्वरूप बर्नौली एनबी चलाने का आपका विचार स्वतंत्र रूप से आजादी मानता है। हालांकि यह ज्ञात है कि, व्यावहारिक रूप से, निर्भर चर के साथ सामना करते समय एनबी जरूरी नहीं है, समस्या को एनबी के लिए सबसे खराब कॉन्फ़िगरेशन में बदलने की कोशिश करने का कोई कारण नहीं है, विशेष रूप से बहुराष्ट्रीय एनबी एक बहुत ही आसान विकल्प है।

इसके विपरीत, मान लीजिए कि एकल वर्गीकरण चर को डमी चर का उपयोग करके बहु-कॉलम डेटासेट में बदलने के बाद, आप बहुराष्ट्रीय एनबी का उपयोग करते हैं। बहुपद नायब states के लिए सिद्धांत:

एक बहुपद घटना मॉडल के साथ

, नमूने (सुविधा वैक्टर) आवृत्तियों जिसके साथ कुछ घटनाओं एक बहुपद ... जहां पी मैं संभावना है कि घटना मैं होता है द्वारा उत्पन्न की है प्रतिनिधित्व करते हैं। एक फीचर वेक्टर ... तब एक हिस्टोग्राम है, x i {\ displaystyle x_ {i}} x_ {i} किसी विशेष उदाहरण में देखी गई घटनाओं की संख्या की गणना करना। यह आमतौर पर दस्तावेज़ वर्गीकरण के लिए उपयोग किया जाने वाला इवेंट मॉडल होता है, जिसमें एक दस्तावेज़ में किसी शब्द की घटना का प्रतिनिधित्व करने वाली घटनाएं होती हैं (शब्दों की धारणा का बैग देखें)।

तो, यहां, आपके एकल वर्गीकृत चर के प्रत्येक उदाहरण "लंबाई -1 अनुच्छेद" है, और वितरण वास्तव में बहुपद है। विशेष रूप से, प्रत्येक पंक्ति में 1 एक स्थिति में और 0 बाकी सभी में होती है क्योंकि लंबाई -1 अनुच्छेद में एक शब्द होना चाहिए, और इसलिए वे आवृत्तियों होंगे।

ध्यान दें कि sklearn के बहुपद एनबी, तथ्य यह है कि डाटासेट 5 स्तंभों वाले है की दृष्टि से, अब आजादी के एक अनुमान संकेत नहीं करता है।


अब मामले पर विचार जहां कई सुविधाओं से मिलकर एक डाटासेट है:

  1. स्पष्ट
  2. Bernoulli
  3. सामान्य

एनबी का उपयोग कर के बहुत धारणा के तहत, ये चर स्वतंत्र हैं। नतीजतन, आप निम्न कर सकते हैं:

  1. अलग से स्पष्ट डेटा के प्रत्येक के लिए एक नायब वर्गीकारक निर्माण, अपने डमी चर और एक बहुपद एनबी का उपयोग कर।
  2. सभी के लिए एक बार में बर्नौली डेटा के एनबी वर्गीकरण का निर्माण करें - ऐसा इसलिए है क्योंकि sklearn का बर्नौली एनबी बस कई एकल फीचर बर्नौली एनबी के लिए शॉर्टकट है।
  3. सभी सामान्य सुविधाओं के लिए 2 के समान।

आजादी के परिभाषा के अनुसार, एक उदाहरण के लिए संभावना है, इन classifiers द्वारा उदाहरणों की संभावनाओं का उत्पाद है।

+0

संदेश के लिए धन्यवाद! मैंने अपने प्रश्न को यह बताने के लिए अद्यतन किया कि मुझे क्यों नहीं लगता कि बहुराष्ट्रीय एनबी फिट बैठता है। मैं गलत हो सकता हूं और कुछ याद कर रहा हूं, या मेरी समस्या को बहुराष्ट्रीय एनबी में डालने का एक चालाक तरीका हो सकता है। लेकिन बुनियादी बहुराष्ट्रीय सेटअप मेरे लिए गलत लगता है? फिर से धन्यवाद! –

+0

@NedRuggeri अद्यतन देखें। –

+0

महान जवाब! अनुवर्ती प्रश्न: मुझे यकीन नहीं है कि अलग-अलग एनबी वर्गीकरण से संभावनाओं को गुणा करना उचित है। उदाहरण के लिए: आइए लक्षित वर्गों में से एक को 'के' पर विचार करें। हम बर्नौली सुविधाओं के साथ एक वर्गीकरण का निर्माण करते हैं, और 'पी (के | एक्स_बर) = पी (के) पी। (एक्स_बर | के)/जेड' प्राप्त करते हैं। एक वर्गीकरण-सुविधा के लिए दूसरे वर्गीकृत के साथ, हमें 'पी (के | एक्सकैट) = पी (के) पी। (एक्सकैट | के)/जेड 'मिलता है। इन्हें गुणा करके पूर्व 'पी (के)' के वर्ग के साथ अंक में गुणा करें, वांछित मान 'पी (के | एक्स_बर, एक्सकैट) = पी (के) पी। (एक्स_बर | के) पी। (एक्सकैट | के)/जेड'। क्या हमें गुणा करने के बाद पहले विभाजित करना चाहिए? – dhrumeel

संबंधित मुद्दे