共计 1740 个字符,预计需要花费 5 分钟才能阅读完成。
1. 初识欠拟合与过拟合
刚入门机器学习时,最让人头疼的就是模型在训练集上表现很好,但在测试集上却一塌糊涂。这往往就是遇到了欠拟合(Underfitting)或过拟合(Overfitting)问题。
- 欠拟合 :模型连训练数据都学不好,就像小学生做大学题,完全摸不着头脑
- 过拟合 :模型对训练数据学得太好,把噪声都记住了,就像死记硬背应付考试的学生

2. 问题诊断:你的模型生病了吗?
2.1 量化指标
通过这几个指标判断模型状态:
- 训练集准确率 << 测试集准确率 → 欠拟合
- 训练集准确率 >> 测试集准确率 → 过拟合
- 训练集和测试集准确率都很低 → 严重欠拟合
2.2 典型案例
欠拟合场景
- 用线性回归拟合 sin 函数
- 用逻辑回归处理高维非线性数据
- 特征工程只做了简单 one-hot 编码
过拟合场景
- 在 MNIST 上训练 100 层的 CNN
- 决策树不设 max_depth 限制
- 数据量 1000 条却使用包含 1 亿参数的模型
3. 解决方案大全
3.1 数据层面的处理
- 数据增强 :对图像进行旋转 / 翻转,对文本进行同义词替换
- 特征选择 :用 PCA 降维或 SelectKBest 筛选特征
- 增加数据量 :收集更多数据或使用 SMOTE 过采样
3.2 模型层面的调整
- 正则化 :
- L1 正则化(Lasso)会直接让某些权重归零
- L2 正则化(Ridge)会让所有权重均匀减小
- 早停法 :监控验证集 loss,提前停止训练
- Dropout:神经网络中随机丢弃部分神经元
3.3 评估方法
- 学习曲线 :观察训练 / 验证误差随数据量变化的趋势
- K 折交叉验证 :将数据分成 K 份,轮流做验证集
4. 实战代码演示
4.1 L2 正则化实现
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
# 数据标准化很重要!scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# alpha 就是正则化强度,建议从 0.1 开始尝试
ridge = Ridge(alpha=0.5)
ridge.fit(X_train_scaled, y_train)
print(f"训练集得分: {ridge.score(X_train_scaled, y_train):.2f}")
print(f"测试集得分: {ridge.score(X_test_scaled, y_test):.2f}")
4.2 学习曲线绘制
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
train_sizes, train_scores, val_scores = learning_curve(estimator=Ridge(alpha=1.0),
X=X_train,
y=y_train,
cv=5,
scoring='neg_mean_squared_error'
)
plt.figure(figsize=(10,6))
plt.plot(train_sizes, -train_scores.mean(1), label='训练误差')
plt.plot(train_sizes, -val_scores.mean(1), label='验证误差')
plt.xlabel('训练样本数')
plt.ylabel('MSE')
plt.legend()
plt.show()
5. 避坑指南
5.1 正则化系数选择
- 先用网格搜索确定大致范围
- 从 0.1、1、10 等数量级开始尝试
- 观察验证集表现,不要只看训练集
5.2 数据集划分
- 小数据(<1 万):70/15/15(训练 / 验证 / 测试)
- 中数据(1-10 万):80/10/10
- 大数据(>10 万):98/1/1
5.3 常见误区
- ❌ 无脑增加网络层数
- ❌ 在测试集上反复调参
- ❌ 忽略特征工程直接上复杂模型
6. 进阶思考
在实际业务中,我们还需要考虑:
- 当数据量很少时,如何在不增加数据的情况下提高模型泛化能力?
- 金融风控和推荐系统对模型泛化能力的要求有何不同?
解决这些问题需要我们在偏差(Bias)和方差(Variance)之间找到最佳平衡点,这也是机器学习工程师的核心能力之一。
正文完
发表至: 未分类
近两天内
