2014-04-13 7 views
17

मैं जानना चाहता था कि ग्रिड खोज करने के लिए एक बेहतर और अंतर्निहित तरीका है और एक ही पाइपलाइन में कई मॉडलों का परीक्षण करें। बेशक मॉडलों के पैरामीटर अलग होंगे, जो इसे समझने के लिए जटिल बनाते हैं। यहाँ मैं क्या किया है:एकाधिक क्लासिफायरों पर साइकिट ग्रिड खोज पाइथन

from sklearn.pipeline import Pipeline 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.svm import SVC 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.grid_search import GridSearchCV 


def grid_search(): 
    pipeline1 = Pipeline((
    ('clf', RandomForestClassifier()), 
    ('vec2', TfidfTransformer()) 
    )) 

    pipeline2 = Pipeline((
    ('clf', KNeighborsClassifier()), 
    )) 

    pipeline3 = Pipeline((
    ('clf', SVC()), 
    )) 

    pipeline4 = Pipeline((
    ('clf', MultinomialNB()), 
    )) 

    parameters1 = { 
    'clf__n_estimators': [10, 20, 30], 
    'clf__criterion': ['gini', 'entropy'], 
    'clf__max_features': [5, 10, 15], 
    'clf__max_depth': ['auto', 'log2', 'sqrt', None] 
    } 

    parameters2 = { 
    'clf__n_neighbors': [3, 7, 10], 
    'clf__weights': ['uniform', 'distance'] 
    } 

    parameters3 = { 
    'clf__C': [0.01, 0.1, 1.0], 
    'clf__kernel': ['rbf', 'poly'], 
    'clf__gamma': [0.01, 0.1, 1.0], 

    } 
    parameters4 = { 
    'clf__alpha': [0.01, 0.1, 1.0] 
    } 

    pars = [parameters1, parameters2, parameters3, parameters4] 
    pips = [pipeline1, pipeline2, pipeline3, pipeline4] 

    print "starting Gridsearch" 
    for i in range(len(pars)): 
     gs = GridSearchCV(pips[i], pars[i], verbose=2, refit=False, n_jobs=-1) 
     gs = gs.fit(X_train, y_train) 
     print "finished Gridsearch" 
     print gs.best_score_ 

हालांकि, इस पद्धति अभी भी एक वर्गीकारक के भीतर सबसे अच्छा मॉडल दे रहा है, और classifiers के बीच की तुलना नहीं।

+1

ऐसा करने का कोई स्वचालित तरीका नहीं है। –

+1

अभी तक;) [समस्या यह है कि हम पाइपलाइन के "कदम" सेट नहीं कर सकते हैं, है ना?] –

+0

@AndreasMueller; खेद है कि पहले इस पते को संबोधित नहीं किया था। क्या आप वहां विस्तार से बता सकते हैं? – Anuj

उत्तर

3

हालांकि विषय थोड़ा पुराना है, लेकिन अगर मैं भविष्य में किसी की भी मदद करता हूं तो मैं उत्तर पोस्ट कर रहा हूं।

हाइपरपेरामीटर चयन के लिए ग्रिड खोज का उपयोग करने के बजाय, आप 'hyperopt' library का उपयोग कर सकते हैं।

कृपया this page की धारा 2.2 पर एक नज़र डालें। उपर्युक्त मामले में, आप विभिन्न पाइपलाइनों में से चयन करने के लिए 'hp.choice' अभिव्यक्ति का उपयोग कर सकते हैं और फिर प्रत्येक के लिए पैरामीटर अभिव्यक्तियों को अलग-अलग परिभाषित कर सकते हैं।

अपने उद्देश्य समारोह में, आपको चुने गए पाइपलाइन के आधार पर एक चेक की आवश्यकता है और चयनित पाइपलाइन और पैरामीटर के लिए सीवी स्कोर वापस करना होगा (संभवतः cross_cal_score के माध्यम से)।

परीक्षण निष्पादन के अंत में ऑब्जेक्ट ऑब्जेक्ट, समग्र पाइपलाइन और पैरामीटर को समग्र रूप से इंगित करेगा।

9

पद Hyperparameter Grid Search across multiple models in scikit-learn एक EstimatorSelectionHelper आकलनकर्ता जो विभिन्न आकलनकर्ता मानकों के अपने खुद के ग्रिड के साथ प्रत्येक चला सकते हैं, के एक कार्यान्वयन प्रदान करता है।

+0

इस समाधान ने मेरे लिए सबसे अच्छा काम किया, मुझे केवल Python3 पर चलाने के लिए कुछ छोटे बदलाव करना पड़ा और विज्ञान के नवीनतम संस्करणों के साथ-0.1 9 सीखना, कोड यहां उपलब्ध है: http://davidsbatista.net/blog/2018/02/ 23/model_optimization / –

0

हालांकि डुबेक का समाधान अधिक सीधे आगे है, यह क्लासफायर से पहले आने वाले पाइपलाइन तत्वों के पैरामीटर के बीच बातचीत के साथ मदद नहीं करता है। इसलिए, मैंने इसे सौदा करने के लिए helper class लिखा है, और इसे विज्ञान की डिफ़ॉल्ट पाइपलाइन सेटिंग में शामिल किया जा सकता है। एक न्यूनतम उदाहरण:

from sklearn.pipeline import Pipeline 
from sklearn.model_selection import GridSearchCV 
from sklearn.preprocessing import StandardScaler, MaxAbsScaler 
from sklearn.svm import LinearSVC 
from sklearn.ensemble import RandomForestClassifier 
from sklearn import datasets 
from pipelinehelper import PipelineHelper 

iris = datasets.load_iris() 
X_iris = iris.data 
y_iris = iris.target 
pipe = Pipeline([ 
    ('scaler', PipelineHelper([ 
     ('std', StandardScaler()), 
     ('max', MaxAbsScaler()), 
    ])), 
    ('classifier', PipelineHelper([ 
     ('svm', LinearSVC()), 
     ('rf', RandomForestClassifier()), 
    ])), 
]) 

params = { 
    'scaler__selected_model': pipe.named_steps['scaler'].generate({ 
     'std__with_mean': [True, False], 
     'std__with_std': [True, False], 
     'max__copy': [True], # just for displaying 
    }), 
    'classifier__selected_model': pipe.named_steps['classifier'].generate({ 
     'svm__C': [0.1, 1.0], 
     'rf__n_estimators': [100, 20], 
    }) 
} 
grid = GridSearchCV(pipe, params, scoring='accuracy', verbose=1) 
grid.fit(X_iris, y_iris) 
print(grid.best_params_) 
print(grid.best_score_) 

इसका उपयोग पाइपलाइन के अन्य तत्वों के लिए भी किया जा सकता है, न केवल वर्गीकृत। कोड github पर है यदि कोई इसे देखना चाहता है।

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