📜  毫升 |使用 Sklearn 实现 L1 和 L2 正则化(1)

📅  最后修改于: 2023-12-03 15:40:40.712000             🧑  作者: Mango

毫升 | 使用 Sklearn 实现 L1 和 L2 正则化

正则化是在模型训练过程中加入惩罚项,以避免模型过度拟合训练数据而导致泛化能力不佳的问题。其中,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 正则化

接下来,我们将对线性回归模型添加 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 正则化

接下来,我们将对线性回归模型添加 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 正则化。通过对波士顿房价数据集的线性回归任务进行实验,我们发现添加正则化项可以有效避免模型过度拟合的问题,提高模型的泛化能力。在实际应用中,我们可以根据具体问题的特点选择适合的正则化方法和超参数。