📅  最后修改于: 2023-12-03 15:40:40.712000             🧑  作者: Mango
正则化是在模型训练过程中加入惩罚项,以避免模型过度拟合训练数据而导致泛化能力不佳的问题。其中,L1 正则化在模型中添加的惩罚项是每个特征的绝对值之和,而 L2 正则化则是每个特征的平方和。
在 Sklearn 中,实现 L1 和 L2 正则化非常简单。我们可以使用 sklearn.linear_model
模块中的 Lasso
类和 Ridge
类,分别对应 L1 和 L2 正则化。
下面,我们将演示如何使用 Sklearn 实现 L1 和 L2 正则化,并将其应用于波士顿房价数据集的线性回归任务。
首先,我们需要导入必要的 Python 库,并加载波士顿房价数据集。我们将使用 Sklearn 中自带的数据集加载函数 load_boston
。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
# 加载波士顿房价数据集
boston = load_boston()
# 提取数据集中的特征和标签
X = boston.data
y = boston.target
# 输出数据集特征和标签的形状
print("X shape: ", X.shape)
print("y shape: ", y.shape)
输出结果:
X shape: (506, 13)
y shape: (506,)
数据集共有 506 个样本和 13 个特征。接下来,我们将对数据集进行归一化处理,使得每个特征的取值范围都落在 [0, 1] 区间内。
from sklearn.preprocessing import MinMaxScaler
# 对数据集进行归一化处理
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
# 输出部分样本的特征值
print(X[:5])
输出结果:
[[0. 0.18 0.06781525 0. 0.31481481 0.57750527
0.28321318 0.66666667 0. 0.20801527 0.28723404 1.
0.08967991]
[0. 0.06666667 0.24230205 0. 0.17283951 0.54799772
0.55364807 0.66666667 0. 0.10496183 0.55319149 1.
0.2044702 ]
[0. 0.06666667 0.24230205 0. 0.17283951 0.6943859
0.39666667 0.66666667 0.04 0.10496183 0.55319149 0.98973756
0.06346578]
[0. 0. 0.06304985 0. 0.15020576 0.65855512
0.46880734 0.33333333 0.04 0.06679389 0.64893617 0.99427612
0.03338852]
[0. 0.06666667 0.24230205 0. 0.17283951 0.68710566
0.53472222 0.66666667 0.04 0.13076923 0.55319149 1.
0.09933775]]
接下来,我们将对线性回归模型添加 L1 正则化,并使用交叉验证法对模型进行评估。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Lasso
# 创建 Lasso 模型并进行交叉验证
lasso = Lasso(alpha=0.01)
scores = cross_val_score(lasso, X, y, cv=5)
# 输出模型的交叉验证得分
print(scores)
print("Mean score: ", np.mean(scores))
输出结果:
[0.79383707 0.71261534 0.67322433 0.35518967 0.16868575]
Mean score: 0.5407102332223253
可以看到,添加 L1 正则化后,模型的泛化能力得到了提升。
接下来,我们将对线性回归模型添加 L2 正则化,并使用交叉验证法对模型进行评估。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Ridge
# 创建 Ridge 模型并进行交叉验证
ridge = Ridge(alpha=0.01)
scores = cross_val_score(ridge, X, y, cv=5)
# 输出模型的交叉验证得分
print(scores)
print("Mean score: ", np.mean(scores))
输出结果:
[0.79569278 0.71249651 0.6775491 0.35920368 0.16861635]
Mean score: 0.5427112849256474
可以看到,添加 L2 正则化后,模型的泛化能力也得到了提升。
在本篇教程中,我们介绍了如何使用 Sklearn 实现 L1 和 L2 正则化。通过对波士顿房价数据集的线性回归任务进行实验,我们发现添加正则化项可以有效避免模型过度拟合的问题,提高模型的泛化能力。在实际应用中,我们可以根据具体问题的特点选择适合的正则化方法和超参数。