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

Jac*_*yer 4 pipeline machine-learning scikit-learn hyperparameters grid-search

我第一次问这个问题时就关闭了,因为这个问题提出了类似的问题。然而,尽管答案显示了如何从管道中添加/删除步骤,但没有一个答案显示这是如何工作的,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')
Run Code Online (Sandbox Code Playgroud)

afs*_*rov 5

为此,您可以查看用户指南,其中在嵌套参数段落下说:

各个步骤也可以替换为参数,并且可以通过将非最终步骤设置为来忽略它们'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]
    }
]
Run Code Online (Sandbox Code Playgroud)

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