模型和分类器上的 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
中的每个字典classifier
(estimator
作为GridSearchCV
的第一个参数)被字典中classifier
键的值替换?例如,LogisticRegression()
在第一种情况下。
@nvergos 是的。正确的。管道将处理分配参数的顺序。首先将分配classifier
,然后分配classifier__penalty
或classifier__n_estimators
。以上是关于模型和分类器上的 GridSearch的主要内容,如果未能解决你的问题,请参考以下文章
来自 sklearn 的 SelectFromModel 在随机森林和梯度提升分类器上提供了显着不同的特征
无法在多标签分类器上使用 Stratified-K-Fold