अजगर - वास्तव में sklearn.pipeline.Pipeline क्या है?


118

मैं यह पता नहीं लगा सकता कि sklearn.pipeline.Pipelineवास्तव में कैसे काम करता है।

डॉक में कुछ स्पष्टीकरण हैं । उदाहरण के लिए उनका क्या मतलब है:

अंतिम अनुमानक के साथ रूपांतरों की पाइपलाइन।

मेरे प्रश्न को स्पष्ट करने के लिए, क्या हैं steps? वो कैसे काम करते है?

संपादित करें

उत्तर के लिए धन्यवाद मैं अपना प्रश्न स्पष्ट कर सकता हूं:

जब मैं पाइपलाइन और पास, कदम, दो ट्रांसफार्मर और एक अनुमानक के रूप में कहता हूं, जैसे:

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

जब मैं यह कहता हूं तो क्या होता है?

pipln.fit()
OR
pipln.fit_transform()

मैं यह अंदाजा नहीं लगा सकता कि एक अनुमानक ट्रांसफार्मर कैसे हो सकता है और ट्रांसफार्मर कैसे लगाया जा सकता है।


3
मैंने जो कुछ भी समझा है, उससे पाइपलाइन आपको सीखने की प्रक्रिया के कई चरणों को स्वचालित बनाने में मदद करता है। जैसे कि मॉडल या फीचर चयन का प्रशिक्षण और परीक्षण ... इसलिए यदि आप एक प्रतिगमन मिश्रण करना चाहते हैं, तो उदाहरण के लिए एक क्लासिफायरफायर खिलाने के लिए इसका उपयोग करें, आपके कदम उस प्रतिगमन का प्रशिक्षण और फिर वर्गीकरण का होगा। संपादित करें: विवरण जोड़ें
M0rkHaV

1
queirozf.com/entries/scikit-learn-pipeline-examples मुझे यह उपयोगी लगा
randomSampling

जवाबों:


180

स्किटिट-लर्न में ट्रांसफार्मर - कुछ वर्ग जिनके पास फिट और ट्रांसफ़ॉर्म विधि, या फ़िट_ट्रांसफॉर्म विधि है।

प्रिडिक्टर - कुछ वर्ग जिसमें फिट और भविष्यवाणी करने के तरीके, या fit_predict विधि है।

पाइपलाइन सिर्फ एक अमूर्त धारणा है, यह कुछ मौजूदा एमएल एल्गोरिथ्म नहीं है। अक्सर विधायक कार्यों में आपको अंतिम अनुमान लगाने से पहले विभिन्न परिवर्तनों के अनुक्रम का प्रदर्शन करने की आवश्यकता होती है (कच्चे सेट की केवल कुछ अच्छी विशेषताओं का चयन करके, नई सुविधाओं को उत्पन्न करना, नई सुविधाएँ उत्पन्न करना)।

यहाँ पाइपलाइन के उपयोग का एक अच्छा उदाहरण है। पाइपलाइन आपको परिवर्तन के सभी 3 चरणों और परिणामस्वरूप अनुमानक के लिए एक एकल इंटरफ़ेस देता है। यह ट्रांसफॉर्मर और भविष्यवक्ताओं को अंदर ले जाता है, और अब आप कुछ ऐसा कर सकते हैं:

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

विद जस्ट:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

पाइपलाइनों के साथ आप आसानी से इस मेटा-अनुमानक के प्रत्येक चरण के लिए मापदंडों के सेट पर ग्रिड-खोज कर सकते हैं। जैसा कि ऊपर दिए गए लिंक में बताया गया है। अंतिम चरण को छोड़कर सभी चरणों को रूपांतरित होना चाहिए, अंतिम चरण ट्रांसफार्मर या भविष्यवक्ता हो सकता है। संपादित करने का उत्तर : जब आप कॉल करते हैं pipln.fit()- पाइपलाइन के अंदर प्रत्येक ट्रांसफार्मर पिछले ट्रांसफार्मर के आउटपुट पर फिट किया जाएगा (पहला ट्रांसफार्मर कच्चे डेटासेट पर सीखा गया है)। अंतिम अनुमानक ट्रांसफार्मर या पूर्वानुमानक हो सकता है, आप पाइपलाइन पर fit_transform () को केवल तभी कॉल कर सकते हैं यदि आपका अंतिम अनुमानक ट्रांसफार्मर है (जो कि फिट_ट्रांसफॉर्म को लागू करता है, या अलग-अलग तरीके से फिट और परिवर्तित होता है), आप पाइपलाइन पर fit_predict () या पूर्वानुमान () कह सकते हैं यदि आपका अंतिम अनुमानक भविष्यवक्ता है। तो आप बस fit_transform को कॉल नहीं कर सकते या पाइपलाइन पर रूपांतरित नहीं कर सकते, जिसका अंतिम चरण पूर्वसूचक है।


