2026/5/21 19:56:01
网站建设
项目流程
网站建设为什么不清晰,360网页入口,品牌官方网站建设,上海网络排名优化机器学习-L1正则化和L2正则化解决过拟合问题在机器学习中#xff0c;过拟合#xff08;Overfitting#xff09; 是模型训练过程中最常见且最棘手的问题之一。当一个模型在训练集上表现优异#xff08;误差极小#xff09;#xff0c;却在测试集或新数据上表现糟糕时…机器学习-L1正则化和L2正则化解决过拟合问题在机器学习中过拟合Overfitting是模型训练过程中最常见且最棘手的问题之一。当一个模型在训练集上表现优异误差极小却在测试集或新数据上表现糟糕时我们就说模型出现了过拟合。这种现象如同学生死记硬背了所有习题答案但遇到新题目就束手无策。本文将深入探讨过拟合的本质原因、直观理解并重点讲解两种强大的解决方案——L1正则化和L2正则化从数学原理到实际应用进行全面剖析。什么是过拟合在开始正则化的讲解之前我们首先要清楚过拟合的概念及其表现。模型拟合状态通常分为三种情况欠拟合Underfitting:表现模型在训练集和测试集上都表现不佳预测误差都很大原因模型过于简单无法捕捉数据中的基本规律类比只用直线去拟合明显是曲线的数据分布解决思路增加模型复杂度如增加特征、使用更复杂的模型正好拟合Just Fitting / Good Fit:表现模型在训练集和测试集上都表现良好泛化能力强原因模型复杂度与数据复杂度匹配得当理想状态模型既学习了数据中的普遍规律又不过度关注噪声过拟合Overfitting:表现模型在训练集上表现极好误差接近0但在测试集上表现很差原因模型过于复杂过度学习了训练数据中的噪声和偶然特征类比学生不仅记住了知识点还把练习册上的印刷错误也背下来了危险模型失去了泛化能力在实际应用中会失败为了更好地理解这三种状态让我们通过一个简单的例子来可视化它们。可视化理解三种拟合状态假设我们有一组真实数据它们本应遵循一个二次函数关系y0.5x2x2y 0.5x^2 x 2y0.5x2x2但由于现实世界的各种因素实际观测值会带有一定的随机噪声。因此我们利用numpy生成一组随机数带充当随机噪声# 随机生成x轴 100个数据, 模拟: 特征.xnp.random.uniform(-3,3,100)# 基于x轴值, 通过线性公式, 生成y轴 100个数据, 模拟: 标签.# 线性公式: y kx b 0.5 * x ** 2 x 2 噪声y0.5*x**2x2np.random.normal(0,1,100)欠拟合的情况当我们使用一个过于简单的模型如线性模型ywxby wx bywxb去拟合这些数据时# 使用简单线性模型拟合二次数据estimatorLinearRegression()estimator.fit(X_linear,y)# X_linear只有一维特征结果会怎样呢模型试图用一条直线去拟合明显弯曲的数据点就像用尺子去测量弯曲的河流长度必然会丢失大量信息。训练误差和测试误差都会很大因为模型连数据的基本趋势都没能捕捉到。从数学角度看欠拟合模型的偏差Bias很大因为它对真实规律的假设过于简化。在损失函数曲面上欠拟合的模型参数可能停留在某个局部高点没有到达真正的谷底。正好拟合的情况当我们增加模型复杂度使用二次模型yw1xw2x2by w_1x w_2x^2 byw1xw2x2b去拟合这些数据时# 使用二次特征拟合二次数据X_quadraticnp.hstack([X,X**2])# 增加二次特征estimator.fit(X_quadratic,y)这时模型复杂度与数据真实复杂度匹配了。模型能够很好地捕捉数据的真实规律既学到了二次函数的弯曲特性又不会过度关注随机噪声。训练误差和测试误差都会比较小且两者相差不大。这种状态下模型的**偏差-方差权衡Bias-Variance Tradeoff**达到了最佳平衡点。偏差足够小以捕捉主要规律方差也不至于太大而过度拟合噪声。过拟合的情况当我们过度增加模型复杂度使用十次多项式y∑i110wixiby \sum_{i1}^{10} w_i x^i by∑i110wixib去拟合这些数据时# 使用十次多项式拟合二次数据X_polynp.hstack([X,X**2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10])estimator.fit(X_poly,y)模型变得过于复杂有太多的参数需要学习。这时模型不仅学会了二次函数的规律还试图去拟合每一个数据点的随机波动包括噪声。结果就是模型在训练集上几乎完美误差极小但对新数据的预测效果很差。从图中可以看到拟合曲线为了经过每一个训练数据点变得极其曲折蜿蜒。它记住了每一个训练样本的细节包括噪声却丢失了数据的整体趋势。过拟合的数学本质要深入理解正则化我们需要从数学角度分析过拟合的产生机制。参数过多与模型容量在多元线性回归中我们有模型yw1x1w2x2⋯wpxpby w_1x_1 w_2x_2 \dots w_px_p byw1x1w2x2⋯wpxpb当特征数量ppp很大特别是相对于样本数量nnn很大时p≈np \approx np≈n或pnp npn模型就有了足够的自由度去拟合训练数据中的任何模式包括噪声。这就是模型容量Model Capacity过大导致的过拟合。损失函数的最小化陷阱回忆我们之前的损失函数以均方误差为例L(w)1n∑i1n(yi−yi)2∗L∗(∗w∗)∗n∗1∑∗i∗1∗n∗(∗y∗∗i∗−∗y∗∗i∗)2 L(w)1n∑i1n(yi−y^i)2*L*(*w*)*n*1∑*i*1*n*(*y**i*−*y*^*i*)2L(w)1n∑i1n(yi−yi)2∗L∗(∗w∗)∗n∗1∑∗i∗1∗n∗(∗y∗∗i∗−∗y∗∗i∗)2在没有约束的情况下最小化这个损失函数可能会驱使某些权重wiw_iwi变得非常大特别是当对应的特征xix_ixi与噪声高度相关时。这些大权重的特征虽然降低了训练误差却损害了模型的泛化能力。正则化给模型加上约束正则化的核心思想是在最小化损失函数的同时对模型参数施加某种约束或惩罚防止它们变得过大。这就好比给一匹野马套上缰绳既让它奔跑又不让它失控。正则化的一般形式是在原始损失函数基础上增加一个正则化项L正则化(w)L原始(w)λR(w)∗L∗正则化(∗w∗)∗L∗原始(∗w∗)∗λ∗∗R∗(∗w∗) L正则化(w)L原始(w)λR(w)*L*正则化(*w*)*L*原始(*w*)*λ**R*(*w*)L正则化(w)L原始(w)λR(w)∗L∗正则化(∗w∗)∗L∗原始(∗w∗)∗λ∗∗R∗(∗w∗)其中λ\lambdaλ是正则化系数控制正则化的强度R(w)R(w)R(w)是正则化项对参数www进行惩罚不同的正则化项R(w)R(w)R(w)对应不同的正则化方法最常用的就是L1正则化和L2正则化。L1正则化Lasso回归直观理解想象你要去登山背包空间有限。你需要选择带哪些物品登山杖、水、食物、雨伞、备用鞋子等。L1正则化就像是一个严格的筛选器它会迫使你放弃一些不是绝对必要的物品只保留最重要的几样。在机器学习中L1正则化会迫使一些不重要的特征的权重变为0从而实现特征选择Feature Selection。数学形式L1正则化在损失函数中增加的是权重的绝对值之和LL1(w)L原始(w)λ∑i1p∣wi∣∗L∗L1(∗w∗)∗L∗原始(∗w∗)∗λ∗∑∗i∗1∗p∗∣∗w∗∗i∗∣ LL1(w)L原始(w)λ∑i1p∣wi∣*L*L1(*w*)*L*原始(*w*)*λ*∑*i*1*p*∣*w**i*∣LL1(w)L原始(w)λ∑i1p∣wi∣∗L∗L1(∗w∗)∗L∗原始(∗w∗)∗λ∗∑∗i∗1∗p∗∣∗w∗∗i∗∣这里λ∑i1p∣wi∣\lambda \sum_{i1}^p |w_i|λ∑i1p∣wi∣就是L1正则化项。λ\lambdaλ越大对权重的惩罚越重更多的权重会被压缩到0。实际应用在Python的scikit-learn库中L1正则化通过Lasso回归实现fromsklearn.linear_modelimportLasso# 创建L1正则化模型alpha就是正则化系数λestimatorLasso(alpha0.1)# alpha越大正则化越强estimator.fit(X,y)# 训练后查看权重print(权重向量:,estimator.coef_)你会发现许多特征的权重都变成了0或接近0。这正是L1正则化的特征选择能力。拟合情况也会得到非常好的改善特点总结产生稀疏解许多权重恰好为0自动特征选择可以识别并剔除不重要的特征计算相对复杂因为绝对值函数在0点不可导适合特征选择场景当特征数量很多但只有少数特征真正重要时L2正则化Ridge回归直观理解继续登山的比喻L2正则化不是让你丢弃物品而是给你一个更大的背包。所有的物品都可以带上但每件物品都必须压缩一下以减少占用空间。没有物品会被完全丢弃但所有物品的体积权重都变小了。数学形式L2正则化在损失函数中增加的是权重的平方和LL2(w)L原始(w)λ∑i1pwi2∗L∗L2(∗w∗)∗L∗原始(∗w∗)∗λ∗∑∗i∗1∗p∗∗w∗∗i∗2 LL2(w)L原始(w)λ∑i1pwi2*L*L2(*w*)*L*原始(*w*)*λ*∑*i*1*p**w**i*2LL2(w)L原始(w)λ∑i1pwi2∗L∗L2(∗w∗)∗L∗原始(∗w∗)∗λ∗∑∗i∗1∗p∗∗w∗∗i∗2这里λ∑i1pwi2\lambda \sum_{i1}^p w_i^2λ∑i1pwi2就是L2正则化项。同样λ\lambdaλ控制正则化的强度。实际应用在scikit-learn中L2正则化通过Ridge回归实现fromsklearn.linear_modelimportRidge# 创建L2正则化模型estimatorRidge(alpha10.0)# alpha越大正则化越强estimator.fit(X,y)# 训练后查看权重print(权重向量:,estimator.coef_)你会发现所有权重都变小了但几乎没有权重会恰好为0。特点总结权重收缩所有权重都变小但不会为0稳定解对数据中的噪声和异常值更稳健计算简单平方项处处可导优化更容易适合多重共线性场景当特征高度相关时L2正则化能提供更稳定的解