机器学习避坑指南:从原理到实践解决欠拟合与过拟合问题

1次阅读
没有评论

共计 1740 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

1. 初识欠拟合与过拟合

刚入门机器学习时,最让人头疼的就是模型在训练集上表现很好,但在测试集上却一塌糊涂。这往往就是遇到了欠拟合(Underfitting)或过拟合(Overfitting)问题。

  • 欠拟合 :模型连训练数据都学不好,就像小学生做大学题,完全摸不着头脑
  • 过拟合 :模型对训练数据学得太好,把噪声都记住了,就像死记硬背应付考试的学生

机器学习避坑指南:从原理到实践解决欠拟合与过拟合问题

2. 问题诊断:你的模型生病了吗?

2.1 量化指标

通过这几个指标判断模型状态:

  1. 训练集准确率 << 测试集准确率 → 欠拟合
  2. 训练集准确率 >> 测试集准确率 → 过拟合
  3. 训练集和测试集准确率都很低 → 严重欠拟合

2.2 典型案例

欠拟合场景

  • 用线性回归拟合 sin 函数
  • 用逻辑回归处理高维非线性数据
  • 特征工程只做了简单 one-hot 编码

过拟合场景

  • 在 MNIST 上训练 100 层的 CNN
  • 决策树不设 max_depth 限制
  • 数据量 1000 条却使用包含 1 亿参数的模型

3. 解决方案大全

3.1 数据层面的处理

  • 数据增强 :对图像进行旋转 / 翻转,对文本进行同义词替换
  • 特征选择 :用 PCA 降维或 SelectKBest 筛选特征
  • 增加数据量 :收集更多数据或使用 SMOTE 过采样

3.2 模型层面的调整

  1. 正则化
  2. L1 正则化(Lasso)会直接让某些权重归零
  3. L2 正则化(Ridge)会让所有权重均匀减小
  4. 早停法 :监控验证集 loss,提前停止训练
  5. 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. 进阶思考

在实际业务中,我们还需要考虑:

  1. 当数据量很少时,如何在不增加数据的情况下提高模型泛化能力?
  2. 金融风控和推荐系统对模型泛化能力的要求有何不同?

解决这些问题需要我们在偏差(Bias)和方差(Variance)之间找到最佳平衡点,这也是机器学习工程师的核心能力之一。

正文完
 0
评论(没有评论)