L2 正则化对岭回归系数的影响#

过拟合的模型对训练数据学习得过于深入,不仅捕捉到了数据中的潜在模式,还捕捉到了噪声。然而,当应用于未见过的数据时,所学到的关联可能并不成立。我们通常在将训练好的预测应用于测试数据时发现这一点,并看到统计性能相比训练数据显著下降。

克服过拟合的一种方法是通过正则化,这可以通过在线性模型中惩罚较大的权重(系数)来实现,迫使模型缩小所有系数。正则化减少了模型对从训练样本中获得的特定信息的依赖。

这个例子展示了在 Ridge 回归中,L2 正则化通过在损失中添加一个随系数 \(eta\) 增加的惩罚项,如何影响模型的性能。

正则化的损失函数如下:\(\mathcal{L}(X, y, eta) = \| y - X eta \|^{2}_{2} + lpha \| eta \|^{2}_{2}\)

其中 \(X\) 是输入数据,\(y\) 是目标变量,\(eta\) 是与特征相关的系数向量,\(lpha\) 是正则化强度。

正则化的损失函数旨在平衡准确预测训练集和防止过拟合之间的权衡。

在这个正则化的损失中,左侧(例如 \(\|y - Xeta\|^{2}_{2}\) )衡量实际目标变量 \(y\) 和预测值之间的平方差。单独最小化这一项可能导致过拟合,因为模型可能变得过于复杂并对训练数据中的噪声过于敏感。

为了解决过拟合问题,岭回归在损失函数中添加了一个约束,称为惩罚项(\(lpha \| eta\|^{2}_{2}\) )。这个惩罚项是模型系数平方和乘以正则化强度 \(lpha\) 。通过引入这个约束,岭回归阻止任何单个系数 \(eta_{i}\) 取过大的值,并鼓励较小且分布更均匀的系数。较高的 \(lpha\) 值会迫使系数趋向于零。然而,过高的 \(lpha\) 会导致模型欠拟合,无法捕捉数据中的重要模式。

因此,正则化的损失函数结合了预测准确性项和惩罚项。通过调整正则化强度,实践者可以微调对权重施加的约束程度,训练出能够很好地泛化到未见数据且避免过拟合的模型。

# Author: Kornel Kielczewski -- <kornel.k@plusnet.pl>

本示例的目的#

为了展示岭回归的工作原理,我们将创建一个无噪声的数据集。然后,我们将在一系列正则化强度(\(\alpha\) )上训练一个正则化模型,并绘制训练系数和这些系数与原始值之间的均方误差如何随正则化强度变化的图。

创建一个无噪声的数据集#

我们创建一个包含100个样本和10个特征的玩具数据集,适合用于回归检测。在这10个特征中,有8个是信息性的并对回归有贡献,而剩下的2个特征对目标变量没有任何影响(它们的真实系数为0)。请注意,在这个例子中,数据是无噪声的,因此我们可以期望我们的回归模型准确地恢复真实系数w。

from sklearn.datasets import make_regression

X, y, w = make_regression(
    n_samples=100, n_features=10, n_informative=8, coef=True, random_state=1
)

# 获得真实系数
print(f"The true coefficient of this regression problem are:\n{w}")
The true coefficient of this regression problem are:
[38.32634568 88.49665188  0.         29.75747153  0.         19.08699432
 25.44381023 38.69892343 49.28808734 71.75949622]

训练岭回归模型#

我们使用 Ridge ,这是一种带有L2正则化的线性模型。我们训练多个模型,每个模型的参数 alpha 取不同的值, alpha 是一个正数,用于乘以惩罚项,控制正则化强度。对于每个训练好的模型,我们计算真实系数 w 和模型找到的系数 clf 之间的误差。我们将识别出的系数和相应系数的计算误差存储在列表中,这样方便我们进行绘图。

import numpy as np

from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

clf = Ridge()

# 生成在对数刻度上均匀分布的 `alpha` 值
alphas = np.logspace(-3, 4, 200)
coefs = []
errors_coefs = []

# 用不同的正则化强度训练模型
for a in alphas:
    clf.set_params(alpha=a).fit(X, y)
    coefs.append(clf.coef_)
    errors_coefs.append(mean_squared_error(clf.coef_, w))

绘制训练后的系数和均方误差#

我们现在绘制10个不同的正则化系数作为正则化参数 alpha 的函数,其中每种颜色代表一个不同的系数。

在右侧,我们绘制了估计器的系数误差如何随正则化的变化而变化。

import matplotlib.pyplot as plt
import pandas as pd

alphas = pd.Index(alphas, name="alpha")
coefs = pd.DataFrame(coefs, index=alphas, columns=[f"Feature {i}" for i in range(10)])
errors = pd.Series(errors_coefs, index=alphas, name="Mean squared error")

fig, axs = plt.subplots(1, 2, figsize=(20, 6))

coefs.plot(
    ax=axs[0],
    logx=True,
    title="Ridge coefficients as a function of the regularization strength",
)
axs[0].set_ylabel("Ridge coefficient values")
errors.plot(
    ax=axs[1],
    logx=True,
    title="Coefficient error as a function of the regularization strength",
)
_ = axs[1].set_ylabel("Mean squared error")
Ridge coefficients as a function of the regularization strength, Coefficient error as a function of the regularization strength

解释图表#

左侧的图表显示了正则化强度( alpha )如何影响Ridge回归系数。较小的 alpha 值(弱正则化)允许系数更接近用于生成数据集的真实系数( w )。这是因为我们的人工数据集中没有添加额外的噪声。随着 alpha 的增加,系数逐渐缩小趋向于零,逐渐减少以前更重要的特征的影响。

右侧图显示了模型找到的系数与真实系数( w )之间的均方误差(MSE)。它提供了一种度量,表明我们的岭回归模型与真实生成模型的精确程度。较低的误差意味着找到的系数更接近真实生成模型的系数。在这种情况下,由于我们的玩具数据集没有噪声,我们可以看到正则化最少的模型找到的系数最接近真实系数( w )(误差接近0)。

alpha 较小时,模型会捕捉到训练数据的复杂细节,无论这些细节是由噪声还是实际信息引起的。随着 alpha 增加,最高的系数会更迅速地缩小,使其对应的特征在训练过程中的影响力减小。这可以增强模型对未见数据的泛化能力(如果有大量噪声需要捕捉),但如果正则化变得过强而数据中包含的噪声较少(如在此示例中),也会有失去性能的风险。

在实际场景中,数据通常包含噪声,选择适当的 alpha 值对于在过拟合和欠拟合模型之间取得平衡至关重要。

在这里,我们看到 Ridge 通过对系数添加惩罚项来对抗过拟合。另一个问题与训练数据集中的异常值有关。异常值是与其他观测值显著不同的数据点。具体来说,这些异常值会影响我们之前展示的损失函数的左侧项。一些其他线性模型被设计为对异常值具有鲁棒性,例如 HuberRegressor 。你可以在 带有强异常值的数据集上的Huber回归与岭回归对比 示例中了解更多信息。

Total running time of the script: (0 minutes 0.281 seconds)

Related examples

绘制岭回归系数与正则化参数的关系

绘制岭回归系数与正则化参数的关系

线性模型系数解释中的常见陷阱

线性模型系数解释中的常见陷阱

scikit-learn 1.0 版本发布亮点

scikit-learn 1.0 版本发布亮点

训练误差与测试误差

训练误差与测试误差

Gallery generated by Sphinx-Gallery