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

scikit-learn中超参数调优与模型评估的正确实践及代码咨询

超参数调优与模型评估的正确流程及代码优化建议

核心问题解答

1. 超参数调优的数据集选择

绝对不能用全数据集做超参数调优,必须仅在训练集上进行。你的当前流程会导致严重的数据泄露:超参数选择过程中用到了测试集的信息,最终评估结果会过于乐观,无法反映模型在真实未知数据上的性能。

2. 当前代码的关键问题

  • 超参数调优阶段直接拟合全量数据X,y,测试集信息被泄露给了超参数选择过程
  • 评估阶段存在代码bug:y_pred = model.predict(X_test)调用的是之前用全数据训练的管道,而非基于训练集重新训练的ElasticNet管道,导致评估结果完全不可信

3. 8万条150列数据运行18分钟是否合理?

合理。ElasticNetCV会遍历你指定的l1_ratio(11个值)和alphas(11个值),共121种参数组合,默认5折交叉验证的话,总训练次数是121*5=605次。加上预处理(独热编码、标准化)的开销,18分钟属于正常范围,尤其是在CPU性能一般的情况下。


正确操作流程

  1. 先分割训练集与测试集:测试集必须全程隔离,仅用于最终模型评估,不能参与任何预处理、超参数调优或模型训练步骤
  2. 在训练集内完成超参数调优:使用交叉验证(如ElasticNetCV)在训练集上筛选最优超参数,确保调参过程完全看不到测试集数据
  3. 用最优参数训练最终模型:基于整个训练集(含交叉验证的所有折)训练模型
  4. 用测试集评估模型性能:这一步得到的结果才是模型泛化能力的真实反映

优化后的代码示例

步骤1:分割数据集

from sklearn.model_selection import train_test_split

# 先分割训练集和测试集,测试集锁死
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=818)

步骤2:在训练集上做超参数调优

import numpy as np
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import ElasticNetCV
from sklearn.pipeline import make_pipeline

# 定义特征类型与预处理流程
numeric_features = X_train.select_dtypes(include=['int', 'float']).columns
categorical_features = X_train.select_dtypes(include=['object', 'category']).columns

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
    ]
)

# 仅在训练集上运行ElasticNetCV调参
en_cv = ElasticNetCV(
    l1_ratio=np.arange(0, 1.1, 0.1),
    alphas=np.arange(0.01, 1.1, 0.1),  # 去掉alpha=0,避免无正则化的线性回归
    random_state=818,
    n_jobs=-1,
    cv=5  # 可根据需求调整折数,折数越少速度越快
)

tuning_pipeline = make_pipeline(preprocessor, en_cv)
tuning_pipeline.fit(X_train, y_train)

# 获取最优超参数
best_alpha = en_cv.alpha_
best_l1_ratio = en_cv.l1_ratio_

步骤3:训练最终模型并评估

from sklearn.linear_model import ElasticNet
from sklearn.metrics import r2_score, mean_squared_error

# 用最优参数构建最终模型
final_pipeline = make_pipeline(
    preprocessor,
    ElasticNet(alpha=best_alpha, l1_ratio=best_l1_ratio, random_state=818)
)

# 在整个训练集上训练模型
final_pipeline.fit(X_train, y_train)

# 用测试集评估
y_pred = final_pipeline.predict(X_test)
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)

print(f"测试集R²: {r2:.4f}, MSE: {mse:.4f}")

额外优化建议

  • 调整超参数搜索范围:用对数间距生成alphas(如np.logspace(-4, 1, 10)),比线性间距更贴合正则化参数的有效范围,能减少无效搜索,提升速度
  • 减少交叉验证折数:如果对调参稳定性要求不高,可将cv设为3,能大幅减少训练时间
  • 提前特征选择:150列特征中可能存在冗余,可先做特征筛选(如方差过滤、互信息筛选),减少特征维度后再调参,能显著提升运行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:58:21