共计 2143 个字符,预计需要花费 6 分钟才能阅读完成。
什么是过拟合?为什么需要警惕它
过拟合就像学生死记硬背考试题却不会举一反三。具体表现为:

- 训练集上表现优异(比如准确率 95%)
- 验证集上大幅下滑(比如只剩 60%)
- 模型记住了数据噪声而非真实规律
这种情况会导致模型在实际应用中完全失效,比如医疗诊断错误、金融预测失误等严重后果。
三招识别过拟合
1. 训练集 vs 验证集成绩对比
最直接的判断方法:
- 划分 20-30% 数据作为验证集(使用 sklearn 的 train_test_split)
- 分别计算两个集合的评估指标(准确率、F1 值等)
- 典型过拟合特征:
- 训练集指标持续上升
- 验证集指标先升后降
2. 学习曲线可视化
更直观的方法是通过 matplotlib 绘图:
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
train_sizes, train_scores, val_scores = learning_curve(
estimator=model,
X=X_train,
y=y_train,
cv=5, # 交叉验证折数
scoring='accuracy' # 评估指标
)
# 绘制均值曲线
plt.plot(train_sizes, train_scores.mean(axis=1), label='训练集')
plt.plot(train_sizes, val_scores.mean(axis=1), label='验证集')
plt.legend()
健康曲线:两条线最终接近
过拟合曲线:验证集线明显低于训练线
3. 交叉验证验证稳定性
使用 5 折或 10 折交叉验证:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
print(f"各折成绩差异:{scores.std():.2f}")
如果各折成绩波动很大(标准差 >0.1),很可能存在过拟合
Python 实战诊断示例
完整流程包含数据准备到可视化:
# 数据准备
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# 划分数据集
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3)
# 使用复杂模型人为制造过拟合
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=10) # 故意设置过大深度
model.fit(X_train, y_train)
# 评估差异
print(f"训练集准确率:{model.score(X_train, y_train):.2f}")
print(f"验证集准确率:{model.score(X_val, y_val):.2f}")
# 输出典型过拟合结果示例:# 训练集准确率:1.00
# 验证集准确率:0.78
新手常见踩坑点
数据泄露
错误做法:
# 错误!先归一化再划分数据集
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X) # 泄露了验证集信息
X_train, X_val = train_test_split(X_scaled) # 这样划分无效
正确做法:
X_train, X_val = train_test_split(X)
scaler.fit(X_train) # 仅用训练集拟合
X_train_scaled = scaler.transform(X_train)
X_val_scaled = scaler.transform(X_val) # 验证集用相同参数转换
指标选择陷阱
分类问题中:
– 类别不平衡时不要用 accuracy
– 推荐使用 roc_auc 或 f1_score
小数据集处理
当数据量 <1000 时:
– 优先使用交叉验证而非单次划分
– 考虑分层抽样(stratify 参数)
– 可用学习曲线判断是否需要更多数据
改善过拟合的三大法宝
- 正则化 :
- L1/L2 正则化(逻辑回归的 C 参数、神经网络的 weight_decay)
-
决策树的 max_depth 参数
-
早停 (Early Stopping):
from sklearn.neural_network import MLPClassifier model = MLPClassifier(early_stopping=True) # 自动停止训练 -
数据增强 :
- 图像:旋转 / 裁剪
- 文本:同义词替换
动手练习建议
- 在鸢尾花数据集上尝试:
- 调整决策树 max_depth 观察过拟合变化
-
对比有 / 无数据标准化的影响
-
进阶挑战:
- 用 Pytorch 实现带早停机制的神经网络
- 在房价预测任务中测试 L2 正则化效果
记住:过拟合诊断是模型调优的起点,建议保存每次实验的验证结果,逐步积累调参经验。
正文完
发表至: 未分类
近两天内
