我想整理一个示例笔记本来演示正则化如何对简单的线性回归等简单模型产生影响。但是,在执行以下脚本时,我注意到LinearRegression()
和Ridge()
模型都返回相同coef_
的intercept_
回归图,因此无论我如何更改正则化强度。
该数据是一个小型数据集,其中包含一组国家(n=40)的 2021 年人均 GDP(以美元计)和生活满意度得分。使用回归线绘制的数据集如下所示:
在Aurélien Géron 的 Hands-On Machine Learning with Scikit-Learn and TensorFlow 一书(第 27 页)中,我阅读了以下内容:
约束模型以使其更简单并降低过度拟合的风险称为正则化。例如,我们之前定义的线性模型有两个参数,θ0和θ1。这为学习算法提供了两个自由度来使模型适应训练数据:它可以调整直线的高度 ( θ0 ) 和斜率 ( θ1 )。(...) 如果我们允许算法修改 θ1 但我们强制它保持较小,那么学习算法将产生一个比两个自由度更简单的模型,但比只有一个自由度更复杂。
基于此,我了解到通过包含alpha
超参数(即正则化 lambda),我实质上对 和 的平方和施加了额外的约束coef_
,intercept_
从而迫使模型在训练期间对其进行调整,因为新的成本函数现在包括 lambda 项。在我当前的设置中,coef_
(斜率)在 1e-5 的范围内,而intercept_
在 5.75 左右。它们的平方和约为 33。我希望正则化模型会减少 ,intercept_
因为这对平方和的影响要大得多coef_
。然而,当Ridge(alpha=...)
以任何alpha
值运行时,学习到的参数(以及回归图)与非正则化简单线性回归的参数相同。
我在这里误解了一些基本的东西吗?我怎么能看到正则化对这样一个模型的影响?
我的完整代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge
X = np.c_[df['GDP_2021']]
y = np.c_[df['LifeSatisf']]
model1 = LinearRegression()
model1.fit(X, y)
model2 = Ridge(alpha=100)
model2.fit(X, y)
print("Coefs model 1: ", model1.coef_, model1.intercept_)
print("Coefs model 2: ", model2.coef_, model2.intercept_)
x_new = np.linspace(0, 140000, 10000)[:, np.newaxis]
y_1 = model1.predict(x_new).flatten().tolist()
y_2 = model2.predict(x_new).flatten().tolist()
plt.figure(figsize=(10, 3))
ax = plt.axes()
ax.scatter(df['GDP_2021'], df['LifeSatisf']);
ax.plot(x_new, y_1, c='r', linestyle='--');
ax.plot(x_new, y_2, c='b', linestyle='--');
plt.title("Life satisfaction vs. GDP per capita regression models");
plt.xlabel("GDP per capita (2021) [US$]");
plt.ylabel("Life satisfaction [-]");
数据集为逗号分隔文件:
Country,LifeSatisf,GDP_2021
Australia,7.3,62618.59
Austria,7.1,53793.37
Belgium,6.9,50412.71
Canada,7.4,52791.23
Czech Republic,6.7,25806.38
Denmark,7.6,67919.59
Finland,7.6,53522.57
France,6.5,45028.27
Germany,7.0,50787.86
Greece,5.4,19827.16
Hungary,5.6,18527.59
Iceland,7.5,68843.65
Ireland,7.0,102394.02
Italy,6.0,35584.88
Japan,5.9,40704.3
Korea,5.9,35195.52
Luxembourg,6.9,131301.6
Mexico,6.5,9967.39
Netherlands,7.4,57714.88
New Zealand,7.3,48348.99
Norway,7.6,82244.23
Poland,6.1,17318.5
Portugal,5.4,24457.14
Slovak Republic,6.2,21383.29
Spain,6.3,30536.86
Sweden,7.3,58639.19
Switzerland,7.5,93515.48
Turkey,5.5,9406.58
United Kingdom,6.8,46200.26
United States,6.9,69375.38
Brazil,6.4,7741.15
Chile,6.5,16799.37
Estonia,5.7,27100.74
Israel,7.2,49840.25
Latvia,5.9,19538.9
Russia,5.8,11273.24
Slovenia,5.9,28939.27
South Africa,4.7,6861.17
Colombia,6.3,5892.14
Lithuania,5.9,22411.65