机器学习之正则化(Regularization)学习笔记


一、核心概念:正则化到底是什么?

1. 定义

正则化是在模型训练过程中,通过在损失函数中加入额外的惩罚项,限制模型参数规模、降低模型复杂度,从而防止过拟合、提升泛化能力的技术

2. 核心目标拆解

  • 短期目标:让模型在训练数据上 “学好知识”,同时避免死记硬背噪声和异常值。
  • 长期目标:让模型在从未见过的测试数据上也能保持稳定的预测效果,即提升泛化能力

3. 通俗理解

可以把模型训练比作学生备考:

  • 原损失项:学生刷题(拟合训练数据),目标是把题目做对。
  • 正则化项:老师给学生划重点(限制学习范围),不让学生死记硬背题目答案,而是掌握通用解题方法,避免 “原题满分、新题翻车”。

二、核心公式拆解(面试必背)

1. 通用正则化损失函数(以 L2 为例)

( Loss = \underbrace{\frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2}{\text{原损失项:拟合数据}} + \underbrace{\lambda \sum{i=1}^k \theta_i^2}_{\text{正则化项:惩罚复杂}} )

2. 两部分关键作用

组成部分核心作用直观理解
原损失项衡量模型预测值与真实值的偏差,驱动模型学习数据规律学生刷题,追求正确率
正则化项惩罚过大的参数,限制模型复杂度老师划重点,防止死记硬背

3. 超参数 (\lambda) 的影响(面试高频)

(\lambda) 是正则化强度的控制开关,直接决定模型的复杂度:

  • (\lambda = 0):无正则化,损失函数退化为原始形式,模型容易过拟合。
  • (\lambda) 较小:正则化强度弱,参数惩罚力度小,模型复杂度接近原始状态,仍可能过拟合。
  • (\lambda) 较大:正则化强度强,参数被大幅压缩,模型更简单,易出现欠拟合。
  • 调参关键:通过交叉验证找到最优 (\lambda),在 “拟合训练数据” 和 “泛化测试数据” 之间找到平衡。

三、正则化的底层逻辑:为什么能防过拟合?

1. 过拟合的本质

过拟合的核心原因是模型参数过多、复杂度太高,导致模型过度学习了训练数据中的噪声和异常值,而忽略了数据的通用规律。此时模型在训练集误差极低,但在测试集误差极高。

2. 正则化的解决思路

通过在损失函数中加入惩罚项,给模型参数 “加上约束”:

  • 对大参数施加惩罚,迫使模型降低参数规模,减少不必要的特征权重。
  • 让模型更关注数据的通用规律,而非训练集中的噪声,从而提升在测试集上的表现。

四、常见正则化类型(面试重点:L1/L2/ElasticNet)

1. L1 正则化(Lasso 回归)

(1)核心公式

( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda \sum_{i=1}^k |\theta_i| )

  • 惩罚项为参数的绝对值之和
(2)核心特点
  • 能产生稀疏解:不重要特征的权重会被直接压缩为 0,实现自动特征选择。
  • 几何解释:L1 的约束区域是菱形,损失函数的等高线更容易与菱形的顶点(坐标轴)相交,此时对应的参数值为 0。
(3)优缺点
优点缺点
自动筛选重要特征,模型解释性强特征高度相关时,会随机选择其中一个,稳定性较差
适用于高维数据,可有效降低特征维度对异常值较敏感,训练过程中可能出现参数震荡
(4)适用场景
  • 特征维度远大于样本数的场景(如文本分类、基因数据)。
  • 需要模型具备强解释性、明确特征重要性的业务场景(如金融风控、医疗诊断)。

2. L2 正则化(Ridge 回归 / 岭回归)

(1)核心公式

( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda \sum_{i=1}^k \theta_i^2 )

  • 惩罚项为参数的平方和
(2)核心特点
  • 不会产生稀疏解:仅均匀缩小所有参数的绝对值,不会让任何参数变为 0,保留所有特征。
  • 几何解释:L2 的约束区域是圆形,损失函数的等高线与圆形的交点均匀分布,所有参数都会被小幅压缩。
(3)优缺点
优点缺点
对多重共线性和异常值鲁棒性强,训练稳定无法自动特征选择,模型解释性弱于 L1
适用于低维数据,能有效降低过拟合风险特征高度相关时,会导致相关特征的权重被均匀压缩,影响模型表现
(4)适用场景
  • 特征间存在多重共线性的场景(如房价预测、金融数据)。
  • 数据噪声较大、追求模型稳定性的业务场景(如工业预测、销量预测)。

3. ElasticNet 正则化(弹性网络回归)

(1)核心公式

( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda_1 \sum_{i=1}^k |\theta_i| + \lambda_2 \sum_{i=1}^k \theta_i^2 )

  • 同时包含 L1 和 L2 惩罚项,是两者的折中方案。
