2015-06-13 3 views
11

मैं अपने डेटासेट पर मशीन लर्निंग एल्गोरिदम लागू करने के लिए Scikit-learn का उपयोग कर रहा हूं। कभी-कभी मुझे लेबल/कक्षाओं से जुड़े लेबल/कक्षाओं की संभावनाएं होती हैं। ईमेल के लेबल के रूप में स्पैम/स्पैम नहीं होने के बजाय, मैं केवल उदाहरण के लिए चाहता हूं: 0.78 संभावना एक दिए गए ईमेल स्पैम है।सुरक्षित और सही तरीके से RandomForestClassifier के predict_proba() फ़ंक्शन का उपयोग

इस तरह के प्रयोजन के लिए, मैं निम्नलिखित के रूप में RandomForestClassifier साथ predict_proba() का उपयोग कर रहा:

clf = RandomForestClassifier(n_estimators=10, max_depth=None, 
    min_samples_split=1, random_state=0) 
scores = cross_val_score(clf, X, y) 
print(scores.mean()) 

classifier = clf.fit(X,y) 
predictions = classifier.predict_proba(Xtest) 
print(predictions) 

और मैं उन परिणामों मिला:

[ 0.4 0.6] 
[ 0.1 0.9] 
[ 0.2 0.8] 
[ 0.7 0.3] 
[ 0.3 0.7] 
[ 0.3 0.7] 
[ 0.7 0.3] 
[ 0.4 0.6] 

कहाँ दूसरे स्तंभ वर्ग के लिए है: स्पैम। हालांकि, मेरे पास दो मुख्य मुद्दे हैं जिनके बारे में मुझे विश्वास नहीं है। पहला मुद्दा यह है कि परिणाम मेरे डेटा के आकार से प्रभावित किए बिना लेबल की संभावनाओं का प्रतिनिधित्व करते हैं? दूसरा मुद्दा यह है कि परिणाम केवल एक अंक दिखाते हैं जो कुछ मामलों में बहुत विशिष्ट नहीं है जहां 0.701 संभावना 0.708 से बहुत अलग है। उदाहरण के लिए अगले 5 अंक प्राप्त करने का कोई तरीका है?

इन दो मुद्दों और उनके प्रश्नों को पढ़ने में आपके समय के लिए अग्रिम धन्यवाद।

+0

मैं सेबेस्टियन से सहमत हूं, अपनी भविष्यवाणी सरणी में एक विशिष्ट अनुक्रमणिका की तलाश करें, आपको शायद अधिक सटीकता होगी। मैं सटीक बनाना चाहता था कि परिणाम भविष्यवाणी सरणी में परिणाम श्रेणी के नाम से क्रमबद्ध रूप से क्रमबद्ध किया गया है। – RPresle

+0

प्रिय प्रिंसल, आपकी टिप्पणी के लिए धन्यवाद। – Clinical

उत्तर

1
  1. मुझे अपने परिणामों में एक से अधिक अंक मिलते हैं, क्या आप वाकई अपने डेटासेट के कारण नहीं हैं? (उदाहरण के लिए एक बहुत ही छोटे डेटासेट का उपयोग सरल निर्णय पेड़ और इतनी 'सरल' संभावनाओं के लिए होता है)। अन्यथा यह केवल एक प्रदर्शन दिखा सकता है जो एक अंक दिखाता है, लेकिन predictions[0,0] प्रिंट करने का प्रयास करें।

  2. मुझे यह समझने की ज़रूरत नहीं है कि "मेरे डेटा के आकार से संभावनाएं प्रभावित नहीं हैं" का क्या मतलब है। यदि आपकी चिंता यह है कि आप भविष्यवाणी नहीं करना चाहते हैं, उदाहरण के लिए, बहुत सारे स्पैम, आमतौर पर क्या किया जाता है, थ्रेसहोल्ड t का उपयोग करना है, जैसे कि आप 1 अगर proba(label==1) > t की भविष्यवाणी करते हैं। इस तरह आप अपनी भविष्यवाणियों को संतुलित करने के लिए दहलीज का उपयोग कर सकते हैं, उदाहरण के लिए स्पैम की वैश्विक संभाव्यता को सीमित करने के लिए। और यदि आप वैश्विक रूप से अपने मॉडल का विश्लेषण करना चाहते हैं, तो हम आम तौर पर रिसीवर ऑपरेटिंग विशेषता (आरओसी) वक्र के वक्र (एयूसी) के तहत क्षेत्र की गणना करते हैं (विकिपीडिया लेख here देखें)। असल में आरओसी वक्र थ्रेसहोल्ड t के आधार पर आपकी भविष्यवाणियों का विवरण है।

