You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GridSearchCV结合Pipeline时logisticregression参数无效问题咨询

问题:结合Pipeline与GridSearchCV处理混合类型数据时的参数错误

需求:对数值变量执行插补+标准化处理,对分类变量仅执行插补处理,通过Pipeline结合GridSearchCV实现模型调参。

编写的代码如下:

numeric_cols = X_train.select_dtypes(include=['float64', 'int']).columns.to_list()
cat_cols = X_train.select_dtypes(include=['object', 'category']).columns.to_list()

numeric_transformer = Pipeline( steps=[ ('imputer', SimpleImputer(strategy='median')),
   ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent'))])

preprocessor = ColumnTransformer( transformers=[
        ('numeric', numeric_transformer, numeric_cols),
        ('cat', categorical_transformer, cat_cols)],
        remainder='passthrough',verbose_feature_names_out = False).set_output(transform="pandas")

completo = Pipeline( steps=[("preprocessor", preprocessor), ("classifier", 
   LogisticRegression(solver='liblinear', penalty='l2', max_iter=100, class_weight='balanced'))] )

params = dict(logisticregression__C=np.logspace(-4, 16,21,  base=1.5)) 

grid_search_lr2 = GridSearchCV(completo, params, scoring='roc_auc')  

results_lr2 = grid_search_lr2.fit(X_train, y_train)

运行时出现错误:

Invalid parameter 'logisticregression' for estimator
Pipeline(steps=[('preprocessor',
ColumnTransformer(remainder='passthrough',...


解决方案

错误的核心原因是GridSearchCV的参数名与Pipeline中步骤的名称不匹配:

  • 在你的completo Pipeline里,LogisticRegression对应的步骤名称是classifier,而非logisticregression
  • GridSearchCV的参数需要遵循步骤名称__参数名的格式,因此要把logisticregression__C改为classifier__C

另外,ColumnTransformer是必须保留的,因为它是实现不同类型列差异化预处理的核心组件,不能去掉。

修正后的完整代码如下:

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

numeric_cols = X_train.select_dtypes(include=['float64', 'int']).columns.to_list()
cat_cols = X_train.select_dtypes(include=['object', 'category']).columns.to_list()

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent'))
])

preprocessor = ColumnTransformer(
    transformers=[
        ('numeric', numeric_transformer, numeric_cols),
        ('cat', categorical_transformer, cat_cols)
    ],
    remainder='passthrough',
    verbose_feature_names_out=False
).set_output(transform="pandas")

completo = Pipeline(steps=[
    ("preprocessor", preprocessor), 
    ("classifier", LogisticRegression(
        solver='liblinear', 
        penalty='l2', 
        max_iter=100, 
        class_weight='balanced'
    ))
])

# 修正参数名:classifier__C 而非 logisticregression__C
params = dict(classifier__C=np.logspace(-4, 16, 21, base=1.5)) 

grid_search_lr2 = GridSearchCV(completo, params, scoring='roc_auc')  
results_lr2 = grid_search_lr2.fit(X_train, y_train)

如果后续需要调整预处理步骤的参数(比如数值插补的策略),也需要遵循同样的命名规则,例如preprocessor__numeric__imputer__strategy。


内容的提问来源于stack exchange,提问作者skan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:40:56