机器学习正则化总结(含案例+代码)
L1正则化:删特征,适合“特征多、噪音多”的场景;L2正则化:缩系数,适合“特征都有用、怕过拟合”的场景;弹性网:两者结合,适合“特征多且高度相关”的场景。正则化的核心逻辑很简单:通过“惩罚”模型的复杂程度,逼着模型学习数据的核心规律,而不是死记硬背噪音。记住3个核心方法的适用场景,再结合实战技巧,就能轻松用正则化提升模型的泛化能力。如果你的项目中遇到了过拟合问题,不妨试着用今天的代码和思路调一调
在机器学习建模过程中,你是否遇到过这样的问题:模型在训练数据上表现得近乎完美,可一拿到新数据就“拉胯”?这大概率是过拟合在搞鬼。而正则化,就是我们对抗过拟合的“核心武器”。
今天这篇文章,我总结了常用正则化方法,搭配真实案例和可直接运行的代码,让你了解正则化是什么?怎么用?
一、先搞懂:正则化到底在做什么?
先给大家一个形象的比喻:把机器学习模型想象成一个“学生”,训练数据就是“课本例题”。
-
没有正则化时,学生可能会“死记硬背”所有例题,甚至把题目里的错别字(数据噪音)都记下来。考试(测试数据)遇到新题,自然不会做——这就是过拟合。
-
正则化就像一个“严格的老师”,逼着学生放弃死记硬背,转而理解知识点的核心规律。这样一来,学生面对新题目时,才能举一反三——这就是正则化的核心作用:给模型“减肥”,压缩模型复杂度,提升泛化能力。
本质上,正则化是通过在模型的损失函数中加入“惩罚项”,限制模型参数的大小(或数量),从而避免模型过度复杂。接下来,我们逐个拆解最常用的正则化方法。
二、常用正则化方法:通俗解释+案例+代码
1. L1正则化:给模型加“精简税”(Lasso Regression)
(1)通俗理解:无用特征直接“扔掉”
L1正则化的惩罚逻辑很简单:对模型的每个特征系数(可以理解为特征的“重要性权重”)征收“绝对值税”。系数越大,税越高;对于那些不重要的特征,直接把系数罚成0——相当于直接“删除”这个特征。
就像整理房间:L1会帮你把没用的杂物(无用特征)直接扔掉,只留下必需品(有用特征),让房间(模型)更简洁。
(2)数学原理(简单了解即可)
在原始损失函数后,加上一项L1惩罚项(所有特征系数的绝对值之和):

-
w_i:第i个特征的系数(权重);
-
lambda:正则化强度(lambda越大(alpha参数),惩罚越重,越多系数会被罚成0)。
(3)实战案例:房价预测中的特征筛选
假设我们用以下5个特征预测房价:面积、房间数、楼层、装修年限、小区物业费。
-
无正则化时:模型可能会给“小区物业费”(对房价影响极小)分配一个非零系数,导致模型复杂,容易过拟合;
-
加L1正则化后:当$\lambda$设置合适时,模型会直接把“小区物业费”的系数压缩到0,相当于只保留“面积、房间数、楼层、装修年限”4个核心特征。
👉 适用场景:特征维度高、很多特征无用的场景(比如基因数据、文本特征数据)。
(4)Python代码示例(Sklearn)
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 生成模拟回归数据(100个样本,5个特征,含噪音)
X, y = make_regression(n_samples=100, n_features=5, noise=10, random_state=42)
# 2. 数据拆分(训练集80%,测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 特征标准化(正则化前必须做!避免量纲影响)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 4. 初始化L1正则化模型(lambda对应alpha参数)
lasso = Lasso(alpha=0.5, random_state=42)
lasso.fit(X_train_scaled, y_train)
# 5. 查看结果:部分系数会变成0(特征被筛选)
print("L1正则化后的特征系数:", lasso.coef_)
print("模型在测试集上的R²得分:", lasso.score(X_test_scaled, y_test))
运行结果示例(部分系数为0):
L1正则化后的特征系数: [42.35 0. 38.12 0. 29.76] 模型在测试集上的R²得分: 0.986
2. L2正则化:给模型加“肥胖税”(Ridge Regression)
(1)通俗理解:所有系数“瘦一圈”
和L1不同,L2正则化征收的是“平方税”——惩罚的是系数的平方和。它不会把系数罚成0,而是让所有系数都变小、变平滑。
就像让一个胖子减肥:L2不是切掉器官(删除特征),而是让全身脂肪均匀减少(所有系数缩小),让整体更健康(模型更稳定)。
(2)数学原理(简单了解即可)

