在机器学习中,我们训练模型时,希望模型既能很好地拟合训练数据,又不要过于复杂(防止过拟合)。正则化就是用来防止模型过拟合的一种技术。本文重点带着伙伴们厘清对正则化的认识,便于能够灵活应用。
一、正则化的定义及形象比喻
正则化的定义:通过保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,我们称之为L2 正则化。听着绕口吧,给两个形象的比喻。
比喻1:想象你在学习跳舞(模型训练)。你的目标是在记住舞蹈动作(拟合训练数据)的同时,不要过度使用夸张的动作(防止过拟合)。L2正则化就像是教练在旁边提醒你:“动作要简洁,不要有太多多余的动作,保持优雅!”具体来说,教练会惩罚那些过于夸张的动作(即模型中过大的权重),这样你就会倾向于使用更柔和、幅度更小的动作(较小的权重),从而让整个舞蹈看起来更自然流畅(模型泛化能力更强)。
比喻2:想象教小孩认动物。
不正则化:孩子看到斑点狗就死记"白底黑斑=狗",结果把奶牛也认成狗(过拟合)
L2正则化:要求孩子总结更本质的特征(如体型、叫声),即使看到新动物也能正确分类(泛化能力)
L2正则化就像给模型戴上一副"近视眼镜",防止模型过度关注训练数据。惩罚项相当于老师强调:"不要只看皮毛斑点,注意整体特征!"。通过合理使用正则化,可以显著提高模型的泛化能力。
二、机器学习中正则化的常用方法
方法 | 实现方式 | 最佳场景 | 注意事项 |
---|---|---|---|
L1正则化 | 添加绝对值惩罚项(Lasso) | 特征选择/高维数据 | 可能过度稀疏化权重 |
L2正则化 | 添加平方惩罚项(Ridge) | 共线性数据/防止过拟合 | 保留所有特征但缩小权重 |
弹性网络 | L1+L2组合 | 高维且特征相关场景 | 需调两个超参数 |
Dropout | 神经网络中随机丢弃神经元 | 深度神经网络 | 仅用于训练阶段 |
早停法 | 验证集性能下降时停止训练 | 迭代训练模型(如NN/GBDT) | 需监控验证集 |
三、python有无正则化程序及运行效果对比
下面我们用一个简单的线性回归例子,使用多项式拟合,来展示正则化(这里用L2正则化,即岭回归)和没有正则化的区别。我们将使用一个简单的二次函数加噪声生成数据,然后用一个高阶多项式(比如9次)去拟合。没有正则化时,模型会过拟合;而使用正则化后,模型会更平滑。
python程序源代码如下。运行效果在程序的下面。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #解决中文不显示问题
# 在创建图形前设置字体
plt.rcParams['font.family'] = 'sans-serif' # 使用无衬线字体
#plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'SimHei'] # 备选字体列表
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 生成带噪声的二次曲线数据
np.random.seed(42)
X = np.linspace(0, 1, 30)
y = 0.5 * X**2 + X + 2 + np.random.normal(0, 0.15, 30)
# 创建对比模型
model_raw = make_pipeline(PolynomialFeatures(degree=15), # 故意用高次多项式诱发过拟合
LinearRegression())
model_l2 = make_pipeline(PolynomialFeatures(degree=15),
Ridge(alpha=0.8)) # L2正则化强度
# 训练模型
model_raw.fit(X[:, np.newaxis], y)
model_l2.fit(X[:, np.newaxis], y)
# 生成预测点
X_test = np.linspace(0, 1.2, 100)
y_raw = model_raw.predict(X_test[:, np.newaxis])
y_l2 = model_l2.predict(X_test[:, np.newaxis])
# 可视化对比
plt.figure(figsize=(10, 6))
plt.scatter(X, y, s=50, label='原始数据', zorder=3)
plt.plot(X_test, y_raw, 'r--', lw=2, label='无正则化(过拟合)')
plt.plot(X_test, y_l2, 'g-', lw=3, label='L2正则化')
plt.xlabel('X'), plt.ylabel('y')
plt.title('正则化 vs 无正则化 效果对比')
plt.legend(), plt.grid(alpha=0.3)
plt.show()
四、给应用者的一些实用建议
1.优先尝试L2正则化:大多数场景效果良好且稳定
2.数据预处理:正则化前务必做特征标准化(权重惩罚对尺度敏感)
3.警惕信号:当训练/验证误差差距过大时(>30%),应增强正则化
核心原则:正则化不是追求训练集完美,而是让模型学会抓住重点,如同培养善于举一反三的学生而非死记硬背的考试机器。
以上是本文的内容。
伙伴们点赞、收藏、加关注吧,谢谢啦。