1
आपका क्या मतलब है predicted = pipeline.fit(Xtrain).predict(Xtrain)?
फरहा

@farhawa, प्रशिक्षण सेट पर कक्षाओं की भविष्यवाणी करना।
इब्राहिम गनीव

4
यह अधिक वोट क्यों नहीं है? यह एक ब्लॉग पोस्ट होना चाहिए।
आर क्लावेन

1
@iamgin, अधिकांश स्किटिट-लर्न ट्रांसफ़ॉर्मर्स के इंटरफ़ेस में आवश्यक कॉलम चुनने की अनुमति नहीं है जिन्हें हम बदलना चाहते हैं। लेकिन आप अपना खुद का "आइटम चयनकर्ता" लिख सकते हैं, जो आपको केवल आवश्यक कॉलम के साथ ट्रांसफार्मर को खिलाने में मदद करेगा। यहाँ ItemSelector और FeatureUnion scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev

1
पहले उदाहरण में, क्या आप परीक्षण सेट के साथ फिर से फिटिंग से बचना चाहते हैं? क्या यह केवल fit_transform के बजाय ट्रांसफ़ॉर्मेशन कॉलिंग नहीं होना चाहिए? और इसी तरह, क्या पाइपलाइन आंतरिक रूप से फिट_ट्रांसफॉर्म या केवल ट्रांसफॉर्म की भविष्यवाणी करता है? क्या इसे नियंत्रित किया जा सकता है?
स्टीवन

18

मुझे लगता है कि M0rkHaV का सही विचार है। Scikit सीखने की पाइप लाइन वर्ग एक वस्तु में एक आकलनकर्ता के साथ-साथ कई अलग अलग ट्रांसफार्मर encapsulating के लिए एक उपयोगी उपकरण है, आप केवल एक बार (अपने महत्वपूर्ण तरीकों कॉल करनी होगी ताकि fit(), predict(), आदि)। चलो दो प्रमुख घटकों को तोड़ते हैं:

  1. ट्रांसफॉर्मर ऐसी कक्षाएं हैं जो दोनों को लागू करती हैं fit()और transform()। आप इस तरह के कुछ स्केलेर प्रीप्रोसेसिंग टूल से परिचित हो सकते हैं, जैसे TfidfVectorizerऔर Binarizer। यदि आप इन प्रीप्रोसेसिंग टूल के डॉक्स को देखते हैं, तो आप देखेंगे कि वे इन दोनों तरीकों को लागू करते हैं। जो मुझे बहुत अच्छा लगता है वह यह है कि कुछ अनुमानकों का उपयोग परिवर्तन के चरणों के रूप में भी किया जा सकता है, जैसे LinearSVC!

  2. अनुमानक ऐसी कक्षाएं हैं जो दोनों को लागू करती हैं fit()और predict()। आप पाएंगे कि कई क्लासिफायर और रिग्रेशन मॉडल इन दोनों तरीकों को लागू करते हैं, और जैसे कि आप आसानी से कई अलग-अलग मॉडलों का परीक्षण कर सकते हैं। अंतिम अनुमानक के रूप में एक और ट्रांसफार्मर का उपयोग करना संभव है (यानी, यह आवश्यक predict()रूप से लागू नहीं होता है , लेकिन निश्चित रूप से लागू होता है fit())। इसका मतलब यह है कि आप कॉल नहीं कर पाएंगे predict()

अपने संपादन के लिए: आइए एक पाठ-आधारित उदाहरण पर जाएं। लेबलबिनाइज़र का उपयोग करके, हम लेबल की एक सूची को बाइनरी मानों की सूची में बदलना चाहते हैं।

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

