共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。
从业务场景看模型问题的严重性
最近和同事排查一个金融风控案例时发现:模型在训练集上准确率高达 99%,但上线后误判率飙升 30%。排查发现模型死记硬背了训练数据中的噪声(比如某些无关的用户注册时间特征),这就是典型的过拟合(Overfitting)。另一个电商推荐系统的案例则相反:无论怎么调整推荐策略,CTR 始终低于基线,学习曲线显示训练集和验证集效果都很差——典型的欠拟合(Underfitting)。

基础概念解析
- 过拟合的数学本质
- 训练误差 << 测试误差(例如:训练准确率 95% vs 测试准确率 65%)
- 模型复杂度远高于数据真实规律
-
常见于小数据集或特征工程过度时
-
欠拟合的典型特征
- 训练误差和测试误差双高(例如:训练准确率 60% vs 测试准确率 55%)
- 模型无法捕捉数据的基本模式
- 常见于模型过于简单或特征不足时
解决方案对比表
| 方法 | 适用场景 | 实现原理 | 代表技术 |
|---|---|---|---|
| 正则化 (Regularization) | 过拟合 | 惩罚过大参数值 | L1/L2 正则、Elastic Net |
| 早停 (Early Stopping) | 过拟合 | 监控验证集效果提前终止训练 | Keras callbacks |
| Dropout | 神经网络过拟合 | 随机屏蔽神经元 | tf.keras.layers.Dropout |
| 数据增强 (Data Augmentation) | 小数据过拟合 | 人工扩展数据多样性 | ImageDataGenerator |
| 增加模型复杂度 | 欠拟合 | 提升模型表达能力 | 更深网络、更多特征 |
实战代码演示
学习曲线绘制
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
def plot_learning_curve(estimator, title, X, y, cv=5):
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=cv, scoring='accuracy',
train_sizes=np.linspace(0.1, 1.0, 5))
plt.figure()
plt.plot(train_sizes, np.mean(train_scores, axis=1), 'o-', label="Training")
plt.plot(train_sizes, np.mean(test_scores, axis=1), 'o-', label="Validation")
plt.xlabel("Training examples")
plt.ylabel("Accuracy")
plt.legend()
plt.title(title)
plt.show()
# 示例调用(需提前准备好 X,y)try:
plot_learning_curve(RandomForestClassifier(), "Learning Curve", X, y)
except Exception as e:
print(f"绘图时发生错误: {str(e)}")
K 折交叉验证实现
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
params = {'n_estimators': [50, 100],
'max_depth': [3, 5],
'learning_rate': [0.01, 0.1]
}
try:
gbm = GradientBoostingClassifier()
cv_model = GridSearchCV(gbm, params, cv=5, scoring='roc_auc')
cv_model.fit(X_train, y_train)
print(f"最佳参数: {cv_model.best_params_}")
print(f"交叉验证平均分: {cv_model.best_score_:.3f}")
except ValueError as ve:
print(f"参数错误: {str(ve)}")
except Exception as e:
print(f"训练过程中出错: {str(e)}")
工程实践建议
- 特征工程与模型复杂度平衡
- 先做特征重要性分析(如 SHAP 值)
- 逐步添加特征观察验证集表现
-
使用 PCA 等降维技术处理高维特征
-
不同数据规模的应对策略
- 小数据(<1 万样本):优先考虑数据增强 + 简单模型
- 中数据(1-10 万):适当增加复杂度 + 正则化
- 大数据(>10 万):可尝试复杂模型 + 早停机制
延伸思考
- 当 A / B 测试的业务指标提升但测试误差上升时,该如何决策?建议优先考虑业务指标,但需监控模型稳定性
- 设计验证实验时,建议采用:
- 保留完全独立的测试集
- 观察不同数据子集的表现差异
- 检查特征重要性是否符合业务认知
在实际项目中,没有完美的解决方案,关键是通过持续监控找到 bias-variance tradeoff(偏差 - 方差权衡)的最佳平衡点。
正文完
发表至: 未分类
近两天内
