跳至内容

机器学习中的正则化:L1、L2 与 Elastic Net 详解

关于机器学习正则化的实用概览——它是什么、如何工作、以及何时使用 L1、L2 与 Elastic Net 来构建具备泛化能力的模型。
更新 2026年5月4日  · 9分钟

所以,您训练了一个在训练集上几乎全对的模型,但在新数据上却失败了?我们都遇到过这种情况。

这就是过拟合的高层定义。您的模型没有学到真正的模式,而是记住了训练数据。在包含全新、未见数据的生产环境中,这样的模型会做出让人难以信任的预测。现实世界的数据越偏离训练样本,问题就越严重。

正则化通过在损失函数中加入惩罚项来解决这个问题。惩罚项会抑制复杂的模型。换句话说,它让您的模型不要去“贴合”每一个数据点,而是被迫去做泛化。

本文将带您理解正则化背后的直觉、最常见的方法——L1、L2 和 Elastic Net——以及如何为您的场景选择合适的方法。

如果您想了解为何以及如何机器学习模型在生产中会失败,请阅读我们的偏差-方差权衡博文。

什么是机器学习中的正则化

正则化是一种在模型的损失函数中加入惩罚项以抑制复杂度的技术。

没有惩罚项时,模型有足够的灵活性去尽可能贴合训练数据,包括其中的噪声和离群点。正则化为这种灵活性增加了代价。模型越想复杂,受到的惩罚就越高。

模型的损失函数通常衡量预测值与真实值的差异。正则化在该等式中增加了一个额外项,且会随模型系数变大而增大。此时模型需要在两个目标间权衡:既要拟合训练数据,又要让系数保持较小。

这种平衡决定了模型的灵活性。

高度灵活的模型可以“扭成任何形状”去贴合训练数据。正则化会把它拉回到一个更简单的形状——更有可能在未见数据上也站得住脚。

为何需要正则化

您训练的每个模型,都处在两个不可用极端之间:一个过于简单,一个过于复杂。

过于简单的模型抓不住数据中的真实模式。它错过了信号。那就是欠拟合——在训练数据和新数据上都表现不佳。

过于复杂的模型则相反。它会贴合训练数据中的每个细节,包括噪声。那就是过拟合——在训练数据上表现极好,但在新数据上失败,因为它记住的是错误的东西。

以多项式回归为具体例子。对呈现缓慢弯曲趋势的数据用三次多项式拟合,往往能贴近正确模式。但用十五次多项式拟合同样的数据则会导致过拟合——曲线穿过每一个数据点,却在两点之间做出随机般的预测。

下图展示了实际中的样子。

恰到好处与过于复杂的模型对比

恰到好处与过于复杂的模型

这就是偏差-方差权衡。

简单模型偏差高——它们做出强假设,从而错过真实模式。复杂模型方差高——它们对所见的特定训练样本过于敏感,数据稍有变化就会得到完全不同的模型。

正则化帮助您两者兼得。它不会消除复杂性,但会对其进行惩罚。结果是,您的模型更有机会学到真正的信号。

正则化如何发挥作用

每个模型都通过最小化损失函数来学习——衡量其预测偏差的指标。没有正则化时,模型唯一的任务就是最小化误差。它会不择手段,包括让系数变得很大以贴合训练数据,但难以泛化。

正则化改变了目标。模型不再只最小化误差,而是最小化如下目标:

正则化的工作机制

正则化的工作机制

惩罚项是模型系数的函数。系数越大,惩罚越高。为保持总体代价较低,模型被迫让系数更小——这意味着更简单、更具泛化能力的解。

λ(lambda)控制惩罚的重要性。λ 越大,模型被施加的“保持简单”的压力越大;λ 越小,模型越能专注于拟合数据。如何调参,请见下方“选择正则化强度”部分。

机器学习中的正则化类型

惩罚模型复杂度有多种方式。它们对系数施加压力的方式不同,因此适用于不同情形。

