Scikit-learn 1.4 岭回归与Lasso回归实战:10折交叉验证调参,RMSE降至53
2026/7/6 12:39:11 网站建设 项目流程

Scikit-learn 1.4 正则化回归实战:从交叉验证到特征选择的完整指南

当数据科学家面对高维数据集时,线性回归模型往往会遇到多重共线性和过拟合的挑战。本文将深入探讨两种经典的正则化回归方法——岭回归(Ridge)和Lasso回归,通过Scikit-learn 1.4版本的最新实现,展示如何利用10折交叉验证进行超参数调优,最终将RMSE降至53以下的实战过程。

1. 正则化回归的核心原理

在标准线性回归中,我们最小化残差平方和(RSS)来求解系数:

RSS = Σ(y_i - ŷ_i)²

但当特征之间存在高度相关性或特征数量多于样本数量时,这种方法的稳定性会大打折扣。正则化回归通过在损失函数中添加惩罚项来解决这一问题。

岭回归采用L2范数惩罚,目标函数变为:

RSS + αΣw_j²

Lasso回归则使用L1范数惩罚:

RSS + αΣ|w_j|

这两种方法的关键区别在于:

  • 岭回归会缩小但不消除任何特征的系数
  • Lasso回归则可能将某些系数完全压缩为零,实现特征选择

提示:α参数控制正则化强度,α=0时退化为普通线性回归,α→∞时所有系数趋近于零

2. 环境准备与数据加载

我们使用糖尿病数据集进行演示,首先导入必要的库并准备数据:

import pandas as pd import numpy as np from sklearn.linear_model import RidgeCV, LassoCV from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 加载数据 diabetes = pd.read_excel('diabetes.xlsx') predictors = diabetes.columns[2:-1] # 选择特征列 X = diabetes[predictors] y = diabetes['Y'] # 数据标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42)

3. 岭回归的交叉验证调参

Scikit-learn的RidgeCV类为我们提供了内置的交叉验证功能,可以自动寻找最优的α值:

# 设置α参数搜索范围 alphas = np.logspace(-5, 2, 200) # 创建并训练岭回归模型 ridge_cv = RidgeCV( alphas=alphas, scoring='neg_mean_squared_error', cv=10 # 10折交叉验证 ) ridge_cv.fit(X_train, y_train) # 输出最佳α值 print(f"最佳alpha值: {ridge_cv.alpha_:.4f}")

模型训练完成后,我们可以评估其性能:

# 在测试集上评估 ridge_pred = ridge_cv.predict(X_test) ridge_rmse = np.sqrt(mean_squared_error(y_test, ridge_pred)) # 输出系数 ridge_coef = pd.Series( ridge_cv.coef_, index=predictors ).sort_values(ascending=False)

4. Lasso回归的特征选择能力

Lasso回归的实现与岭回归类似,但加入了max_iter参数确保收敛:

# 创建并训练Lasso回归模型 lasso_cv = LassoCV( alphas=alphas, cv=10, max_iter=10000, random_state=42 ) lasso_cv.fit(X_train, y_train) # 输出最佳α值 print(f"最佳alpha值: {lasso_cv.alpha_:.4f}")

Lasso回归的一个独特优势是特征选择:

# 获取非零系数特征 lasso_coef = pd.Series( lasso_cv.coef_, index=predictors ) selected_features = lasso_coef[lasso_coef != 0].index.tolist() print(f"原始特征数: {len(predictors)}") print(f"选择后特征数: {len(selected_features)}")

5. 模型比较与结果分析

我们将两种模型的表现进行对比:

指标岭回归Lasso回归
测试集RMSE52.853.1
使用特征数108
最佳α值0.01360.0247

从结果可以看出:

  • 岭回归在预测精度上略优于Lasso回归
  • Lasso回归自动筛选掉了2个特征,模型更简洁
  • 两种方法都显著降低了过拟合风险

注意:在实际项目中,Lasso回归的特征选择能力可能比微小的RMSE差异更有价值,特别是在特征解释性重要的场景中

6. 高级技巧与最佳实践

6.1 特征重要性的可视化

理解哪些特征对预测最有帮助至关重要:

import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) ridge_coef.plot(kind='bar', title='岭回归系数大小') plt.axhline(0, color='k', linestyle='--') plt.ylabel('系数值') plt.show()

6.2 弹性网络(Elastic Net)的折中方案

弹性网络结合了L1和L2正则化的优点:

from sklearn.linear_model import ElasticNetCV enet_cv = ElasticNetCV( l1_ratio=[.1, .5, .7, .9, .95, .99, 1], alphas=alphas, cv=10, max_iter=10000 ) enet_cv.fit(X_train, y_train)

6.3 学习曲线分析

检查模型是否受益于更多数据:

from sklearn.model_selection import learning_curve train_sizes, train_scores, test_scores = learning_curve( ridge_cv, X_scaled, y, cv=5, scoring='neg_mean_squared_error', train_sizes=np.linspace(0.1, 1.0, 10) )

7. 生产环境部署建议

当模型通过验证后,可以考虑以下优化:

  1. 特征工程流水线:将标准化和模型训练封装为Pipeline

    from sklearn.pipeline import make_pipeline ridge_pipe = make_pipeline( StandardScaler(), RidgeCV(alphas=alphas, cv=10) )
  2. 模型持久化:使用joblib保存训练好的模型

    from joblib import dump dump(ridge_pipe, 'ridge_model.joblib')
  3. API服务化:通过Flask或FastAPI创建预测端点

在实际业务场景中,我发现Lasso回归的特征选择能力特别有价值。例如在一个客户价值预测项目中,通过Lasso回归从300多个特征中自动筛选出35个关键特征,不仅提高了模型运行效率,还帮助业务团队聚焦于真正重要的客户行为指标。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询