是否有更好的内置方法在单个管道中进行网格搜索和测试多个模型?当然,模型的参数会有所不同,这让我很难弄清楚。这是我所做的:
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_
然而,这种方法仍然是在每个分类器中给出最好的模型,而不是在分类器之间进行比较。
原文由 Aks 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 “hyperopt”库,而不是使用网格搜索来选择超参数。
请查看 本页 的第 2.2 节。在上述情况下,您可以使用
hp.choice
表达式在各种管道中进行选择,然后分别为每个管道定义参数表达式。在您的目标函数中,您需要根据所选管道进行检查并返回所选管道和参数的 CV 分数(可能通过 cross_val_score )。
执行结束时的试验对象将指示总体上最好的管道和参数。