欠拟合表现为train_scores和val_scores均偏低且接近,如均值0.45与0.42;此时应检查模型复杂度、特征完整性、标签处理,并避免cv折数过高或scoring参数误用。

learning_curve 返回的 train_scores 和 val_scores 都很高且接近,说明欠拟合
欠拟合最直接的表现是模型学不动:训练集和验证集得分都偏低,而且两条线几乎贴在一起。比如 train_scores 均值在 0.45 左右,val_scores 均值在 0.42,标准差都小于 0.03——这不是泛化问题,是模型根本没学到规律。
这时候别急着加数据,先检查三件事:
-
estimator是否太简单?比如用LinearRegression拟合明显非线性的数据 - 特征是否严重缺失?比如预测房价却只用了“面积”,漏了“地段”“房龄”“楼层”等关键变量
- 目标变量是否被错误缩放或编码?比如把多分类标签当回归目标喂给
Ridge
train_sizes 增大时 val_score 提升缓慢,也是欠拟合信号
调用 learning_curve 时传入 train_sizes=np.linspace(0.1, 1.0, 10),如果验证得分从 0.1 样本量到 1.0 样本量只从 0.52 升到 0.58,说明模型容量已经饱和,再多数据也带不动性能。
这种情况下,learning_curve 图上会看到两条线平行右移,但高度始终卡在低位。此时该做的不是收集更多样本,而是:
- 换算法:从线性模型切到
RandomForestRegressor或带多项式特征的Pipeline - 加特征:用领域知识构造交互项、分箱、统计聚合等新列
- 确认标签质量:欠拟合有时是标注噪声太大,模型干脆放弃拟合(比如医疗影像中部分标签错标)
cv 折数设太高会掩盖欠拟合,小数据集建议用 cv=3
默认 cv=5 在样本少于 200 条时容易让 val_scores 方差爆表(标准差 > 0.1),导致你以为模型不稳定,其实是交叉验证本身在抖。这时 learning_curve 图上验证线会剧烈上下跳,干扰判断。
实操建议:
- 样本量 cv=3,降低方差干扰
- 样本量 > 5000:可设
cv=2加速,不影响趋势判断 - 永远别用
.mean()全局平均val_scores;必须用.mean(axis=1)得到每个train_size下的均值
scoring 参数用错会导致 learning_curve 误判为欠拟合
如果你用 scoring='neg_mean_squared_error',learning_curve 返回的是负 MSE,数值越小反而代表误差越大。此时若没做 -val_scores.mean(axis=1) 转换,直接画图会看到“得分”是负的、且绝对值越来越大——容易误读成模型越来越差,其实只是符号没翻转。
常见踩坑点:
- 用误差类 scoring(如
'neg_log_loss'、'neg_mean_absolute_error')时,必须对返回值取负再分析 - 用得分类 scoring(如
'accuracy'、'f1')时,数值越大越好,可直接用 - 不确定时,先打印
train_scores[0]和val_scores[0]看第一组结果的原始值范围
learning_curve,先查数据切分逻辑和特征工程流水线。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











