当前位置: 首页 > 面试题库 >

scikit网格搜索多个分类器

宫俊远
2023-03-14
问题内容

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

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表达式在各种管道中进行选择,然后分别为每个管道定义参数表达式。

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

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



 类似资料:
  • 1)在我读过的大多数机器学习入门页面中,似乎都在说你需要一个训练集、一个验证集和一个测试集。根据我的理解,交叉验证允许你结合训练和验证集来训练模型,然后你应该在测试集上测试它以得到一个分数。然而,我在论文中看到,在很多情况下,您可以在整个数据集上交叉验证,然后报告CV得分作为准确性。我知道在一个理想的世界里,你会想要在不同的数据上进行测试,但如果这是合法的,我想要在我的整个数据集上交叉验证并报告那

  • 网格搜索 这里的网格指的是不同参数不同取值交叉后形成的一个多维网格空间。比如参数a可以取1、2,参数b可以取3、4,参数c可以取5、6,那么形成的多维网格空间就是: 1、3、5 1、3、6 1、4、5 1、4、6 2、3、5 2、3、6 2、4、5 2、4、6 一共2*2*2=8种情况 网格搜索就是遍历这8种情况进行模型训练和验证,最终选择出效果最优的参数组合 用法举例 # coding:ut

  • 问题内容: 我需要能够使用一个简单的搜索来搜索数据库的SQL查询。这是我的表格现在的样子: 我将如何去做呢?这是我尝试过的一些SQL查询,但是我的问题是它返回了大量数据。例如,如果我搜索像Snoop Dogg这样的艺术家,即使没有专辑名称,它也会为他所拥有的每张专辑和每首歌曲返回一行。 编辑: 这是一个示例数据库; 因此,我想搜索“ snoop”以仅返回艺术家“ Snoop Dogg”。但随后进行

  • 现在,下面的查询在一列上运行良好,并使用空格作为搜索分隔符,但它只搜索一列。 =查询(数据!A1:O,“选择*其中较低(N)与较低(“%”) 然而,我找到了这个片段,它搜索了整个工作表,但不能在单元格中分离单词。 =ARRAY_constraint(IFERROR(查询({Data!A:O,TRANSPOSE(查询(TRANSPOSE(Data!A:O)),99^99)),“其中lower(Col

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 问题内容: 我第一次使用Postgresql,并且试图在我的网站中创建一个搜索引擎。我有这张桌子: 然后我为表的每个字段创建了一个索引(这是正确的方法吗?或者我可以为所有字段创建一个索引?): 现在,如果我想在每个索引中搜索一个单词,SQL查询是什么? 我尝试了这个,它的工作原理: 是否存在更好的方法来做到这一点?我可以搜索多个吗?我的一个朋友提出了一个解决方案,但这是针对MySQL数据库的: P