在scikit-learn中用同一模型评估不同变量变换方案
回归模型变换方案的优雅评估方案建议
核心思路
可以利用Scikit-learn的GridSearchCV或HalvingGridSearchCV配合管道(Pipeline)来统一管理不同的变换+模型组合,自动完成训练、交叉验证与评估,比手动循环更规范高效。
具体实现步骤
1. 统一模型结构
把所有变换方案整合到Pipeline的参数网格中,避免单独定义多个模型字典,同时兼容TransformedTargetRegressor这类特殊结构。
2. 用GridSearchCV自动评估
以下是完整代码示例:
import numpy as np import pandas as pd from sklearn.preprocessing import FunctionTransformer, PowerTransformer from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV from sklearn.compose import TransformedTargetRegressor # 构建基础管道:回归器固定为LinearRegression,变换作为可配置参数 pipe = Pipeline([ ('preprocessor', 'passthrough'), # 默认无输入变换 ('regressor', LinearRegression()) ]) # 定义参数网格:包含所有待测试的变换方案 param_grid = [ # 线性模型(无输入变换) { 'preprocessor': ['passthrough'] }, # PowerTransformer输入变换 { 'preprocessor': [PowerTransformer()] }, # 对数输入变换(带逆变换保证预测值还原) { 'preprocessor': [FunctionTransformer(np.log, inverse_func=np.exp)] }, # 输入对数变换 + 目标sqrt变换(用TransformedTargetRegressor包装) { 'regressor': [TransformedTargetRegressor( regressor=Pipeline([ ('inner_prep', FunctionTransformer(np.log, inverse_func=np.exp)), ('inner_reg', LinearRegression()) ]), func=np.sqrt, inverse_func=np.square )], 'preprocessor': ['passthrough'] # 内部管道已处理输入变换,此处设为默认值 } ] # 初始化GridSearchCV,配置交叉验证与评估指标 grid_search = GridSearchCV( pipe, param_grid, cv=5, # 5折交叉验证 scoring=['r2', 'neg_mean_squared_error'], # 同时评估R2和MSE refit='r2', # 按R2指标选择最优模型 verbose=1 ) # 执行训练与搜索 grid_search.fit(x_train, y_train) # 整理并输出评估结果 results = pd.DataFrame(grid_search.cv_results_) key_cols = ['rank_test_r2', 'param_preprocessor', 'param_regressor', 'mean_test_r2', 'mean_test_neg_mean_squared_error'] print(results[key_cols].sort_values('rank_test_r2')) # 获取最优模型 best_model = grid_search.best_estimator_ print(f"最优模型结构: {best_model}")
方案优势
- 自动交叉验证:避免手动计算训练集指标的过拟合风险,CV结果更具参考性
- 统一管理:所有变换与模型组合集中在参数网格,结构清晰易维护
- 多指标并行评估:一次运行即可对比多个评估指标,无需重复训练
- 自动选优:直接输出最优模型,省去手动遍历比较的步骤
额外优化建议
- 若数据集规模较大,可替换为
HalvingGridSearchCV,大幅缩短搜索时间 - 可将目标变换也纳入参数网格,测试更多目标变换组合(如log、box-cox)
- 通过
scoring参数添加更多自定义评估指标,比如mean_absolute_error
内容的提问来源于stack exchange,提问作者p1xel
相关产品推荐
相关产品推荐

