公司动态

机器学习正则化:岭回归与Lasso回归原理、对比与实战应用

📅 2026/8/23 11:52:29
机器学习正则化:岭回归与Lasso回归原理、对比与实战应用
1. 从“过拟合”到“正则化”为什么我们需要岭回归和Lasso如果你在数学建模或者数据分析的路上已经走了一段尤其是在处理线性回归问题时大概率会遇到一个让人头疼的“老朋友”——过拟合。模型在训练集上表现堪称完美R²接近1预测值几乎和真实值重合但一到测试集或者新数据上预测效果就一落千丈变得极不稳定。这背后的核心原因往往是因为模型“学得太好”把训练数据中的噪声和偶然特征也当成了规律导致模型参数系数的绝对值变得异常大对输入数据的微小变化都反应过度。传统的普通最小二乘法OLS回归其目标只有一个最小化预测值与真实值之间的残差平方和。这个目标本身没有问题但它没有对模型复杂度施加任何约束。当特征变量之间存在多重共线性即特征之间高度相关时OLS估计会变得非常不稳定系数的方差会急剧增大甚至可能出现符号与常识相悖的情况。想象一下你用“身高”和“腿长”两个高度相关的特征去预测“体重”OLS可能会给你一个荒谬的结果身高系数为正腿长系数为负这显然不符合物理常识但数学上它确实能最小化当前训练集的误差。这时候就需要引入“正则化”的思想。它的核心思路是在损失函数中除了原有的“拟合误差”项额外增加一个对模型参数本身的“惩罚项”。这个惩罚项会约束参数的大小防止它们变得过大从而降低模型复杂度提高泛化能力。岭回归和Lasso回归就是两种最经典、应用最广泛的正则化线性回归方法。它们就像给一匹可能脱缰的野马复杂的模型套上了缰绳惩罚项让它在保持前进方向拟合数据的同时步伐更加稳健泛化能力强。简单来说岭回归在OLS的损失函数基础上加上了所有回归系数平方和L2范数的惩罚项。它会让所有系数同时收缩但不会将任何系数压缩至精确的零。它擅长处理特征共线性问题。Lasso回归在OLS的损失函数基础上加上了所有回归系数绝对值之和L1范数的惩罚项。它同样会让系数收缩但关键特性是可以将某些不重要的特征的系数直接压缩为零从而实现特征选择。所以当你面对一个特征数量较多、可能存在共线性、或者你怀疑很多特征其实无关紧要的数据集时岭回归和Lasso就不再是“可选的进阶知识”而是“必备的实用工具”。接下来我们就深入它们的原理、实现和那些只有实际用过才知道的“坑”。2. 岭回归原理、几何解释与超参数调优2.1 岭回归的数学模型与求解岭回归的损失函数定义如下$J(\beta) \sum_{i1}^{n}(y_i - \hat{y}i)^2 \lambda \sum{j1}^{p}\beta_j^2$其中$\sum_{i1}^{n}(y_i - \hat{y}_i)^2$ 是OLS原有的残差平方和RSS衡量拟合好坏。$\lambda \sum_{j1}^{p}\beta_j^2$ 就是新增的L2正则化惩罚项。$\lambda$ ($\lambda \ge 0$) 被称为正则化强度参数是模型唯一的超参数。$\beta_j$ 是第j个特征的回归系数不包括截距项 $\beta_0$通常截距不参与惩罚。我们的目标是最小化这个新的损失函数 $J(\beta)$。通过求导并令导数为零可以得到岭回归系数估计的解析解矩阵形式$\hat{\beta}^{ridge} (X^TX \lambda I)^{-1}X^Ty$这里 $X$ 是 $n \times p$ 的设计矩阵已标准化处理$y$ 是 $n \times 1$ 的响应向量$I$ 是 $p \times p$ 的单位矩阵。注意在实际计算前必须对特征进行标准化均值为0标准差为1。这是因为惩罚项对系数的平方进行惩罚如果特征量纲不同系数大小本身没有可比性惩罚就会失去公平性。例如一个以“万元”为单位的特征其系数可能天然就比以“元”为单位的特征小10000倍不加区分地惩罚显然不合理。标准化确保了所有特征处于同一尺度惩罚项才能公平地作用于所有系数。2.2 几何视角为什么岭回归能稳定系数我们可以从几何角度直观理解岭回归的作用。OLS的解是在所有可能的系数向量 $\beta$ 中找到使RSS最小的那个点。而岭回归的解则是在一个约束条件下寻找使RSS最小的点这个约束条件是所有系数的平方和小于某个常数 $t$即 $\sum \beta_j^2 \le t$。在二维系数空间 ($\beta_1, \beta_2$) 中RSS的等高线是一组椭圆而L2约束 $\beta_1^2 \beta_2^2 \le t$ 是一个圆。岭回归的解就是椭圆等高线与圆形约束区域首次相切的点。这个点有两个特点它一定在圆内因此系数的模长平方和被限制了不会像OLS解那样可能跑到很远的地方对应大系数。切点通常不在坐标轴上这意味着 $\beta_1$ 和 $\beta_2$ 一般都不会恰好为零。这就是岭回归“收缩但不归零”特性的几何体现。当特征存在多重共线性时OLS的RSS等高线会变得非常狭长其最小值点OLS解的坐标可能极不稳定轻微的数据扰动就会导致解在狭长的谷底发生巨大偏移。而岭回归的圆形约束就像给这个狭长的山谷加了一个“边界”强制解在一个更紧凑、更稳定的区域内寻找从而大大降低了估计的方差。2.3 核心超参数 $\lambda$ 的选择交叉验证与岭迹图$\lambda$ 控制着惩罚的力度$\lambda 0$岭回归退化为OLS。$\lambda \to \infty$所有系数 $\beta_j$ 被强制收缩至0模型变成只包含截距的常数模型。如何选择一个合适的 $\lambda$这是使用岭回归最关键的实操步骤。方法一K折交叉验证最推荐、最稳健这是实践中的黄金标准。其步骤如下将数据集随机分为K份通常K5或10。依次将其中一份作为验证集其余K-1份作为训练集。对于一组预设的 $\lambda$ 候选值通常在对数尺度上取如np.logspace(-3, 3, 100)在训练集上拟合岭回归模型并在验证集上计算性能指标如均方误差MSE。对每个 $\lambda$计算其K次验证误差的平均值。选择使平均验证误差最小的 $\lambda$ 作为最优超参数。在Python的scikit-learn中这个过程可以一键完成from sklearn.linear_model import RidgeCV from sklearn.preprocessing import StandardScaler import numpy as np # 假设 X, y 是你的数据 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 切记标准化 # 定义lambda在sklearn中参数名为alpha的候选范围 alphas np.logspace(-3, 3, 100) # 使用交叉验证寻找最佳alpha ridge_cv RidgeCV(alphasalphas, store_cv_valuesTrue) ridge_cv.fit(X_scaled, y) print(f最佳 alpha (lambda) 值为: {ridge_cv.alpha_}) print(f交叉验证下的最佳模型得分R²: {ridge_cv.score(X_scaled, y):.4f})方法二岭迹图分析辅助理解岭迹图描绘了每个特征的系数 $\beta_j$ 随 $\lambda$ 变化的曲线。通过观察岭迹图我们可以判断共线性如果某些特征的系数曲线变化剧烈、不稳定尤其是符号发生翻转说明它们之间存在较强的共线性。辅助选择 $\lambda$选择一个 $\lambda$使得所有系数都趋于稳定曲线变得平缓且模型的预测误差可通过交叉验证得到在一个可接受的水平。绘制岭迹图的代码示例import matplotlib.pyplot as plt from sklearn.linear_model import Ridge alphas np.logspace(-3, 3, 100) coefs [] for a in alphas: ridge Ridge(alphaa) ridge.fit(X_scaled, y) coefs.append(ridge.coef_) plt.figure(figsize(10, 6)) ax plt.gca() ax.plot(alphas, coefs) ax.set_xscale(log) ax.set_xlabel(alpha (lambda)) ax.set_ylabel(系数值) ax.set_title(岭迹图) plt.legend([f特征 {i} for i in range(X.shape[1])]) plt.show()实操心得在实际数学建模中我强烈建议将交叉验证作为主要选择依据岭迹图作为辅助诊断工具。不要仅仅因为岭迹图“看起来稳定了”就选定 $\lambda$一定要用交叉验证的误差来定量评估。有时候在系数刚开始稳定的区域模型泛化性能可能已经达到最佳继续增大 $\lambda$ 虽然系数更稳定但可能会因为偏差增大而导致预测能力下降。3. Lasso回归稀疏解与特征选择的自动化3.1 Lasso的数学模型与关键特性Lasso回归的损失函数与岭回归只有一字之差$J(\beta) \sum_{i1}^{n}(y_i - \hat{y}i)^2 \lambda \sum{j1}^{p}|\beta_j|$惩罚项从系数的平方和L2变成了绝对值之和L1。这个小小的改变带来了一个革命性的特性稀疏性。同样从几何角度理解Lasso的约束条件是 $\sum |\beta_j| \le t$这是一个菱形在二维空间是菱形高维空间是菱面体。椭圆形的RSS等高线与菱形约束区域相切时切点有很大概率正好落在菱形的角上。在角上意味着某些坐标即某些系数 $\beta_j$恰好为0。这就是Lasso能够进行特征选择的根本原因。它将不重要的、冗余的特征的系数直接压缩为零相当于从模型中剔除了这些特征得到了一个更简单、更易于解释的模型。3.2 Lasso的求解坐标下降法由于L1惩罚项在零点不可导Lasso没有像岭回归那样漂亮的解析解。其求解通常使用数值优化算法其中最经典、最高效的是坐标下降法。坐标下降法的思想很简单每次只优化一个系数 $\beta_j$固定其他所有系数不变。由于Lasso对单个系数的惩罚是绝对值函数其最优解有一个软阈值的显式形式。算法迭代地遍历所有系数直至收敛。scikit-learn中的Lasso类默认就采用坐标下降法。from sklearn.linear_model import LassoCV from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X) # 使用LassoCV进行交叉验证选择最佳alpha lasso_cv LassoCV(alphasnp.logspace(-3, 0, 100), cv5, max_iter10000) lasso_cv.fit(X_scaled, y) print(f最佳 alpha: {lasso_cv.alpha_}) print(f非零系数的数量: {np.sum(lasso_cv.coef_ ! 0)}) print(f选中的特征索引: {np.where(lasso_cv.coef_ ! 0)[0]})注意max_iter参数很重要。Lasso的求解是迭代过程对于某些 $\lambda$ 或数据可能需要更多迭代才能收敛。如果看到“ConvergenceWarning”警告适当增大max_iter即可。3.3 Lasso路径图与特征重要性分析类似于岭迹图我们可以绘制Lasso路径图它展示了每个特征的系数如何随 $\lambda$ 变化。随着 $\lambda$ 增大系数一个接一个地“坠落”到零。from sklearn.linear_model import lasso_path alphas_lasso, coefs_lasso, _ lasso_path(X_scaled, y, alphasnp.logspace(-3, 0, 100)) plt.figure(figsize(10, 6)) for i in range(coefs_lasso.shape[0]): plt.plot(alphas_lasso, coefs_lasso[i].T) plt.xscale(log) plt.xlabel(alpha (lambda)) plt.ylabel(系数值) plt.title(Lasso路径图) plt.legend([f特征 {i} for i in range(X.shape[1])]) plt.show()从路径图中你可以清晰地看到各个特征被“淘汰”的顺序这间接反映了特征的重要性。最后存活下来的特征就是Lasso认为对预测最有贡献的变量。特征选择后的处理得到Lasso模型后你可以提取出非零系数对应的特征用这些特征去训练一个标准的OLS模型或岭回归模型。这样做有时能获得更好的解释性因为最终模型的系数不再被L1惩罚所扭曲而是基于选定特征子集的无偏或低偏估计。但要注意这属于“两步法”可能会引入一些过拟合风险需要谨慎评估。4. 实战对比与选型指南何时用岭何时用Lasso理论说了这么多到底该怎么选下面我们通过一个模拟场景和实际数据处理的注意事项来厘清。4.1 模拟实验共线性场景与稀疏性场景我们构造两个模拟数据集场景A高共线性10个特征其中前5个特征由1个公共因子加上少量独立噪声生成因此彼此高度相关。响应变量y与这5个特征的真实关系都很强。场景B稀疏性50个特征但只有其中5个与y真正相关其余45个均为纯噪声。我们用OLS、岭回归CV选参、LassoCV选参分别在这两个场景下拟合并比较它们在独立测试集上的均方误差MSE和模型系数。结果分析在场景A高共线性OLS的系数估计方差极大非常不稳定测试集MSE很高。岭回归表现最好。它通过收缩系数有效降低了方差虽然引入了微小偏差但整体MSE显著降低。系数虽然变小但所有重要特征都被保留了。Lasso表现尚可但可能不如岭回归。因为它倾向于从一组高度相关的特征中随机挑选一个进入模型而将其余相关的特征系数设为零。这虽然得到了稀疏模型但可能丢失了有用信息导致偏差增大。在场景B稀疏性OLS会利用所有50个特征包括45个噪声进行拟合导致严重的过拟合测试集MSE极高。岭回归会收缩所有系数但不会将噪声特征的系数设为零模型仍然复杂过拟合缓解有限。Lasso表现最好。它能够准确地将45个噪声特征的系数压缩为零只保留5个真实相关的特征构建出一个既简洁又预测能力强的模型。4.2 选型决策流程图与经验法则基于以上分析和大量实践经验我总结出以下选型思路首要目标是否是特征选择得到可解释的简单模型是- 优先尝试Lasso。特别是在特征维度p很大甚至接近或超过样本数n时Lasso的稀疏性优势无可替代。否- 进入下一步。特征之间是否存在较强的多重共线性是且所有相关特征都可能有用- 优先使用岭回归。它能稳定估计保留所有信息。是但只需要少数代表特征- 可以尝试Lasso接受其随机选择其一的结果。否或不确定- 进入下一步。一般性建议在实际项目中最稳妥的做法是两者都试并通过交叉验证比较它们在验证集上的性能。可以使用Elastic Net它是岭回归和Lasso的折中其惩罚项是两者的线性组合$\lambda_1 \sum |\beta_j| \lambda_2 \sum \beta_j^2$。它既能像Lasso一样进行特征选择又能像岭回归一样处理共线性。当特征数量远大于样本数或者特征存在群组效应时Elastic Net往往比单纯的Lasso更稳定。from sklearn.linear_model import ElasticNetCV enet_cv ElasticNetCV(l1_ratio[.1, .5, .7, .9, .95, .99, 1], cv5, max_iter10000) enet_cv.fit(X_scaled, y) print(f最佳 l1_ratio: {enet_cv.l1_ratio_}) # 1为Lasso0为Ridge4.3 标准化与截距处理的再强调这是一个极易出错且后果严重的细节必须单独强调标准化Standardization必须在拟合岭回归或Lasso之前对特征进行标准化。StandardScaler的fit_transform用于训练集transform用于测试集。切记测试集的标准化参数均值、标准差必须来自训练集不能独立计算截距Intercept正则化惩罚项通常不包含截距 $\beta_0$。因为截距只是将预测曲线整体上下平移不影响模型的复杂度特征之间的关系。在scikit-learn中Ridge和Lasso的fit_intercept参数默认为True且惩罚项不作用于截距。如果你手动进行了标准化使得每个特征均值为0那么理论上截距应该接近y的均值。在实际中交给库函数处理即可。踩坑实录我曾在一个项目中忘记对测试集进行标准化用了测试集自身的均值和标准差导致线上预测结果完全失真。模型在训练时学习的系数是基于“训练集尺度”的特征测试集如果用了不同的尺度相当于把模型扔进了一个完全不同的“坐标系”预测结果自然毫无意义。这个错误非常隐蔽因为代码不会报错但结果会错得离谱。务必养成良好习惯scaler StandardScaler(); X_train_scaled scaler.fit_transform(X_train); X_test_scaled scaler.transform(X_test)。5. 在数学建模竞赛中的实战应用策略将岭回归和Lasso回归应用到数学建模竞赛中远不止调个包、跑个交叉验证那么简单。它涉及到问题理解、特征工程、模型融合和结果解释的全流程。5.1 特征工程阶段的协同使用在特征构造完毕后你面临的可能是一个包含数百个衍生特征的庞大特征集。直接使用它们训练模型必然过拟合。第一轮粗筛Lasso快速降维对整个特征集在标准化后运行一次Lasso回归使用交叉验证选择 $\lambda$。查看哪些特征的系数非零。这些是被Lasso初步认为“有用”的特征。目的快速将特征数量从几百个降到几十个去除大量明显无关的噪声特征。这能极大减轻后续复杂模型如集成树模型的训练负担和过拟合风险。第二轮精修结合业务逻辑与岭回归诊断对Lasso筛选后的特征子集结合你的业务知识或题目背景进行审查。有些特征可能系数很小被剔除但从机理上看很重要可以考虑加回来。对最终确定的特征集运行岭回归。观察岭迹图检查剩余特征间是否还有严重共线性。如果存在考虑使用岭回归的稳定估计。或者进一步进行特征融合如PCA主成分分析后再建模。5.2 与复杂模型的结合作为线性基模型或进行集成Stacking集成中的元特征在多层模型集成Stacking中第一层通常由多个异质模型如SVM、随机森林、XGBoost等组成。你可以将岭回归或Lasso回归作为第二层的元模型来学习如何加权组合第一层各个模型的预测结果。因为元特征第一层模型的预测值之间往往存在较强的相关性岭回归在这里能发挥很好的作用。广义线性模型的扩展正则化思想可以推广到逻辑回归L1/L2正则化逻辑回归用于分类、泊松回归等广义线性模型。在数学建模中遇到分类或计数问题时这是防止过拟合的利器。5.3 结果解释与论文写作要点在论文中阐述你使用了正则化回归时不能只说“我们使用了Lasso回归”必须清晰地交代以下内容这体现了建模的严谨性预处理“对所有连续型特征进行了标准化处理使得均值为0标准差为1以确保正则化惩罚的公平性。”模型选择理由“由于特征数量较多且可能存在冗余为获得稀疏解并增强模型可解释性我们采用了Lasso回归或为处理特征间的多重共线性我们采用了岭回归。”超参数确定方法“通过5折交叉验证在对数尺度如 $10^{-3}$ 到 $10^{3}$上搜索正则化强度参数 $\lambda$选取验证集上均方误差最小的值作为最终参数。”特征重要性特别是Lasso“最终模型保留了XX个特征其系数及方向如表X所示。其中特征A、B、C具有最大的正系数表明它们是影响目标变量的最关键正向因素。”模型评估除了在测试集上的MSE、R²还可以展示岭迹图或Lasso路径图作为附录直观证明模型系数的稳定性和特征选择过程。5.4 一个完整的建模示例片段预测类问题假设题目是“基于城市多源数据的房价预测”你构造了经济、社会、环境、区位等四大类共80个特征。# 1. 数据预处理与分割 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 关键 # 2. 第一轮Lasso特征粗筛 print(--- 阶段1: Lasso特征选择 ---) lasso_cv LassoCV(alphasnp.logspace(-3, 1, 50), cv5, max_iter20000, random_state42) lasso_cv.fit(X_train_scaled, y_train) selected_features np.where(lasso_cv.coef_ ! 0)[0] print(fLasso筛选后保留特征数: {len(selected_features)}) print(f保留特征索引: {selected_features}) # 3. 基于筛选特征训练最终模型这里以岭回归为例 print(\n--- 阶段2: 基于筛选特征的岭回归建模 ---) X_train_selected X_train_scaled[:, selected_features] X_test_selected X_test_scaled[:, selected_features] ridge_cv RidgeCV(alphasnp.logspace(-3, 3, 100), cv5) ridge_cv.fit(X_train_selected, y_train) # 4. 评估 from sklearn.metrics import mean_squared_error, r2_score y_pred_train ridge_cv.predict(X_train_selected) y_pred_test ridge_cv.predict(X_test_selected) mse_train mean_squared_error(y_train, y_pred_train) mse_test mean_squared_error(y_test, y_pred_test) r2_train r2_score(y_train, y_pred_train) r2_test r2_score(y_test, y_pred_test) print(f训练集 MSE: {mse_train:.4f}, R²: {r2_train:.4f}) print(f测试集 MSE: {mse_test:.4f}, R²: {r2_test:.4f}) print(f最佳岭回归 alpha: {ridge_cv.alpha_:.6f}) # 5. 输出关键特征及其系数用于论文分析 feature_names np.array(original_feature_names) # 假设你有特征名称列表 selected_feature_names feature_names[selected_features] coef_df pd.DataFrame({ 特征: selected_feature_names, 系数: ridge_cv.coef_ }).sort_values(by系数, keyabs, ascendingFalse) print(\n重要特征及系数按绝对值排序:) print(coef_df.head(10))通过这样一套组合拳你不仅建立了一个预测性能更稳健的模型还为论文提供了清晰的特征重要性分析极大地增强了模型的说服力和可解释性。记住在数学建模中一个能被清晰解释的“好”模型往往比一个预测精度略高但如同黑箱的“更好”的模型更能赢得评委的青睐。岭回归和Lasso回归正是帮你实现这一目标的利器。