正则化:防止模型过拟合的利器

目录

引言:

常见的正则化方法

L1正则化(Lasso回归)

L2正则化(Ridge回归)

Elastic Net

Dropout

Early Stopping

正则化的应用实例

线性回归中的正则化


引言:

        在机器学习和深度学习的实践中,我们常常会遇到一个困扰——过拟合(Overfitting)。过拟合指的是模型在训练集上表现很好,但在测试集或新数据上表现不佳,这通常是因为模型过于复杂,学习到了训练数据中的噪声。为了解决这个问题,我们可以使用一种非常有效的技术——正则化

什么是正则化?

        正则化是一种防止机器学习模型过拟合的方法。它通过在模型的损失函数中加入额外的惩罚项,限制模型的复杂度,使得模型在训练数据上的表现更好,同时在未见过的数据上的泛化能力也更强。

常见的正则化方法

L1正则化(Lasso回归)

        L1正则化,也称为Lasso,通过在损失函数中加入权重绝对值的和作为惩罚项,迫使某些权重变为零,从而实现特征选择和模型稀疏化。其数学形式为:

        其中:原始损失 是模型的原始损失函数,例如均方误差(MSE)。λ是正则化参数,控制惩罚项的权重。wj是模型的第 j个权重。L1正则化的优点在于它可以产生稀疏模型,即一些权重被压缩到零,这在特征选择中非常有用。

L2正则化(Ridge回归)

        L2正则化,也称为Ridge回归,通过在损失函数中加入权重平方和作为惩罚项,抑制权重的增大,防止模型过拟合。其数学形式为:

Elastic Net

Elastic Net结合了L1和L2正则化的优点。其数学形式为:

Dropout

        Dropout是一种专门用于神经网络的正则化技术。在每次训练迭代中,随机忽略一部分神经元,以防止神经元之间的相互依赖,从而增强模型的泛化能力。

Early Stopping

        早停是通过在验证集的性能不再提升时,提前停止训练,来防止模型在训练集上训练过长时间,从而减少过拟合的风险。

正则化的应用实例

线性回归中的正则化

下面是一个使用Scikit-learn实现L1和L2正则化的示例代码:

import numpy as np
from sklearn.linear_model import Lasso, Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 生成示例数据
X = np.random.rand(100, 10)
y = X @ np.array([1.5, -2, 0, 0, 0, 1, 0, 0, 0, 0.5]) + np.random.randn(100) * 0.1

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Lasso回归(L1正则化)
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
y_pred_lasso = lasso.predict(X_test)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
lasso_selected_features = np.where(lasso.coef_ != 0)[0]

# Ridge回归(L2正则化)
ridge = Ridge(alpha=0.1)
ridge.fit(X_train, y_train)
y_pred_ridge = ridge.predict(X_test)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)

# 打印比较结果
print("Lasso回归与Ridge回归比较")
print("----------------------------")
print(f"Lasso回归均方误差: {mse_lasso}")
print(f"Ridge回归均方误差: {mse_ridge}\n")

print("Lasso回归选择的特征(非零系数):")
print(lasso_selected_features)
print(f"选择的特征数量: {len(lasso_selected_features)}\n")

print("Ridge回归模型系数:")
print(ridge.coef_)
print(f"非零系数的数量: {np.sum(ridge.coef_ != 0)}\n")

print("系数比较:")
print("特征\tLasso系数\tRidge系数")
for i in range(len(lasso.coef_)):
    print(f"{i}\t{lasso.coef_[i]:.4f}\t\t{ridge.coef_[i]:.4f}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值