如何在GridSearchCV的param_grid中访问SelectFromModel内LR的max_iter参数?
解决嵌套Pipeline中GridSearchCV参数名错误问题
问题根源
你的参数路径错误,因为SelectFromModel位于嵌套Pipeline的内层:
- 外层
lr_pipe的第一个步骤被自动命名为pipeline(对应你定义的fs_pipe) - 内层
fs_pipe里的特征选择步骤是selectfrommodel SelectFromModel的估算器参数名为estimator,而非你写的logisticregression
正确的参数访问方式
修改param_grid中的特征选择部分参数名,将selectfrommodel__logisticregression__max_iter替换为pipeline__selectfrommodel__estimator__max_iter:
param_grid = { 'pipeline__selectfrommodel__estimator__max_iter': [400, 500], 'logisticregression__penalty': ['l1', 'l2'], 'logisticregression__solver': ['saga'], 'logisticregression__max_iter': [400, 500], }
验证参数名的方法
如果不确定参数名,可以通过以下代码打印所有可用参数:
print(lr_pipe.get_params().keys())
搜索包含estimator__max_iter的条目,就能找到正确的参数路径。
修改后完整代码示例
preprocessor = make_column_transformer( (num_transformer, make_column_selector(dtype_include=np.number)), (cat_transformer, make_column_selector(dtype_include=object)) ) fs_pipe = make_pipeline( preprocessor, SelectFromModel(estimator=LogisticRegression(solver='saga')) ) lr_pipe = make_pipeline(fs_pipe, LogisticRegression(n_jobs=-1)) # 修正后的参数网格 param_grid = { 'pipeline__selectfrommodel__estimator__max_iter': [400, 500], 'logisticregression__penalty': ['l1', 'l2'], 'logisticregression__solver': ['saga'], 'logisticregression__max_iter': [400, 500], } lr_grid = GridSearchCV( estimator=lr_pipe, param_grid=param_grid, verbose=1, scoring='f1_micro', error_score='raise') lr_grid.fit(trainX, trainY)
内容的提问来源于stack exchange,提问作者forest
相关产品推荐
相关产品推荐

