sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?

Posted

技术标签:

【中文标题】sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?【英文标题】:Is there a way for sklearn pipeline to train with and without a step during a grid search? I can remove steps but how do i pass this to GridSearchCV? 【发布时间】:2021-08-15 22:11:28 【问题描述】:

我第一次问这个问题时就关闭了,因为this question 问了类似的问题。然而,尽管答案显示了如何从管道中添加/删除步骤,但没有一个显示这如何与GridSearchCV 一起工作,我想知道如何处理我已从中删除步骤的管道。

我想使用网格搜索来训练模型,并测试先执行 PCA 和省略 PCA 时的性能。有没有办法做到这一点?我正在寻找的不仅仅是将n_components 设置为输入变量的数量。

目前我这样定义我的管道:

pca = PCA()
gbc = GradientBoostingClassifier()
steps = [('pca', pca), ('gbc', gbc)]
pipeline = Pipeline(steps=steps)

param_grid = 
    'pca__n_components': [3, 5, 7],
    'gbc__n_estimators': [50, 100]
    

search = GridSearchCV(pipeline, param_grid, n_jobs=-1, cv=5, scoring='roc_auc')

【问题讨论】:

【参考方案1】:

为此,您可以查看user guide,它在嵌套参数段落下的说明:

个别步骤也可以作为参数替换,非最终步骤可以通过设置为'passthrough'来忽略

在您的情况下,我将定义一个包含两个字典列表的网格,一个用于使用整个管道的情况,另一个用于省略 PCA

param_grid = [
    
        'pca__n_components': [3, 5, 7],
        'gbc__n_estimators': [50, 100]
    ,
    
        'pca': ['passthrough'], # skip the PCA
        'gbc__n_estimators': [50, 100]
    
]

GridSearchCV 现在将根据列表中的每个字典跨越网格,并尝试使用和不使用 PCA 的组合。

【讨论】:

我以前没见过有人用过这个,答案比我想象的要简单得多

以上是关于sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 中使用网格搜索和管道获得正确的交叉验证分数

管道和网格搜索的 SKLearn 错误

使用管道和网格搜索执行特征选择

使用网格搜索获得最佳模型的“并行”管道

Python:没有机器学习的网格搜索?

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?