我想知道是否有更好的内置方法来进行网格搜索并在单个管道中测试多个模型。当然,模型的参数会有所不同,这使我很难弄清楚。这是我所做的:
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_
但是,此方法仍在每个分类器中提供最佳模型,并且未在分类器之间进行比较。
可以使用‘hyperopt’库,而不是使用Grid Search进行超参数选择。
请查看此页面的2.2节。在上述情况下,可以使用hp.choice表达式在各种管道中进行选择,然后分别为每个管道定义参数表达式。
hp.choice
在目标函数中,您需要根据所选管道进行检查,并返回所选管道和参数的CV分数(可能通过cross_cal_score)。
执行结束时的试验对象将指示总体上最佳的管道和参数。