Scikit-learn嵌套管道双下划线参数指定失效问题排查
问题原因与解决方案
你犯了一个关键错误:GridSearchCV的第一个参数传入的是单独的clf_model(LDA分类器),而不是你构建好的full_pipeline。
当你把clf_model传给GridSearchCV时,它只会识别LDA自身的参数(比如solver),完全不知道你定义的Pipeline组件(preprocessing、model)。所以你用双下划线指定的preprocessing__xxx和model__xxx会被当成LDA的参数名,而LDA根本没有这些参数,自然抛出Invalid parameter错误。
修正后的代码
把GridSearchCV的第一个参数替换为full_pipeline即可:
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"], } # 注意这里传入的是full_pipeline,不是clf_model search = GridSearchCV(full_pipeline, param_grid, scoring="f1", return_train_score=True, cv=5, verbose=2, n_jobs=-1) search.fit(X_train, y_train)
验证逻辑
你之前用full_pipeline.get_params()列出的参数是属于整个Pipeline的,你的param_grid格式完全正确——只要GridSearchCV的estimator是Pipeline对象,它就会自动识别双下划线作为组件的分隔符,正确映射到Pipeline内部的各个子组件参数。
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

