MultiOutputClassifier से predict_proba को समझना


28

मैं एक रैंडम फ़ॉरेस्ट मॉडल के साथ एक मल्टीपाउट वर्गीकरण करने के लिए scikit-learn वेबसाइट पर इस उदाहरण का अनुसरण कर रहा हूं ।

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np

X, y1 = make_classification(n_samples=5, n_features=5, n_informative=2, n_classes=2, random_state=1)
y2 = shuffle(y1, random_state=1)
Y = np.vstack((y1, y2)).T

forest = RandomForestClassifier(n_estimators=10, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

print(multi_target_forest.predict_proba(X))

इससे predict_probaमुझे 2 5x2 सरणियाँ मिलती हैं:

[array([[ 0.8,  0.2],
       [ 0.4,  0.6],
       [ 0.8,  0.2],
       [ 0.9,  0.1],
       [ 0.4,  0.6]]), array([[ 0.6,  0.4],
       [ 0.1,  0.9],
       [ 0.2,  0.8],
       [ 0.9,  0.1],
       [ 0.9,  0.1]])]

मैं वास्तव में मैट्रिक्स n_sampleद्वारा उम्मीद कर रहा था n_classes। मैं यह समझने के लिए संघर्ष कर रहा हूं कि यह किस तरह मौजूद वर्गों की संभावना से संबंधित है।

डॉक्स के लिए predict_probaकहता है:

आकार की सरणी = [n_samples, n_classes], या n_outputs की सूची ऐसी सरणियाँ यदि n_outputs> 1।

इनपुट नमूनों की वर्ग संभावनाएँ। कक्षाओं का क्रम विशेषता क्लासेस_ से मेल खाता है।

मैं अनुमान लगा रहा हूं कि मेरे पास विवरण में उत्तरार्द्ध है, लेकिन मैं अभी भी यह समझने के लिए संघर्ष कर रहा हूं कि यह मेरी कक्षा की संभावनाओं से कैसे संबंधित है।

इसके अलावा, जब मैं मॉडल को प्राप्त करने के लिए classes_विशेषता को एक्सेस करने का प्रयास करता forestहूं तो AttributeErrorयह विशेषता मौजूद नहीं है MultiOutputClassifier। मैं कक्षाओं को आउटपुट से कैसे संबंधित कर सकता हूं?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

जवाबों:


31

मान लें कि आपका लक्ष्य (0,1) है, तो क्लासिफायर आयाम (एन, 2) की प्रायिकता मैट्रिक्स का उत्पादन करेगा। पहला इंडेक्स संभावना को संदर्भित करता है कि डेटा कक्षा 0 से संबंधित है, और दूसरा इस संभावना को संदर्भित करता है कि डेटा कक्षा 1 से संबंधित है।

इन दोनों का योग 1 होगा।

तब आप परिणाम को निम्न द्वारा आउटपुट कर सकते हैं:

probability = model.predict_proba(X)[:,1]

यदि आपके पास k कक्षाएं हैं, तो आउटपुट होगा (N, k), आपको यह निर्दिष्ट करना होगा कि आप किस वर्ग की संभावना चाहते हैं।


2
यदि यह मामला है, तो मैं अभी भी उलझन में हूं कि प्रत्येक वर्ग के लिए दो कॉलम क्यों हैं। यदि प्रत्येक वर्ग की अपनी प्रविष्टि है, तो प्रत्येक प्रविष्टि को उस वर्ग की संभावना को दर्शाने के लिए N (N, 1) मैट्रिक्स नहीं होना चाहिए?
हरपाल

2
दो वर्गों के लिए दो कॉलम, याद रखें कि जब आप लक्ष्य (0,1) को परिभाषित कर रहे हैं, तो दो वर्ग हैं। प्रत्येक पंक्ति / डेटापॉइंट को 0 और 1. दोनों पर एक पूर्वानुमान की आवश्यकता होगी। उदाहरण के लिए datapoint1 में 0 से संबंधित होने की 80% संभावना है, और 20% 1 से संबंधित है। आउटपुट (0.8,0.2) होगा। यदि आप यू के लिए भविष्यवाणी चाहते हैं तो आपको दूसरा कॉलम प्राप्त करने के लिए प्रेडिकिटोन [:, 1] का उपयोग करने की आवश्यकता है। सामान्य पहुंच भविष्यवाणी [:, के] में यदि आप k वीं कक्षा की संभावना चाहते हैं
chrisckwong821

1
यह इस बात को नजरअंदाज करने के लिए लगता है कि यह सवाल एक बहु-आउटपुट मॉडल के बारे में है।
बेन रेनिगर जुले

2

में MultiOutputClassifier, आप दो आउटपुट को अलग-अलग वर्गीकरण कार्यों के रूप में मान रहे हैं; आपके द्वारा लिंक किए गए डॉक्स से:

इस रणनीति में प्रति लक्ष्य एक क्लासिफायर फिटिंग शामिल है।

इसलिए परिणामी सूची में दो सरणियाँ दो में से प्रत्येक को वर्गीकृत करती हैं / निर्भर चर। इसके बाद सरणियाँ बाइनरी वर्गीकरण आउटपुट (कॉलम जो कक्षा 0 की प्रायिकता, कक्षा 1 की संभावना) हैं जो @ chrisckwong821 का उल्लेख करते हैं, लेकिन प्रत्येक समस्या के लिए एक है।

दूसरे शब्दों में, वापसी का मूल्य predict_probaएक सूची होगी जिसकी लंबाई आपके मामले में y, यानी n_outputs, आपके predict_probaसंदर्भ में चौड़ाई के बराबर है । दस्तावेज़ीकरण संदर्भों से आपकी बोली n_outputs, जिसे दस्तावेज़ में प्रस्तुत किया गया है fit:

fit(self, X, y[, sample_weight])

y : (विरल) प्रकार, आकार (n_samples, n_outputs)


मैं आपकी टिप्पणी से सहमत हूं, सबसे उल्टा जवाब सवाल का जवाब नहीं देता है, यह नहीं समझाता है कि (एन, 2) आकार की एक सरणी क्यों है । आपका जवाब करता है : इस सवाल का जवाबn_outputs
लाल मटर

1
धन्यवाद, मुझे आश्चर्य हुआ कि दूसरे उत्तर को इतना वोट मिला। और संपादन के लिए धन्यवाद!
बेन रीनिगर

0

पहले प्रश्न के लिए:

पहली 5x2 सरणी आपको प्रथम श्रेणी में वर्गीकृत 5 परीक्षण नमूनों की संभावनाएं देती है। इसके अलावा, इस 5x2 सरणी का पहला कॉलम आपको बताता है "परीक्षण नमूने को प्रथम श्रेणी के रूप में वर्गीकृत नहीं किया गया है" और इस 5x2 सरणी का दूसरा स्तंभ आपको बताता है "परीक्षण नमूना को प्रथम श्रेणी के रूप में वर्गीकृत किया गया है। "।

इसी प्रकार, दूसरा 5x2 सरणी आपको दूसरी कक्षा में नमूनों के परीक्षण की वर्गीकरण संभावना देता है।

यदि आप इसे जांचना चाहते हैं, तो आप उन सरणियों में मूल्य को विपरीत परिणाम से जोड़ सकते हैं predict

कभी-कभी, वापसी predict_probaआपको एक सूची दे सकती है जिसमें Nx1 सरणियाँ और Nx2 सरणियाँ हैं। यदि ऐसा है, तो कोई भी परीक्षण डेटा उन Nx1 सरणियों में वर्गीकृत नहीं किया गया है जिनका प्रतिनिधित्व कक्षाएं हैं।

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