机器学习中的正则化
机器学习中的正则化
在机器学习中,正则化是一种用于防止过拟合的技术。过拟合发生在模型过于复杂、拟合训练数据过于完美,但无法泛化到新的未见过数据时。正则化通过在损失函数中引入惩罚项,鼓励模型具有较小的权重和更简单的结构,从而减少过拟合。
机器学习中常用的正则化技术有多种,包括 L1 和 L2 正则化、dropout 正则化和早停(early stopping)。本文将重点介绍最常用的 L1 和 L2 正则化。
L1 正则化
L1 正则化,也称为 Lasso 正则化,是一种在损失函数中添加惩罚项的技术,该惩罚项等于权重之和的绝对值。L1 正则化惩罚项的公式为 −
$$\lambda \times \Sigma \left|w_{i} \right|$$
其中 $\lambda$ 是一个控制正则化强度的超参数,$w_i$ 是模型中的第 i 个权重。
L1 正则化惩罚项的效果是鼓励模型具有稀疏权重,即消除对输出影响很小或没有影响的权重。这简化了模型并减少了过拟合。
示例
要在 Python 中实现 L1 正则化,可以使用 scikit-learn 库中的 Lasso class。以下是如何在 linear regression 中使用 L1 正则化的示例 −
from sklearn.linear_model import Lasso
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载 Boston Housing 数据集
boston = load_boston()
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)
# 创建带有 L1 正则化的 Lasso 模型
lasso = Lasso(alpha=0.1)
# 在训练数据上训练模型
lasso.fit(X_train, y_train)
# 在测试数据上进行预测
y_pred = lasso.predict(X_test)
# 计算预测的均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean squared error:", mse)
在这个示例中,我们加载 Boston Housing 数据集,将其拆分为训练集和测试集,并使用 alpha 值 0.1 创建带有 L1 正则化的 Lasso 模型。然后在训练数据上训练模型,并在测试数据上进行预测。最后,计算预测的均方误差。
输出
执行此代码时,将产生以下输出 −
Mean squared error: 25.155593753934173
L2 正则化
L2 正则化,也称为 Ridge 正则化,是一种向损失函数添加惩罚项的技术,该惩罚项等于权重的平方和。其 L2 正则化惩罚项的公式为 −
$$\lambda \times \Sigma\left (w_{i} \right )^{2}$$
其中 $\lambda$ 是一个超参数,用于控制正则化的强度,$w_i$ 是模型中的第 i 个权重。
L2 正则化惩罚项的作用是鼓励模型具有较小的权重,即减小模型中所有权重的幅度。这具有平滑模型并减少过拟合的效果。
示例
要在 Python 中实现 L2 正则化,我们可以使用 scikit-learn 库中的 Ridge 类。以下是如何为线性回归使用 L2 正则化的示例 −
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
import numpy as np
# 加载波士顿房价数据集
boston = load_boston()
# 创建特征和目标数组
X = boston.data
y = boston.target
# 标准化特征数据
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义带有 L2 正则化的 Ridge 回归模型
model = Ridge(alpha=0.1)
# 在训练数据上拟合模型
model.fit(X_train, y_train)
# 在测试数据上进行预测
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error: ", mse)
在这个示例中,我们首先加载波士顿房价数据集并将其分割为训练集和测试集。然后,我们使用 StandardScaler 标准化特征数据。
接下来,我们定义 Ridge 回归模型,并将 alpha 参数设置为 0.1,该参数控制 L2 正则化的强度。
我们在训练数据上拟合模型,并在测试数据上进行预测。最后,我们计算均方误差来评估模型的性能。
输出
执行此代码时,将产生以下输出 −
Mean Squared Error: 24.29346250596107