注意
跳到最后下载完整示例代码。或通过JupyterLite或Binder在浏览器中运行此示例
岭系数作为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")

解释图表#
左侧的图表显示了正则化强度(alpha
)如何影响岭回归系数。alpha
值较小(弱正则化)时,系数与用于生成数据集的真实系数(w
)非常相似。这是因为我们的人工数据集没有添加额外的噪声。随着alpha
的增加,系数向零收缩,逐渐降低了以前更重要特征的影响。
右侧的图表显示了模型找到的系数与真实系数(w
)之间的均方误差(MSE)。它提供了一个衡量我们岭模型与真实生成模型精确度的指标。误差越低,表示其找到的系数越接近真实生成模型的系数。在这种情况下,由于我们的玩具数据集是无噪声的,我们可以看到正则化程度最低的模型获得的系数最接近真实系数(w
)(误差接近0)。
当alpha
很小时,模型会捕捉训练数据的复杂细节,无论是噪声引起的还是真实信息引起的。随着alpha
的增加,最大的系数会更快地收缩,使其对应的特征在训练过程中影响力减小。这可以增强模型泛化到未见数据的能力(如果存在大量噪声需要捕获),但如果正则化强度相对于数据中包含的噪声量变得过强(如本示例所示),也可能导致性能下降。
在数据通常包含噪声的实际场景中,选择合适的alpha
值对于在过拟合和欠拟合模型之间取得平衡至关重要。
在此,我们看到Ridge
为系数添加了惩罚以对抗过拟合。另一个问题与训练数据集中存在异常值有关。异常值是与其它观测值显著不同的数据点。具体来说,这些异常值会影响我们前面展示的损失函数的左侧项。其他一些线性模型,如HuberRegressor
,其构建方式使其对异常值具有鲁棒性。您可以在强异常值数据集上的HuberRegressor与Ridge对比示例中了解更多。
脚本总运行时间: (0分钟 0.645秒)
相关示例