(2)核心特点
  • 结合了 L1 的特征选择能力和 L2 的稳定性。
  • 解决了 L1 在特征高度相关时的不稳定问题,同时保留了稀疏性。
(3)优缺点
优点缺点
兼顾特征选择和稳定性,适用场景更广超参数调参复杂度更高,需要同时优化(\lambda_1)和(\lambda_2)
对高维、多重共线性数据表现优异模型解释性介于 L1 和 L2 之间,不如纯 L1 直观
(4)适用场景
  • 特征维度远大于样本数、特征间存在多重共线性的场景(如生物信息学数据、高维电商用户数据)。
  • 不确定使用 L1 还是 L2 时的折中选择。

五、L1 vs L2 vs ElasticNet 对比总结(面试速记)

对比维度L1 正则化(Lasso)L2 正则化(Ridge)ElasticNet
惩罚项形式参数绝对值之和参数平方和L1+L2 混合
稀疏性产生稀疏解(部分参数为 0)无稀疏解(参数仅缩小)部分稀疏(可控制)
特征选择自动筛选重要特征不筛选,保留所有特征可实现特征选择
稳定性较差(对特征相关性敏感)强(对多重共线性鲁棒)强(解决 L1 的不稳定问题)
适用场景高维数据、需强解释性低维数据、多重共线性高维 + 多重共线性、折中选择

六、面试高频问答(必背)

1. 正则化为什么能防止过拟合?

过拟合的本质是模型参数过大、复杂度太高,过度学习了训练数据的噪声。正则化通过在损失函数中加入惩罚项,对大参数施加惩罚,限制模型的复杂度,迫使模型学习数据的通用规律而非噪声,从而提升泛化能力。

2. L1 和 L2 正则化哪个更适合特征选择?为什么?

L1 正则化更适合特征选择。因为 L1 的惩罚项是参数绝对值之和,会让不重要特征的权重直接变为 0,实现自动特征筛选;而 L2 仅缩小参数,不会让任何参数变为 0,无法有效筛选特征。

3. 为什么 L1 会产生稀疏解,而 L2 不会?

从几何角度看,L1 的约束区域是菱形,损失函数的等高线更容易与菱形的顶点(坐标轴)相交,此时对应的参数值为 0;而 L2 的约束区域是圆形,等高线与圆形的交点均匀分布,所有参数都会被小幅压缩,不会出现为 0 的情况。

4. 超参数 (\lambda) 过大或过小会有什么影响?

  • (\lambda) 过大:正则化强度过强,参数被过度压缩,模型复杂度不足,易出现欠拟合。
  • (\lambda) 过小:正则化强度过弱,参数几乎不受惩罚,模型仍易过拟合。
  • 解决方法:通过交叉验证(如网格搜索、随机搜索)找到最优 (\lambda)。

5. ElasticNet 和 L1、L2 相比有什么优势?

ElasticNet 结合了 L1 和 L2 的优点,既具备 L1 的特征选择能力,又解决了 L1 在特征高度相关时的不稳定问题,同时保留了 L2 的鲁棒性,适用场景更广,尤其是高维、多重共线性数据。


七、Python 代码示例(线性回归 + 正则化)

import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 1. 构造模拟数据(含多重共线性特征)
np.random.seed(42)
n_samples, n_features = 100, 10
X = np.random.randn(n_samples, n_features)
# 构造高度相关的特征(第2个特征是第1个特征的线性组合)
X[:, 1] = X[:, 0] * 0.8 + np.random.randn(n_samples) * 0.1
y = 2 * X[:, 0] + 3 * X[:, 2] + np.random.randn(n_samples) * 0.5

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 初始化不同模型
models = {
    "原始线性回归": LinearRegression(),
    "L2正则化(Ridge)": Ridge(alpha=1.0),  # alpha对应λ
    "L1正则化(Lasso)": Lasso(alpha=0.1),
    "ElasticNet": ElasticNet(alpha=0.1, l1_ratio=0.5)  # l1_ratio控制L1占比
}

# 4. 训练并评估模型
for name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print(f"{name} 测试集MSE: {mse:.4f}")
    print(f"模型参数(前5个): {model.coef_[:5]}\n")

八、学习总结

  1. 正则化的核心是通过惩罚项限制模型复杂度,平衡偏差与方差,防止过拟合
  2. L1、L2、ElasticNet 的选择需结合数据场景:高维数据选 L1,多重共线性选 L2,折中选 ElasticNet。
  3. 超参数 (\lambda) 的调参是关键,需通过交叉验证找到最优值。
  4. 面试中重点掌握公式、底层逻辑、对比差异和适用场景。

更多推荐