उम्मीद है कि यह मदद करता है!

+0

मैं @Andreus के बारे में इस उत्तर को पूरा कर रहा हूं। एक यादृच्छिक वन वास्तव में निर्णय पेड़ का संग्रह है। हालांकि एक वर्ग से संबंधित होने की संभावना की भविष्यवाणी करने के लिए एक पेड़ का भी उपयोग किया जा सकता है। 'DecisionTreeClassifier' वर्ग की विधि 'predict_proba' पर sklearn उद्धरण:' अनुमानित वर्ग संभावना एक पत्ते में एक ही कक्षा के नमूने का अंश है। और एक यादृच्छिक जंगल की भविष्यवाणी सभी पेड़ों पर औसत है:' इनपुट नमूना की अनुमानित कक्षा की संभावनाओं को जंगल में पेड़ की औसत अनुमानित कक्षा की संभावनाओं के रूप में गणना की जाती है। – Sebastien

+0

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

+0

और, एक बिंदु के मूल्य की जांच करने के लिए पहले बिंदु और आपके सुझाव के संबंध में, वास्तव में मुझे अंकों की संख्या मिल गई। अधिक अंक प्राप्त करने का एकमात्र तरीका है अनुमान लगाने वालों (पेड़) की संख्या में वृद्धि करना और निश्चित रूप से इस तरह का एक स्वीकार्य तरीका नहीं है। – Clinical

6

RandomForestClassifierDecisionTreeClassifier का संग्रह है। कोई फर्क नहीं पड़ता कि आपका प्रशिक्षण सेट कितना बड़ा है, एक निर्णय पेड़ बस लौटाता है: एक निर्णय। एक वर्ग की संभावना 1 है, अन्य वर्गों की संभावना 0 है।

रैंडमॉर्स्ट बस परिणामों के बीच वोट देता है। predict_proba() जंगल में पेड़ों की संख्या से विभाजित, प्रत्येक वर्ग के लिए वोटों की संख्या लौटाता है (जंगल में प्रत्येक पेड़ अपना निर्णय लेता है और बिल्कुल एक वर्ग चुनता है)। इसलिए, आपकी परिशुद्धता बिल्कुल 1/n_estimators है। अधिक "सटीक" चाहते हैं? अधिक अनुमानक जोड़ें। यदि आप 5 वें अंक पर भिन्नता देखना चाहते हैं, तो आपको 10**5 = 100,000 अनुमानकों की आवश्यकता होगी, जो अत्यधिक है। आप आमतौर पर 100 से अधिक अनुमानक नहीं चाहते हैं, और अक्सर कई नहीं।

+0

प्रिय आंद्रेस, मुझे उम्मीद है कि आप ठीक हैं। इस प्रश्न में आपकी कोशिश करने में मदद के लिए बहुत धन्यवाद। यदि आपको कोई फर्क नहीं पड़ता है, तो क्या आप सेबस्टियन को मेरी टिप्पणी में मेरी चिंता का स्पष्टीकरण देख सकते हैं। आपके उत्तर के बारे में, हाँ, मैंने पेड़ की संख्या बढ़ाने की कोशिश की और मैंने जो कहा वह मुझे मिला। हालांकि, अभी भी 50 या 100 पेड़ों के आकार के साथ, मैं और अधिक अंक नहीं देख सकता। क्या आपका जवाब यह कह रहा है कि अगर मुझे 0.7 मिल गया तो इसका मतलब है कि सात के बाद कोई और अंक नहीं है और यदि हम सात के पीछे अंक देखने की कोशिश करते हैं तो हमें इस तरह का परिणाम मिलेगा: 0.70000? क्षमा करें अगर मैं आपको समझ नहीं रहा हूं। – Clinical

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