"ट्रेन_टैस्ट_प्लिट" विधि से पैरामीटर "स्तरीकृत" (डरावना सीखें)


96

मैं train_test_splitपैकेज स्किकिट लर्न से उपयोग करने की कोशिश कर रहा हूं , लेकिन मुझे पैरामीटर के साथ परेशानी हो रही है stratify। इसके बाद कोड है:

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

हालाँकि, मुझे निम्न समस्या हो रही है:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

क्या किसी को अंदाजा है कि क्या चल रहा है? नीचे फ़ंक्शन प्रलेखन है।

[...]

स्तरीकरण : सरणी-जैसा या कोई नहीं (डिफ़ॉल्ट कोई नहीं है)

यदि कोई नहीं है, तो डेटा एक स्तरीकृत फैशन में विभाजित है, इसका उपयोग लेबल सरणी के रूप में किया जाता है।

संस्करण 0.17 में नया: विभाजन को विभाजित करें

[...]


नहीं, सब हल।
डैनियल ओलिवॉ

जवाबों:


62

स्किकिट-लर्न सिर्फ आपको बता रहा है कि यह "स्तरीकृत" तर्क को नहीं पहचानता है, न कि आप इसे गलत तरीके से उपयोग कर रहे हैं। ऐसा इसलिए है क्योंकि पैरामीटर को 0.17 संस्करण में जोड़ा गया था जैसा कि आपके द्वारा उद्धृत प्रलेखन में दर्शाया गया है।

तो आपको बस Scikit-Learn को अपडेट करना होगा।


मुझे वही त्रुटि मिल रही है, हालांकि मेरे पास scikit-learn का संस्करण 0.21.2 है। scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
करीम जिरौदी

338

यह stratifyपैरामीटर एक विभाजन बनाता है ताकि उत्पादित नमूने में मूल्यों का अनुपात पैरामीटर को प्रदान किए गए मूल्यों के अनुपात के समान हो stratify

उदाहरण के लिए, यदि चर yमूल्यों के साथ एक द्विआधारी स्पष्ट चर रहा है 0और 1और शून्य का 25% और लोगों के 75% देखते हैं, stratify=yसुनिश्चित करें कि आपके यादृच्छिक विभाजन का 25% है कर देगा 0की और से 75% 1की।


124
यह वास्तव में इस सवाल का जवाब नहीं देता है लेकिन यह कैसे काम करता है यह समझने के लिए सुपर उपयोगी है। अनेक अनेक धन्यवाद।
रीड जेनेन

6
मैं अभी भी यह समझने के लिए संघर्ष कर रहा हूं कि यह स्तरीकरण क्यों आवश्यक है: यदि डेटा में क्लास-इन-बैलेंस है, तो क्या यह डेटा का यादृच्छिक विभाजन करते समय औसत रूप से संरक्षित नहीं किया जाएगा?
Holger Brandl

15
@ होल्गरब्रांडल इसे औसत पर संरक्षित किया जाएगा; स्तरीकरण के साथ, यह सुनिश्चित करने के लिए संरक्षित किया जाएगा।
योनातन

7
@HolgerBrandl बहुत छोटे या बहुत असंतुलित डेटा सेट के साथ, यह बहुत संभव है कि यादृच्छिक विभाजन पूरी तरह से विभाजन के एक वर्ग को खत्म कर सकता है।
cddt

1
@HolgerBrandl अच्छा सवाल! शायद हम इसे पहले जोड़ सकते हैं, आपको प्रशिक्षण और परीक्षण सेट का उपयोग करके विभाजित करना होगा stratify। फिर दूसरा, असंतुलन को ठीक करने के लिए आपको अंततः प्रशिक्षण सेट पर ओवरसैंपलिंग या अंडरस्मीपलिंग चलाने की आवश्यकता होती है। कई स्केलेर क्लासिफायर में क्लास-वेट नामक एक पैरामीटर होता है जिसे आप संतुलित कर सकते हैं। अंत में आप असंतुलित डेटासेट के लिए सटीकता से अधिक उपयुक्त मीट्रिक भी ले सकते हैं। कोशिश करें, ROC के तहत F1 या क्षेत्र।
क्लाड कॉम्बो

64

मेरे भविष्य के लिए जो Google के माध्यम से यहां आता है:

train_test_splitअब में है model_selection, इसलिए:

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

इसका उपयोग करने का तरीका है। random_stateप्रतिलिपि प्रस्तुत करने योग्यता के लिए वांछित सेट करना ।


यह उत्तर होना चाहिए :) धन्यवाद
स्विमबाइकर

16

इस संदर्भ में, स्तरीकरण का अर्थ है कि train_test_split विधि प्रशिक्षण और परीक्षण उपशीट लौटाती है जिसमें इनपुट डेटासेट के रूप में वर्ग लेबल के समान अनुपात होते हैं।


3

इस कोड को चलाने का प्रयास करें, यह "बस काम करता है":

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])

@ user5767535 जैसा कि आप देख सकते हैं कि यह मेरे Ubuntu मशीन पर काम कर रहा है, sklearn'0.17' संस्करण के साथ, पायथन 3,5 के लिए एनाकोंडा वितरण। यदि आप कोड को सही ढंग से दर्ज करते हैं और अपने सॉफ़्टवेयर को अपडेट करते हैं तो मैं केवल एक बार और चेक करने का सुझाव दे सकता हूं।
सर्गेई बुशमैनोव

2
@ user5767535 BTW, "संस्करण 0.17 में नया: स्तरीकरण विभाजन" मुझे लगभग निश्चित करता है कि आपको अपना अपडेट करना होगा sklearn...
सर्गेई बुशमैनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.