L2 正则化(Ridge 回归)

L2 正则化对每个系数的平方进行惩罚。系数越大,对惩罚的贡献越多,模型就越努力去缩小它。

L2 正则化

L2 正则化

关键词是“收缩”。L2 将所有系数向零拉近,但通常不会变成完全的零。每个特征都会保留在模型中,只是权重更小。因此,当您相信大多数特征都有用并希望一个稳定、表现良好的模型时,Ridge 是不错的默认选择。

L1 正则化(Lasso 回归)

L1 正则化惩罚的是每个系数的绝对值,而不是平方。

L1 正则化

L1 正则化

这点小差异带来大影响。L1 可以把系数直接推到精确的零,这意味着会将特征从模型中移除。您可以把它看作自动特征选择。换句话说,Lasso 正则化可以通过移除特征来简化模型。

L1 与 L2 正则化对比

核心差异在于稀疏性。L1 产生稀疏模型——只有一部分特征被保留;L2 产生稠密模型——所有特征都保留,但权重更小。

这也影响可解释性。只有 5 个有效特征的 Lasso 模型,比有 50 个特征各自略有贡献的 Ridge 模型更易解释。但当特征彼此相关时,Ridge 往往更稳定,因为它会在相关特征间分摊权重,而不是随意挑一个。

以下是差异的快速概览:

L1 与 L2 正则化对比

L1 与 L2 正则化对比

如果您想在 Python 中比较它们,请查看我们的Python 中的 Lasso 与 Ridge 回归教程

Elastic Net 正则化

Elastic Net 将 L1 与 L2 合并为单一惩罚项。

Elastic Net 正则化

Elastic Net 正则化

理念是两者兼得:L1 的特征选择与 L2 的稳定性。当您有相关特征且仍希望去掉其中一部分时,这很有用。仅用 Lasso 往往会从相关特征组里挑一个保留,其余忽略;Elastic Net 更可能保留其中几个,同时去除无关的。

不同模型中的正则化

正则化在许多机器学习模型中都有体现,但形式各异。下面一一介绍。

线性回归是多数人首次接触正则化的地方。在线性回归中加入 L2 正则化就是 Ridge 回归;加入 L1 则是 Lasso 回归。其数学形式与上文一致——在最小二乘损失上添加惩罚项。

逻辑回归同理。损失函数变为交叉熵而非平方误差,但惩罚项相同。多数机器学习库默认对逻辑回归应用 L2 正则化,这也是为什么您会在 scikit-learn 里看到参数 C。它是 λ 的倒数,所以 C 越小,正则化越强。

神经网络使用几种不同方法:

  • 权重衰减:对网络权重应用 L2 正则化——原理相同,只是规模更大
  • Dropout:在训练中,每次随机禁用一部分神经元,防止网络过度依赖穿越各层的任一单一路径。

两者都能减少过拟合,但机制不同。

树模型并不使用损失惩罚。它们通过剪枝来控制复杂度——限制树的最大深度,或移除对提升预测不足以“抵消存在成本”的分支。在 scikit-learn 中,max_depthmin_samples_split 等超参数就是正则化参数,尽管未必这么称呼。

正则化与偏差-方差权衡

正则化的本质是取舍。

当您加入惩罚项时,您在限制模型的自由度。它不再能随心所欲地贴合训练数据。这种约束会引入偏差——因为您要求它保持简单,模型在设计上会带着些许错误假设。

但同一约束会降低方差。无法贴合每个数据点的模型,对所训练的特定样本就不那么敏感。换个略有不同的数据集训练,结果也更接近。这种稳定性正是您在生产中所希望的。

没有正则化时,您得到的是高度灵活的模型,偏差低(假设少、训练拟合好)但方差高(训练数据稍变就产生截然不同的模型,因而在新数据上不可靠)。

正则化就是调整这种平衡。用一点偏差换来大量方差的降低,通常会带来对未见数据更好的表现。这种取舍几乎总是值得的。

