5

sklearn.pipeline.Pipeline ऑब्जेक्ट में कोई चरण हटाना या डालना संभव है?साइस्किट में एक चरण डालें या हटाएं- पाइपलाइन

मैं पाइपलाइन ऑब्जेक्ट में एक चरण के साथ या बिना ग्रिड खोज करने की कोशिश कर रहा हूं। और सोच रहा हूं कि क्या मैं पाइपलाइन में एक कदम डाल या हटा सकता हूं। मैंने Pipeline स्रोत कोड में देखा, self.steps ऑब्जेक्ट है जो सभी चरणों को पकड़ता है। हम named_steps() द्वारा कदम प्राप्त कर सकते हैं। इसे संशोधित करने से पहले, मैं यह सुनिश्चित करना चाहता हूं, मुझे अप्रत्याशित प्रभाव नहीं पड़ता है।

from sklearn.pipeline import Pipeline 
from sklearn.svm import SVC 
from sklearn.decomposition import PCA 
estimators = [('reduce_dim', PCA()), ('svm', SVC())] 
clf = Pipeline(estimators) 
clf 

क्या यह संभव है कि हम steps = clf.named_steps() की तरह कुछ करते हैं, तो डालने या इस सूची में हटा दें:

यहाँ एक उदाहरण कोड है? क्या यह क्लैफ़ ऑब्जेक्ट पर अवांछित प्रभाव का कारण बनता है?

उत्तर

1

हां, यह संभव है, लेकिन आपको उसी आवश्यकता को पूरा करना होगा जो पाइपलाइन को प्रारंभिक रूप से आवश्यक है, यानी आप अंतिम रूप से किसी भी चरण में भविष्यवाणियों को सम्मिलित नहीं कर सकते हैं, आपको Pipeline.steps को अपडेट करने के बाद fit पर कॉल करना चाहिए, क्योंकि इस तरह के अपडेट के बाद सभी चरणों (हो सकता है कि वे पिछले fit कॉल में सीखे गए हों) को अमान्य कर दिया जाएगा, पाइपलाइन के अंतिम चरण को हमेशा fit विधि लागू करना चाहिए, सभी पिछले चरणों को fit_transform लागू करना चाहिए।

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

+0

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

2

अल्पविकसित परीक्षण के आधार पर आप सुरक्षित रूप से ठीक वैसे ही जैसे एक scikit सीखने पाइप लाइन से एक कदम निकाल सकते हैं किसी भी सूची आइटम, एक सरल

clf_pipeline.steps.pop(n) 

जहां n व्यक्ति आकलनकर्ता की स्थिति में आप कोशिश कर रहे हैं के साथ हटाना।

+0

आपके उत्तर के लिए धन्यवाद। क्या आप "प्राथमिक परीक्षण के आधार पर" विस्तार कर सकते हैं? – Bin

+1

मेरे पास समान वेक्टरेशन चरणों के साथ लगभग 500 पूर्व-प्रशिक्षित पाइपलाइन हैं। मैंने इन पाइपलाइनों में से किसी एक के वेक्टरेशन चरण का उपयोग करके आने वाले डेटा को बदल दिया, फिर प्री-वेक्टरीकृत डेटा पर प्रत्येक पाइपलाइन की predict_proba विधि चलाने से पहले सभी पाइपलाइनों से इस चरण को हटा दिया। परिणामस्वरूप स्कोर समान थे जैसे कि मैंने पूर्व-वेक्टरिंग के बिना कच्चे डेटा पर प्रत्येक अनमोडिफाइड पाइपलाइन चलायी थी, और कुल रनटाइम में सुधार हुआ था क्योंकि मैं समान वेक्टरेशन चरण को और अधिक नहीं कर रहा था। ध्यान दें कि यह केवल हैशिंग वेक्टरिज़र जैसे स्टेटलेस ट्रांसफार्मर के साथ काम करता है। – labelmaker

2

मुझे लगता है कि हर किसी ने केवल हटाए गए कदम का उल्लेख किया है। तो आप भी एक विशिष्ट स्थान में एक आइटम सम्मिलित कर सकते हैं,

सूची के रूप में एक ही तरीके से
pipe.steps.append(['step name',transformer()]) 

pipe.steps काम करता है:: मामले में आप भी पाइप लाइन में एक कदम सम्मिलित करना चाहते हैं

pipe.steps.insert(1,['estimator',transformer()]) #insert as second step 
0

हम विकसित पाइपग्राफ, वर्कफ़्लो जैसे अधिक जटिल ग्राफ बनाने के लिए पाइपलाइन का विस्तार। ग्रिड खोज के दौरान वर्कफ़्लो के कनेक्शन को बदलना संभव बनाता है (https://mcasl.github.io/PipeGraph/ पर उदाहरण गैलरी देखें)।

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