अब, जब कुछ डेटा पर बिनाराइज़र फिट किया जाता है, तो इसमें एक संरचना होगी, classes_जिसमें अद्वितीय कक्षाएं होती हैं जिनके बारे में ट्रांसफार्मर को पता होता है। fit()बिनलाइज़र को कॉल किए बिना कोई भी पता नहीं है कि डेटा कैसा दिखता है, इसलिए कॉल transform()करने का कोई मतलब नहीं होगा। यह सही है यदि आप डेटा को फिट करने की कोशिश करने से पहले कक्षाओं की सूची का प्रिंट आउट लेते हैं।

print bin.classes_  

इसे आज़माते समय मुझे निम्न त्रुटि मिलती है:

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

लेकिन जब आप vecसूची में द्विनेत्र फिट बैठते हैं :

bin.fit(vec)

और फिर प्रयत्न करें

print bin.classes_

मुझे निम्नलिखित मिले:

['cat' 'dog']


print bin.transform(vec)

और अब, vecऑब्जेक्ट में परिवर्तन को कॉल करने के बाद , हमें निम्नलिखित मिलते हैं:

[[0]
 [1]
 [1]
 [1]]

ट्रांसफार्मर के रूप में उपयोग किए जा रहे अनुमानकर्ताओं के लिए, आइए हम DecisionTreeक्लासिफायर को फीचर-एक्सट्रैक्टर के उदाहरण के रूप में उपयोग करें । निर्णय पेड़ बहुत सारे कारणों से महान हैं, लेकिन हमारे उद्देश्यों के लिए, यह महत्वपूर्ण है कि वे उन विशेषताओं को रैंक करने की क्षमता रखते हैं जो पेड़ भविष्यवाणी करने के लिए उपयोगी पाए गए थे। जब आप transform()एक निर्णय ट्री पर कॉल करते हैं, तो यह आपके इनपुट डेटा को ले जाएगा और यह पता लगाएगा कि यह सबसे महत्वपूर्ण विशेषताएं क्या हैं। तो आप इसके बारे में सोच सकते हैं कि अपने डेटा मैट्रिक्स (m कॉलम द्वारा n पंक्तियों) को एक छोटे मैट्रिक्स (k कॉलम द्वारा n पंक्तियों) में बदल दें, जहाँ k कॉलम सबसे महत्वपूर्ण विशेषताएं हैं जो निर्णय ट्री को मिलीं।


बीच क्या अंतर है fit()और transform()ट्रांसफॉर्मर है? , कैसे अनुमानक ट्रांसफार्मर के रूप में इस्तेमाल किया जा सकता है?
फरहवा

2
fit()वह विधि है जिसे आप अपने ट्रांसफार्मर को फिट या 'प्रशिक्षित' करने के लिए कहते हैं, जैसे आप एक क्लासिफायर या प्रतिगमन मॉडल। जैसा transform()कि, वह विधि है जिसे आप वास्तव में इनपुट डेटा को आउटपुट डेटा में बदलने के लिए कहते हैं। उदाहरण के लिए, कॉल Binarizer.transform([8,2,2])(फिटिंग के बाद!) में परिणाम हो सकता है [[1,0],[0,1],[0,1]]। ट्रांसफार्मर के रूप में अनुमानक का उपयोग करने के लिए, मैं अपने उत्तर में एक छोटा उदाहरण संपादित करूँगा।
नबार्टले

9

एमएल एल्गोरिदम आमतौर पर सारणीबद्ध डेटा को संसाधित करते हैं। आप अपने एमएल एल्गोरिथ्म से पहले और बाद में इस डेटा के प्रीप्रोसेसिंग और पोस्ट-प्रोसेसिंग करना चाह सकते हैं। एक पाइपलाइन उन डेटा प्रोसेसिंग चरणों को चेन करने का एक तरीका है।

एमएल पाइपलाइन क्या हैं और वे कैसे काम करती हैं?

