机器学习/深度学习中,防止过拟合的方法

        在深度学习中,正则化的作用是防止模型过拟合(overfitting),从而提高模型在新数据上的泛化能力。过拟合是指模型在训练数据上表现良好,但在未见过的测试数据上表现不佳。这通常是因为模型过于复杂,以至于它不仅学习到了数据的模式,还捕捉到了数据中的噪声。

1.L1 正则化(Lasso)

        L1 正则化通过对模型的权重绝对值求和后乘以一个正则化参数加到损失函数上,迫使一些权重变为零,从而产生一个稀疏模型。这种方法有助于特征选择,因为它倾向于保留对预测最重要的特征,减少不必要的特征。

 其中,​ Wi表示是模型的权重参数,λ 是正则化强度的超参数,控制着正则化项的影响力。

L1 正则化通过在原始损失函数(如 MSE 或交叉熵)上添加权重绝对值之和的惩罚项,使得某些权重趋向于零,从而实现稀疏性。

下面是例子


#使用 Lasso 回归模型来代替原来的线性回归模型。Lasso 回归会在损失函数中加入 L1 正则化项。
from sklearn.linear_model import Lasso

# 构建 Lasso 回归模型
model = Lasso(alpha=1.0)  # alpha 为正则化强度参数 λ

model.fit(X_train, y_train)

#在测试集上评估模型的性能,看看是否有过拟合现象的缓解。
y_pred = model.predict(X_test)

#通过调整 alpha 参数来控制正则化的强度。如果发现模型仍然过拟合,尝试增大 alpha 值;如果模型表现欠拟合,尝试减小 alpha 值。
# 调整 alpha
model = Lasso(alpha=0.1)
model.fit(X_train, y_train)
import torch
import torch.nn as nn
import torch.optim as optim

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_dim, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# L1 正则化
l1_lambda = 0.01
for epoch in range(num_epochs):
    for data in dataloader:
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        l1_norm = sum(p.abs().sum() for p in model.parameters())
        loss += l1_lambda * l1_norm
        loss.backward()
        optimizer.step()

 在上面的机器学习的例子中,是直接调用的Lasso模型,当然我们也可以在常规的线性模型中手动添加L1正则化损失

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 构建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)


import numpy as np

# 计算原始损失
mse = mean_squared_error(y_test, y_pred)

# 添加 L1 正则化项
l1_lambda = 0.01  # L1 正则化强度
l1_penalty = l1_lambda * np.sum(np.abs(model.coef_))

# 总损失
total_loss = mse + l1_penalty

print("Original MSE:", mse)
print("L1 Penalty:", l1_penalty)
print("Total Loss with L1 Regularization:", total_loss)

2.L2 正则化(Ridge)

        L2 正则化,也称为 Ridge 回归或 Tikhonov 正则化,是深度学习和机器学习中的一种常用正则化方法。L2 正则化通过在原始损失函数中加入权重平方和的惩罚项,使得模型的权重不会变得过大,从而避免模型对训练数据的噪声过度敏感。

  • Wi​ 是模型的权重参数。
  • λ 是正则化强度的超参数,控制着正则化项的影响力。

 

 

from sklearn.linear_model import Ridge

# 构建 Ridge 回归模型
model = Ridge(alpha=1.0)  # alpha 即为正则化强度参数 λ

扩展:L1和L2二者区别

1 L1正则化

        L1 正则化倾向于生成稀疏的权重矩阵,这意味着它会将某些权重缩小到零。这种稀疏性使得 L1 正则化特别适合特征选择和生成稀疏模型。在高维数据集中特别有用,因为它能自动筛选出对模型影响最大的特征。

        由于 L1 正则化的损失函数不光滑(因为绝对值函数在 0 处不可导),优化时较为困难。通常需要使用特定的优化技术,如坐标下降法或次梯度下降法。

        L1 正则化通过将某些权重设为零,有效地简化了模型,减少了模型的复杂性。这使得模型更容易解释,同时也有助于防止过拟合。

        L1 正则化对异常值较为鲁棒,因为它倾向于选择更少的特征,异常值对损失函数的贡献较小。这使得 L1 正则化在处理数据中存在离群点时表现得更为稳健。

        L1 正则化适用于需要特征选择的场景,特别是在稀疏高维数据集中,或者当你希望自动化地筛选出最重要特征时。它也常用于模型简化和提高模型可解释性的任务中。

2 L2正则化

        L2 正则化不会将权重缩小到零,而是均匀地缩小权重值,使得模型更加平滑。它不会自动选择特定特征,而是保留了所有特征的贡献。

        L2 正则化的损失函数是光滑的,因此可以使用标准的梯度下降或其他常规优化算法进行优化。这使得 L2 正则化在实际应用中更为简单和高效。

        L2 正则化通过控制权重的大小来限制模型的复杂性,但不会强制任何权重为零。因此,它在处理特征之间高度相关的数据时表现良好,有助于防止过拟合。

        L2 正则化对异常值更为敏感,因为它会平方所有的权重,从而放大了异常值的影响。因此,在存在异常值的数据集中,L2 正则化可能不如 L1 正则化鲁棒。

        L2 正则化更适合处理特征之间相关性较高的数据集,或者当你希望保留所有特征时。它也常用于神经网络等复杂模型中,以防止模型过拟合并提升模型的泛化能力。

3 Elastic Net

Elastic Net是一种结合了 L1 正则化(Lasso)和 L2 正则化(Ridge)的回归算法。它通过在损失函数中同时包含 L1 和 L2 正则化项,来同时利用两者的优点。这种方法特别适用于在高维数据中存在多重共线性(即特征之间存在强相关性)的情况。

from sklearn.linear_model import ElasticNet

# 构建 Elastic Net 模型
model = ElasticNet(alpha=1.0, l1_ratio=0.5)  # alpha 控制整体正则化强度,l1_ratio 控制 L1 和 L2 的比例

# 训练模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

 

        由于包含 L1 正则化项,Elastic Net 能够自动选择特征,生成稀疏的权重矩阵,将一些不重要的特征权重缩小到零。

        L2 正则化项使得 Elastic Net 能够处理特征之间的多重共线性问题。当特征之间高度相关时,Lasso 可能会随机选择其中一个特征,而 Elastic Net 通过 L2 正则化项可以同时保留相关的特征。

        Elastic Net 能够灵活地平衡 L1 和 L2 正则化的优点。通过调节 λ1​ 和 λ2​ 的值,Elastic Net 可以在特征选择和处理共线性之间找到最佳平衡点。

3.Dropout

Dropout 是一种在训练过程中随机忽略(即“丢弃”)部分神经元的正则化技术。这种方法迫使神经网络的不同部分独立地学习特征,从而防止模型对特定神经元的过度依赖,增加模型的鲁棒性和泛化能力。

4.数据增强(Data Augmentation)

数据增强是通过对训练数据进行随机变换(如翻转、旋转、缩放等)来生成更多样的数据样本,帮助模型学习更广泛的数据模式,从而减少过拟合。

5.早停(Early Stopping)

早停是一种在模型训练过程中监控验证集性能的方法。当验证集的性能开始恶化时(即模型开始过拟合训练数据),训练过程会提前停止,从而防止过拟合。

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值