岭系数作为 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\) 值会导致模型欠拟合,无法捕捉数据中的重要模式。
因此,正则化损失函数结合了预测精度项和惩罚项。通过调整正则化强度,实践者可以微调对权重施加的约束程度,训练一个能够很好地泛化到未见过的数据,同时避免过拟合的模型。
# Author: Kornel Kielczewski -- <[email protected]>
本示例的目的#
为了说明岭回归正则化是如何工作的,我们将创建一个无噪声数据集。然后,我们将在一系列正则化强度(\(\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")
解释图表#
左侧的图表显示了正则化强度(alpha
)如何影响岭回归系数。较小的 alpha
值(弱正则化)允许系数与用于生成数据集的真实系数(w
)非常相似。这是因为我们的人工数据集没有添加额外的噪声。随着 alpha
的增加,系数向零收缩,逐渐降低了以前更重要的特征的影响。
右侧的图表显示了模型找到的系数与真实系数(w
)之间的均方误差(MSE)。它提供了一个度量,用于衡量我们的岭回归模型与真实生成模型相比的精确程度。误差越低,意味着它找到的系数越接近真实生成模型的系数。在这种情况下,由于我们的玩具数据集是无噪声的,我们可以看到正则化程度最低的模型检索到的系数最接近真实系数(w
)(误差接近于 0)。
当 alpha
较小时,模型会捕捉训练数据的复杂细节,无论这些细节是由噪声还是实际信息造成的。随着 alpha
的增加,最高的系数会更快地收缩,使其对应的特征在训练过程中影响力降低。这可以增强模型泛化到未见过的数据的能力(如果有很多噪声需要捕捉),但如果正则化相对于数据包含的噪声量过强,也会带来性能损失的风险(如本例所示)。
在现实世界中,数据通常包含噪声,因此选择合适的 alpha
值对于在过拟合和欠拟合模型之间取得平衡至关重要。
在这里,我们看到 Ridge
通过对系数添加惩罚来对抗过拟合。出现的另一个问题与训练数据集中存在异常值有关。异常值是指与其他观测值显著不同的数据点。具体来说,这些异常值会影响我们之前展示的损失函数的左侧项。其他一些线性模型被设计成对异常值具有鲁棒性,例如 HuberRegressor
。您可以在 HuberRegressor 与 Ridge 在具有强异常值的数据集上的比较 示例中了解更多信息。
脚本总运行时间:(0 分钟 0.752 秒)
相关示例