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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:27:14