एक पाइपलाइन चरणों की एक श्रृंखला है जिसमें डेटा को रूपांतरित किया जाता है। यह पुराने "पाइप एंड फिल्टर" डिज़ाइन पैटर्न से आता है (उदाहरण के लिए, आप पाइप के साथ यूनिक्स बैश कमांड के बारे में सोच सकते हैं "|" या रीडायरेक्ट ऑपरेटर्स ">")। हालांकि, पाइपलाइन कोड में ऑब्जेक्ट हैं। इस प्रकार, आपके पास प्रत्येक फ़िल्टर (उर्फ प्रत्येक पाइपलाइन चरण) के लिए एक वर्ग हो सकता है, और फिर अंतिम चरण में उन चरणों को संयोजित करने के लिए एक और वर्ग हो सकता है। कुछ पाइपलाइनें श्रृंखला में या समानांतर में अन्य पाइपलाइनों को जोड़ सकती हैं, कई इनपुट या आउटपुट होते हैं, और इसी तरह। हम मशीन लर्निंग पाइपलाइनों को देखना पसंद करते हैं:

  • पाइप और फिल्टर । पाइपलाइन के चरण डेटा की प्रक्रिया करते हैं, और वे अपनी आंतरिक स्थिति का प्रबंधन करते हैं जो डेटा से सीखा जा सकता है।
  • कम्पोजिट्स । पाइपलाइनों को नेस्टेड किया जा सकता है: उदाहरण के लिए एक पूरी पाइपलाइन को एक अन्य पाइपलाइन में एकल पाइपलाइन कदम के रूप में माना जा सकता है। एक पाइपलाइन कदम जरूरी एक पाइपलाइन नहीं है, लेकिन एक पाइप लाइन परिभाषा से कम से कम एक पाइपलाइन कदम है।
  • निर्देशित एसाइक्लिक ग्राफ (DAG) । एक पाइपलाइन चरण का आउटपुट कई अन्य चरणों में भेजा जा सकता है, और फिर परिणामी आउटपुट को पुनर्संयोजित किया जा सकता है, और इसी तरह। साइड नोट: पाइपलाइनों के चक्रीय होने के बावजूद, वे एक-एक करके कई वस्तुओं को संसाधित कर सकते हैं, और यदि उनकी स्थिति में परिवर्तन होता है (जैसे: हर बार फिट_ट्रांसफॉर्म विधि का उपयोग करना), तो उन्हें अपने राज्यों को ध्यान में रखते हुए समय के माध्यम से पुनरावृत्ति के रूप में देखा जा सकता है (जैसा सोचते हैं) एक आरएनएन)। यह एक दिलचस्प तरीका है कि उत्पादन में डालने और उन्हें अधिक डेटा पर प्रशिक्षण देने के दौरान ऑनलाइन सीखने के लिए पाइपलाइनों को देखें।

एक स्किटिट-लर्न पाइपलाइन के तरीके

पाइपलाइनों (या पाइपलाइन में कदम) में दो तरीके होने चाहिए :

  • डेटा पर सीखने और राज्य का अधिग्रहण करने के लिए " फिट " (जैसे: तंत्रिका नेटवर्क का तंत्रिका भार इस तरह के राज्य हैं)
  • " ट्रांसफॉर्म " (या "भविष्यवाणी") वास्तव में डेटा को संसाधित करने और एक भविष्यवाणी उत्पन्न करने के लिए।

इस विधि को दोनों को श्रृंखलाबद्ध करना भी संभव है:

  • " Fit_transform " फिट करने के लिए और फिर डेटा को रूपांतरित करें, लेकिन एक पास में, जो संभावित कोड अनुकूलन के लिए अनुमति देता है जब दो तरीकों को एक के बाद एक सीधे करना चाहिए।

Sklearn.pipeline.Pipeline वर्ग की समस्याएं

स्किकिट-लर्न का "पाइप एंड फिल्टर" डिज़ाइन पैटर्न बस सुंदर है। लेकिन डीप लर्निंग, ऑटोएमएल, और जटिल उत्पादन-स्तर पाइपलाइनों के लिए इसका उपयोग कैसे करें?

स्किकिट-लर्न की 2007 में पहली रिलीज़ हुई थी, जो सीखने का पूर्व युग था । हालांकि, यह सबसे अधिक ज्ञात और अपनाई गई मशीन लर्निंग लाइब्रेरी में से एक है, और अभी भी बढ़ रही है। सबसे ऊपर, यह एक सॉफ्टवेयर वास्तुशिल्प शैली के रूप में पाइप और फ़िल्टर डिज़ाइन पैटर्न का उपयोग करता है - यह वही है जो स्किकिट-लर्न को इतना शानदार बनाता है, इस तथ्य से जोड़ा जाता है कि यह उपयोग के लिए तैयार एल्गोरिदम प्रदान करता है। हालाँकि, इसके बड़े पैमाने पर मुद्दे हैं, जब यह निम्नलिखित करने की बात आती है, जिसे हमें 2020 में पहले ही करने में सक्षम होना चाहिए:

  • स्वचालित मशीन लर्निंग (AutoML),
  • दीप लर्निंग पाइपलाइन,
  • अधिक जटिल मशीन लर्निंग पाइपलाइन।