选择正则化强度

作为一名机器学习实践者,选定正则化类型后,您还需要设定正则化强度。

该强度由一个超参数控制——在数学记号中通常称为 lambda (λ),在 scikit-learn 中常为 alpha。它是惩罚项前的系数。您改变它,就改变了模型被“推向简单”的力度。

如果设得过头或不足,都会在生产中出问题:

  • 太低:惩罚弱到几乎不起作用。模型仍会过拟合,就像没有正则化一样。
  • 太高:惩罚成为主导因素。模型被限制得过于严苛,无法理解数据中的真实模式,即欠拟合。

合适的数值介于两者之间,没有放之四海皆准的答案。它取决于您的数据、模型以及噪声水平。

标准做法是交叉验证。将训练数据切分为多个折,针对一系列 alpha 取值在不同折上训练并评估验证集表现。平均验证分数最好的那个值,就是您应当采用的。

在 scikit-learn 中,RidgeCVLassoCV 可以自动完成这件事——它们会在一组 alpha 上做交叉验证,并为您选择最佳值。

from sklearn.linear_model import RidgeCV

model = RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0], cv=5)
model.fit(X_train, y_train)

print(model.alpha_)

打印出的 alpha 是交叉验证找到的最佳值。先从较宽的取值范围开始,一旦知道最优区间,再逐步缩小范围。

结语

正则化能防止模型“聪明反被聪明误”。

它对复杂度进行惩罚,迫使模型找到能泛化的解,而不是死记训练数据。L2 会保留所有特征并降低其影响;L1 会移除无关特征;Elastic Net 则兼具两者。在线性模型、逻辑回归、神经网络与集成模型中,这一理念以不同形式出现,且不一定都被称为“正则化”。

最重要的是您选择的技术和设定的强度。所以,您需要做的是实验。尝试不同方法与不同参数值,不要随便选一个就草草了事。

您的数据会告诉您什么有效。

如果您想查看更多正则化技术的实际应用,欢迎加入我们的Machine Learning Scientist in Python 学习路径。包含 85 小时内容,助您胜任相关岗位。

常见问题

什么是机器学习中的正则化?

正则化是一种在模型损失函数中加入惩罚项以抑制复杂度的技术。它通过迫使模型保持较小的系数来防止过拟合,从而得到更简单、在新数据上泛化更好的解。

我什么时候该使用正则化?

当您的模型在训练集上表现良好、但在验证集或测试集上表现不佳时——这种差距就是过拟合的信号——就应使用正则化。在处理高维数据,或特征数量接近甚至超过样本数量的数据集时,把正则化作为默认实践也是个好主意。

正则化一定会提升模型表现吗?

不一定。如果您的模型已经欠拟合,加入正则化只会让情况更糟,因为它会把模型进一步推向更简单的解。目标是在两者之间找到平衡——正则化在模型过于复杂时有用,而不是在模型过于简单时。

Lasso 中的 alpha 与逻辑回归中的 C 有何区别?

两者都控制正则化强度,但方向相反。Lasso 中的 alpha 用于缩放惩罚——值越大,正则化越强。scikit-learn 的逻辑回归中的 C 是惩罚强度的倒数,因此 C 越小,正则化越强。如果在两者间切换,请记住:增大 alpha 与减小 C 的效果相同。

我可以同时使用 L1 与 L2 正则化吗?

可以——这正是 Elastic Net 所做的。它将两种惩罚项合并为一个目标,同时获得 L1 的特征选择与 L2 的稳定性。当您有相关特征且仍希望做一定的剪枝时很实用,因为仅用 Lasso 往往会在一组相关特征中任意只保留一个。

主题

与 DataCamp 一起学习

Courses

Machine Learning with Tree-Based Models in Python

5小时
115.8K
In this course, you'll learn how to use tree-based models and ensembles for regression and classification using scikit-learn.
查看详情Right Arrow
开始课程
查看更多Right Arrow