python 为什么我的双下划线表示法不能在scikit-learn中使用嵌套管道?[已关闭]

xlpyo6sf  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(85)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
3小时前关闭
Improve this question
我试图构建一个包含预处理Transformer(它只是从数据中删除列)和LDA分类器的管道。我想为每一个都调整超参数,从其他帖子和文档来看,我 * 应该 * 只需要使用pipelineName__param,带双下划线,但这似乎不起作用。

pp.pprint(sorted(full_pipeline.get_params().keys()))

>>> [...] #lists all possible params for pipeline which I copied into param_grid
from sklearn.model_selection import GridSearchCV

clf_model  = LinearDiscriminantAnalysis()

full_pipeline = Pipeline([
    ('preprocessing', pp_pipeline),
    ('model', clf_model),
])
    
param_grid = {
    "preprocessing__dropper__drop_attr": [True, False],
    "model__solver": ["svd", "lsqr", "eigen"],
}

search = GridSearchCV(clf_model, param_grid, scoring="f1", return_train_score=True, cv=5, verbose=2, n_jobs=-1)
search.fit(X_train, y_train)

pp_pipeline是一个管道,包含删除列的Transformer和标准缩放器。我已经单独在X_train数据上测试过了,它可以按预期工作。
上面的代码块抛出的错误是

ValueError: Invalid parameter 'model' for estimator LinearDiscriminantAnalysis().

为什么它试图将model作为参数而不是管道名称,尽管我已经使用双下划线对其进行了适当的命名?
我尝试过将model重命名为其他名称,甚至将"model__solver"完全从param_grid中删除-如果这样做,我反而得到错误

ValueError: Invalid parameter 'preprocessing' for estimator LinearDiscriminantAnalysis().

所以我肯定漏掉了什么关键的东西

bxfogqkk

bxfogqkk1#

我认为问题在于你将模型lda传递给网格搜索,而不是你的管道。GridSearchCV的代码应该是:

search = GridSearchCV(full_pipeline, param_grid, 
scoring="f1", return_train_score=True, cv=5, verbose=2, n_jobs=-1

相关问题