判断欠拟合或过拟合,不能只看一次训练分数。学习曲线把训练样本量逐步增大,并在交叉验证中同时记录训练分数和验证分数:两者都低通常先检查模型表达能力或特征;训练高而验证低则优先处理泛化差距。
先把问题变成可比较的曲线
固定模型、预处理、交叉验证折数和评分指标,只改变训练样本量。分类数据类别不均衡时,示例使用 StratifiedKFold 保持各折类别比例;业务更关心少数类时,把 scoring 从 accuracy 换成 f1、recall 或自定义评分。

标题结论:比较最后几个规模点的训练均值、验证均值和两者差距,才能把欠拟合、过拟合与样本不足区分开。
可运行示例
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, learning_curve
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=2000))
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
sizes, train, valid = learning_curve(
model, X, y, train_sizes=[0.2, 0.4, 0.6, 0.8, 1.0],
cv=cv, scoring="f1", n_jobs=1
)
for n, tr, va in zip(sizes, train.mean(1), valid.mean(1)):
print(n, round(tr, 3), round(va, 3), round(tr - va, 3))
读者下一步:先在固定数据切分和评分指标下运行代码,再把自己的模型替换进 model。
怎样读结果
- 训练与验证都低且差距小:增加同类数据未必够,先检查特征、标签质量或模型容量。
- 训练明显高、验证低:尝试更强正则化、更简单模型或补充代表性数据,并重新画曲线。
- 验证分数仍随样本量上升:补充同分布数据可能有价值,但不能据此承诺提升幅度。
结果验证:输出应有五个递增的训练规模,每行同时出现训练 F1、验证 F1 和差值;不要只保留最好的一行。
边界与常见误判
失败边界:随机交叉验证不适用于带时间顺序或同一用户重复样本的数据;这类数据要改用时间切分或按组切分,否则曲线可能因泄漏而虚高。
曲线是诊断信号,不是因果证明。若预处理在全量数据上提前拟合、标签有重复泄漏,训练和验证都可能看起来很好。
依据与核验日期
- scikit-learn 学习曲线文档:说明 learning_curve 的训练规模、交叉验证和返回分数
- scikit-learn 模型评估文档:说明评分指标应与任务目标一致
以上页面于 2026-10-01 核验。版本更新后,应重新查看参数含义和默认值。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31185.html