小编典典

scikit网格搜索多个分类器

python

我想知道是否有更好的内置方法来进行网格搜索并在单个管道中测试多个模型。当然,模型的参数会有所不同,这使我很难弄清楚。这是我所做的:

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_

但是,此方法仍在每个分类器中提供最佳模型,并且未在分类器之间进行比较。


阅读 218

收藏
2021-01-20

共1个答案

小编典典

可以使用‘hyperopt’库,而不是使用Grid
Search进行超参数选择。

请查看此页面的2.2节。在上述情况下,可以使用hp.choice表达式在各种管道中进行选择,然后分别为每个管道定义参数表达式。

在目标函数中,您需要根据所选管道进行检查,并返回所选管道和参数的CV分数(可能通过cross_cal_score)。

执行结束时的试验对象将指示总体上最佳的管道和参数。

2021-01-20