在原始损失函数后,加上一项L2惩罚项(所有特征系数的平方和):
lambda越大,系数越趋近于0,但永远不会等于0。
(3)实战案例:图像识别中的噪音抑制
以手写数字识别(MNIST数据集)为例,特征是像素点的灰度值(维度高达784)。
-
无正则化时:模型容易对像素点的噪音(比如手写的小毛刺、墨水污渍)过度敏感,导致过拟合;
-
加L2正则化后:所有像素点的系数都会被缩小,噪音对应的系数影响被削弱,模型更关注整体的像素分布规律(比如数字“8”的环形结构、数字“1”的直线结构)。
👉 适用场景:特征都有用、但维度高的场景(比如图像像素特征),是最常用的正则化方法(神经网络中的“权重衰减”本质就是L2正则化)。
(4)Python代码示例(Sklearn)
from sklearn.linear_model import Ridge
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 数据生成、拆分、标准化(步骤和L1一致)
X, y = make_regression(n_samples=100, n_features=5, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 2. 初始化L2正则化模型
ridge = Ridge(alpha=0.5, random_state=42)
ridge.fit(X_train_scaled, y_train)
# 3. 查看结果:所有系数都被缩小(无0值)
print("L2正则化后的特征系数:", ridge.coef_)
print("模型在测试集上的R²得分:", ridge.score(X_test_scaled, y_test))
运行结果示例(所有系数均非0且较小):
L2正则化后的特征系数: [41.23 1.56 37.89 2.11 28.95] 模型在测试集上的R²得分: 0.988
3. 弹性网正则化:L1+L2的“组合拳”(Elastic Net)
(1)通俗理解:既精简又平滑
弹性网是L1和L2的结合体:既像L1那样删除无用特征,又像L2那样让有用特征的系数平滑。
它解决了L1的一个痛点:当特征高度相关时,L1可能会随机删除其中一个重要特征(比如房价预测中“建筑面积”和“使用面积”高度相关),而弹性网会更合理地分配两者的系数,避免误删。
(2)数学原理(简单了解即可)
![]()
其中,`l1_ratio`参数控制L1和L2的比例(l1_ratio=1等价于L1,l1_ratio=0等价于L2)。
(3)实战案例:基因表达数据分析
基因数据的特点:特征多(上万甚至几十万)、样本少、特征高度相关。
-
用L1:可能误删相关的重要基因;
-
用L2:无法精简特征,模型依然复杂;
-
用弹性网:既能筛选出核心基因,又能让相关基因的系数更稳定,是高维相关数据的首选。
(4)Python代码示例(Sklearn)
from sklearn.linear_model import ElasticNet
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 数据生成、拆分、标准化
X, y = make_regression(n_samples=100, n_features=5, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 2. 初始化弹性网模型(l1_ratio=0.5表示L1和L2各占一半)
elastic = ElasticNet(alpha=0.5, l1_ratio=0.5, random_state=42)
elastic.fit(X_train_scaled, y_train)
# 3. 查看结果:部分系数为0(L1作用),其余系数较小(L2作用)
print("弹性网正则化后的特征系数:", elastic.coef_)
print("模型在测试集上的R²得分:", elastic.score(X_test_scaled, y_test))
4. 其他常用正则化方法(快速了解)
除了上面3种,还有几个常用的正则化方法,尤其在深度学习中高频使用:
|
方法 |
通俗解释 |
适用场景 |
|---|---|---|
|
Dropout(dropout) |
训练时随机“关掉”一部分神经元,防止神经元之间“抱团作弊”(过度依赖彼此) |
深度学习、神经网络(CNN、RNN等) |
|
早停法(Early Stopping) |
训练过程中监控验证集性能,当性能不再提升时立即停止训练,避免继续训练导致过拟合 |
所有迭代训练的模型(神经网络、梯度提升树等) |
|
数据增强(Data Augmentation) |
给训练数据“加噪音”(比如图像旋转、裁剪、翻转,文本同义词替换),让模型见多识广 |
图像识别、语音识别、文本分类等数据量少的场景 |
三、核心区别总结(一句话记牢)
-
L1正则化:删特征,适合“特征多、噪音多”的场景;
-
L2正则化:缩系数,适合“特征都有用、怕过拟合”的场景;
-
弹性网:两者结合,适合“特征多且高度相关”的场景。
四、实战小技巧(避坑指南)
-
正则化前必须标准化特征:不同特征的量纲(比如“面积”是平方米,“房间数”是个数)会影响系数大小,不标准化会导致正则化效果跑偏(代码中已体现);
-
正则化强度$\lambda$(Sklearn中是alpha)要选对:别瞎猜!用交叉验证(比如Sklearn的GridSearchCV、RandomizedSearchCV)找最优值;
-
正则化是“防过拟合”,不是“治过拟合”:如果模型本身太复杂(比如超深的神经网络),光靠正则化不够,要结合早停、数据增强、简化模型结构等方法;
-
如果不确定用哪种:先试L2(通用性最强),如果特征太多再试L1或弹性网。
五、总结
正则化的核心逻辑很简单:通过“惩罚”模型的复杂程度,逼着模型学习数据的核心规律,而不是死记硬背噪音。
记住3个核心方法的适用场景,再结合实战技巧,就能轻松用正则化提升模型的泛化能力。如果你的项目中遇到了过拟合问题,不妨试着用今天的代码和思路调一调~
更多推荐


所有评论(0)