作为L2正则化函数的岭系数#

过拟合的模型学习训练数据过于充分,捕捉到数据的潜在模式和噪声。但是,当应用于未见数据时,学习到的关联可能并不成立。当我们将训练后的预测应用于测试数据并发现统计性能与训练数据相比显着下降时,通常会检测到这种情况。

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

此示例说明了Ridge回归中的L2正则化如何通过向损失添加一个随着系数\(\beta\)增加而增加的惩罚项来影响模型的性能。

正则化损失函数由下式给出:\(\mathcal{L}(X, y, \beta) = \| y - X \beta \|^{2}_{2} + \alpha \| \beta \|^{2}_{2}\)

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

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

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

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

因此,正则化损失函数结合了预测精度项和惩罚项。通过调整正则化强度,从业人员可以微调施加在权重上的约束程度,训练一个能够很好地泛化到未见数据的模型,同时避免过拟合。

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

本例的目的#

为了展示岭正则化的工作原理,我们将创建一个无噪声数据集。然后,我们将对一系列正则化强度(\(\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
)

# Obtain the true coefficients
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的值不同,这是一个正的常数,它乘以惩罚项,控制正则化强度。对于每个训练好的模型,我们计算真实系数w和模型clf找到的系数之间的误差。我们将识别的系数和计算出的对应系数的误差存储在列表中,这使得我们可以方便地绘制它们。

import numpy as np

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

clf = Ridge()

# Generate values for `alpha` that are evenly distributed on a logarithmic scale
alphas = np.logspace(-3, 4, 200)
coefs = []
errors_coefs = []

# Train the model with different regularisation strengths
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)如何影响岭回归系数。较小的alpha值(弱正则化)允许系数与用于生成数据集的真实系数(w)非常相似。这是因为我们的人工数据集没有添加额外的噪声。随着alpha的增加,系数缩小到零,逐渐减少以前更重要的特征的影响。

右侧图表显示了模型找到的系数与真实系数(w)之间的均方误差 (MSE)。它提供了一个衡量指标,用于比较我们的岭回归模型与真实生成模型的精确程度。误差越低,表示找到的系数越接近真实生成模型的系数。在本例中,由于我们的玩具数据集是非噪声的,我们可以看到正则化程度最低的模型检索到的系数最接近真实系数(w)(误差接近 0)。

alpha较小时,模型会捕捉训练数据的细微之处,无论这些是由噪声还是实际信息引起的。随着alpha的增加,最高的系数收缩得更快,使得它们对应的特征在训练过程中的影响力降低。这可以增强模型泛化到未见数据的能力(如果存在大量噪声需要捕捉),但如果正则化强度相对于数据中包含的噪声量过大(如本例所示),则也会存在性能下降的风险。

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

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

脚本总运行时间:(0 分钟 0.745 秒)

相关示例

将 Ridge 系数绘制为正则化的函数

将 Ridge 系数绘制为正则化的函数

模型正则化对训练误差和测试误差的影响

模型正则化对训练误差和测试误差的影响

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

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

L1 逻辑回归的正则化路径

L1 逻辑回归的正则化路径

由 Sphinx-Gallery 生成的图库