模型和分类器上的 GridSearch

Posted

技术标签:

【中文标题】模型和分类器上的 GridSearch【英文标题】:GridSearch on Model and Classifiers 【发布时间】:2018-10-20 16:42:09 【问题描述】:

我刚刚在此处的模型网格选择中遇到了这个示例:

https://chrisalbon.com/machine_learning/model_selection/model_selection_using_grid_search/

问题:

示例如下

# Create a pipeline
pipe = Pipeline([('classifier', RandomForestClassifier())])

# Create space of candidate learning algorithms and their hyperparameters
search_space = ['classifier': [LogisticRegression()],
                 'classifier__penalty': ['l1', 'l2'],
                 'classifier__C': np.logspace(0, 4, 10),
                'classifier': [RandomForestClassifier()],
                 'classifier__n_estimators': [10, 100, 1000],
                 'classifier__max_features': [1, 2, 3]]lassifier', RandomForestClassifier())])

据我了解,search_space 包含使用的分类器及其参数。但是,我不明白Pipeline 的目的是什么以及为什么它包含RandomForestClassifier()

背景: 在我想要的工作流程中,我需要基于 3 个不同的分类器训练一个 doc2vec 模型(gensim)。模型和分类器都应该将 GridSearch 应用于参数。我喜欢将结果存储在表格中并保存最佳模型,即准确率最高的模型。

【问题讨论】:

“为什么会在这里”是什么意思? 据我了解代码,search_space 包含使用的分类器及其参数。但是,我不明白Pipeline 的目的是什么,为什么RandomForestClassifier() 在这里?编辑了文本。 我也有同样的问题。在我看来,管道创建步骤几乎就像管道的初始化,然后在 search_space 数组中,classifier 键每次都会覆盖pipe = ... 行的RandomForestClassifier()。在过去的几天里,我一直在寻找这个问题的答案,我什至给 Chris Albon 发了消息,但还没有运气。我不确定我是否正确。 【参考方案1】:

管道用于链接顺序数据转换模型,最后是分类器/回归器。比如首先使用 TfidfVectorizer 将文本转换为数字,然后训练分类器。

pipe = Pipeline([('vectorizer',TfidfVectorizer()), 
                 ('classifier', RandomForestClassifier())])

只需要一个类,不需要Pipeline。

在您的代码中,它用作占位符,以便可以使用 'classifier' 前缀来使用参数。 classifier 本身可以从参数中替换。

【讨论】:

这是否意味着search_space 中的每个字典classifierestimator 作为GridSearchCV 的第一个参数)被字典中classifier 键的值替换?例如,LogisticRegression() 在第一种情况下。 @nvergos 是的。正确的。管道将处理分配参数的顺序。首先将分配classifier,然后分配classifier__penaltyclassifier__n_estimators

以上是关于模型和分类器上的 GridSearch的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中抽象出模型构建器上的字段创建

来自 sklearn 的 SelectFromModel 在随机森林和梯度提升分类器上提供了显着不同的特征

无法在多标签分类器上使用 Stratified-K-Fold

Forge 查看器上的 3D 标记

序列化器上的 Django Rest Framework 条件字段

在 Scikit-Learn 分类器上使用交叉验证