文章目录
- 一、核心规则(必须记住)
- 二、最简可运行完整代码
- 三、详细拆解:每一步怎么写?
- 1. 先给 Pipeline 步骤起名
- 2. 搜索参数必须用:步骤名__参数
- 3. 传入 GridSearchCV
- 四、超常用模板(直接复制)
- 模板1:分类任务(标准化 + 逻辑回归)
- 模板2:带特征选择的 Pipeline(进阶)
- 五、最容易犯的 3 个错误(避坑)
- 错误1:只写一个下划线
- 错误2:步骤名写错
- 错误3:对树模型做不必要的标准化
一、核心规则(必须记住)
在 Pipeline + GridSearchCV 中,参数名写法固定:
步骤名称__参数名称- 中间是两个英文下划线
__ - 前面是你定义 Pipeline 时起的名字
- 后面是模型/预处理类的参数
只要写对参数名,剩下和普通 GridSearch 完全一样!
二、最简可运行完整代码
# 1. 导入库fromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportStandardScalerfromsklearn.ensembleimportRandomForestClassifierfromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn.datasetsimportload_iris# 2. 数据准备X,y=load_iris(return_X_y=True)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# ==================== 3. 构建流水线 ====================pipe=Pipeline([("scaler",StandardScaler()),# 步骤名:scaler("rf",RandomForestClassifier())# 步骤名:rf])# ==================== 4. 定义搜索参数(最关键) ====================param_grid={# scaler 步骤:是否开启均值平移"scaler__with_mean":[True,False],# rf 步骤:决策树数量 & 最大深度"rf__n_estimators":[50,100,200],"rf__max_depth":[3,5,None]}# ==================== 5. 网格搜索(自带交叉验证) ====================grid=GridSearchCV(estimator=pipe,# 传入整个 Pipelineparam_grid=param_grid,cv=5,# 5折交叉验证n_jobs=-1,# 全速CPUverbose=1# 打印进度)# 训练grid.fit(X_train,y_train)# ==================== 6. 输出最优结果 ====================print("最优参数组合:",grid.best_params_)print("最优交叉验证得分:",round(grid.best_score_,3))# 最优模型直接预测best_model=grid.best_estimator_print("测试集得分:",round(best_model.score(X_test,y_test),3))运行结果示例:
最优参数组合:{'scaler__with_mean': True, 'rf__max_depth': 5, 'rf__n_estimators': 100} 最优交叉验证得分:0.967 测试集得分:0.967三、详细拆解:每一步怎么写?
1. 先给 Pipeline 步骤起名
pipe=Pipeline([("步骤A",预处理1),("步骤B",预处理2),("模型",算法)])2. 搜索参数必须用:步骤名__参数
例如:
- StandardScaler 的
with_mean
→scaler__with_mean - RandomForest 的
n_estimators
→rf__n_estimators - SVC 的
C
→svc__C
3. 传入 GridSearchCV
grid=GridSearchCV(pipe,param_grid,cv=5)grid.fit(X_train,y_train)四、超常用模板(直接复制)
模板1:分类任务(标准化 + 逻辑回归)
fromsklearn.linear_modelimportLogisticRegression pipe=Pipeline([("scaler",StandardScaler()),("lr",LogisticRegression())])param_grid={"scaler__with_std":[True,False],"lr__C":[0.1,1,10],"lr__max_iter":[100,200]}grid=GridSearchCV(pipe,param_grid,cv=5)模板2:带特征选择的 Pipeline(进阶)
fromsklearn.feature_selectionimportSelectKBest pipe=Pipeline([("scaler",StandardScaler()),("select",SelectKBest()),# 特征选择("rf",RandomForestClassifier())])param_grid={"select__k":[3,5,8],# 选3/5/8个特征"rf__max_depth":[3,5,7]}五、最容易犯的 3 个错误(避坑)
错误1:只写一个下划线
# 错误"rf_n_estimators"# 正确"rf__n_estimators"错误2:步骤名写错
必须和 Pipeline 里的名字完全一致。
错误3:对树模型做不必要的标准化
随机森林、XGBoost不需要标准化,可以直接去掉 scaler。