समाधान जो हमें उन स्किकिट-लर्न की समस्याओं से मिला है

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

अतिरिक्त पाइपलाइन के तरीकों और सुविधाओं को न्यूरक्सल के माध्यम से पेश किया जाता है

नोट: यदि पाइपलाइन के एक कदम के लिए फिट या रूपांतरित विधियों में से किसी एक की आवश्यकता नहीं है, तो यह गैर - योग्यमिक्सिन या नॉनट्रांसफॉर्मेबलमिक्सिन से इनहेरिट कर सकता है, ताकि उन तरीकों में से एक को कुछ भी करने के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान किया जा सके।

स्टार्टर के रूप में, पाइपलाइनों या उनके चरणों के लिए उन तरीकों को भी वैकल्पिक रूप से परिभाषित करना संभव है :

  • " सेटअप " जो अपने प्रत्येक चरण पर "सेटअप" विधि को कॉल करेगा। उदाहरण के लिए, यदि किसी चरण में TensorFlow, PyTorch, या Keras तंत्रिका नेटवर्क शामिल हैं, तो चरण अपने तंत्रिका ग्राफ़ बना सकते हैं और उन्हें फिट होने से पहले "सेटअप" विधि में GPU पर पंजीकृत कर सकते हैं। कई कारणों से चरणों के कंस्ट्रक्टरों में सीधे ग्राफ़ बनाने के लिए इसे हतोत्साहित किया जाता है, जैसे कि स्वचालित मशीन लर्निंग एल्गोरिदम के भीतर विभिन्न हाइपरपामेटरों के साथ कई बार चलने से पहले चरणों की नकल की जाती है जो आपके लिए सबसे अच्छा हाइपरपैरमीटर खोजता है।
  • " अशांति ", जो "सेटअप" विधि के विपरीत है: यह संसाधनों को साफ करता है।

निम्न विधियों में डिफ़ॉल्ट रूप से प्रदान की जाती हैं hyperparameters के प्रबंधन के लिए अनुमति देने के लिए:

  • " Get_hyperparams " आपको हाइपरपैरमीटर का एक शब्दकोश लौटाएगा। यदि आपकी पाइपलाइन में अधिक पाइपलाइन (नेस्टेड पाइपलाइन) हैं, तो हाइपरपरमेट की चाबियाँ डबल अंडरस्कोर "__" विभाजकों के साथ जंजीर हैं।
  • " Set_hyperparams " आपको नए हाइपरपरमेटर्स को उसी स्वरूप में सेट करने की अनुमति देगा जब आप उन्हें प्राप्त करेंगे।
  • " Get_hyperparams_space " आपको हाइपरपरमीटर का स्थान प्राप्त करने की अनुमति देता है, जो कि यदि आपने एक परिभाषित किया है तो खाली नहीं होगा। इसलिए, यहां "get_hyperparams" के साथ एकमात्र अंतर यह है कि आपको सटीक मान के बजाय मान के रूप में सांख्यिकीय वितरण मिलेगा। उदाहरण के लिए, परतों की संख्या के लिए एक हाइपरपैरमीटर RandInt(1, 3)जिसका अर्थ 1 से 3 परतें हो सकता है । आप .rvs()यादृच्छिक रूप से एक मूल्य चुनने के लिए इस पर कॉल कर सकते हैं और उस पर प्रशिक्षण का प्रयास करने के लिए इसे "set_hyperparams" पर भेज सकते हैं।
  • " Set_hyperparams_space " का उपयोग उसी हाइपरपरमीट वितरण वर्गों के रूप में "get_hyperparams_space" के रूप में एक नया स्थान सेट करने के लिए किया जा सकता है।

हमारे सुझाए गए समाधानों के बारे में अधिक जानकारी के लिए, ऊपर दी गई लिंक वाली बड़ी सूची में प्रविष्टियाँ पढ़ें।

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