很多初学者学机器学习,最容易忽略的一块反而是决定模型生死的那块——模型评估。我在群里看到不少同学用Scikit-learn跑通一个逻辑回归,打印出accuracy就收工了,后面被面试官问一句“你这个模型好在哪里,坏在哪里,换一组数据还行不行”就哑火。这篇文章我就用Scikit-learn把机器学习模型评估这件事完整拆一遍,从数据拆分、交叉验证,到分类和回归的指标体系,再到过拟合诊断,最后给一份能直接抄的避坑清单。不管你是为了交课程作业、应付期末考,还是准备面试手撕代码,这套东西都能直接用。
聊这些之前先明确一个事情:Scikit-learn(通常写作sklearn)是目前Python生态里最成熟的机器学习库,模型评估相关工具也非常全,比如train_test_split、cross_val_score、confusion_matrix、roc_auc_score等等。问题是工具太多,很多人不知道怎么串起来。这篇文章的价值就是帮你把这些API串成一条完整的评估链路,让每一步都有依据、有输出、能复现。
1. 模型评估到底在解决什么问题
1.1 从一次“漂亮但虚假”的准确率说起
先讲个真事。我见过一位同学做二分类任务,测试集上accuracy刷到了0.96,特别兴奋。我让他看一下类别分布,结果发现测试集里大概96%的数据都属于“负类”。也就是说,哪怕模型啥也不学,直接预测所有样本为负类,准确率也能到0.96。他那个模型等于什么都没学会,只是被准确率这个数字包装得很漂亮。
这就是模型评估要解决的第一个问题:你选用的评估方式它本身可能会骗你。准确率只适合类别分布相对均衡的任务,一旦正负样本比例悬殊,就必须换更稳健的指标,比如F1、AUC,或者干脆换一种评估策略。所以模型评估并不是最后跑一个数字那么简单,它是在回答三个问题:模型能不能泛化到新数据,模型在哪些样本上容易出错,以及这个模型比起一个朴素基线到底好多少。
1.2 评估的完整闭环:训练、验证、测试
很多刚接触机器学习的同学把数据集一分为二,一份训练,一份测试,训练完在测试集上算个分数就结束了。严格来说这不够。一套标准的评估流程至少要把数据分成三份:训练集用来训练模型参数,验证集用来选择超参数和对比不同模型,测试集用来做最终的、一次性的评估。
为什么不能拿测试集反反复复调参?因为测试集的职责是“最终考试”,你每次根据它的结果去修模型,等于把答案偷偷透露给了自己,最后在测试集上看到的分数就不再代表真实泛化能力了。实际工程里,如果没有足够的样本单开验证集,可以靠交叉验证在训练集内部完成“不碰测试集”的模型选择。Scikit-learn里cross_val_score这类工具,就是干这个的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 手把手拆解评估的全流程
2.1 数据集划分的细节与坑
最常用的划分工具就是train_test_split,但它有四个参数值得停下来仔细看:test_size、random_state、shuffle和stratify。
test_size是验证集或测试集的比例,常见的是0.2或0.3,小数据集可以适当调大,比如500条样本我可能会留0.3做测试,因为样本太少,测试分数方差会很大。random_state必须固定,否则每次运行结果都不一样,你根本没法判断模型的提升是来自调参还是来自随机划分。shuffle默认是True,一般保持默认。重点说下stratify,如果你的任务是分类,这个参数一定要设成y,这样划分时正负样本比例会跟原始数据大致保持一致,避免出现某一折里全是某一类的情况。
python复制from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42,
stratify=y
)
这里有个很容易踩的坑:stratify只对分类有效,回归任务没有分层这个概念,因为标签是连续值。回归任务如果担心分布不均匀,可以先用分位数把y切层,再手动分层抽样,但大多数场景下随机划分就够了。
2.2 交叉验证的正确打开方式
交叉验证的核心思想是把训练数据切成多份,轮流把其中一份当作验证集,其余用于训练,最后把所有轮次的验证分数平均起来。这样做的好处是每个样本都有机会被用来验证,评分更稳定,也更充分地利用了数据。
Scikit-learn里提供了好几种生成交叉验证折的对象,最常用的是KFold和StratifiedKFold。KFold就是纯粹按顺序切分,而StratifiedKFold会保留每折中的类别比例,分类任务强烈建议用后者。shuffle=True能先把数据打乱再划分,配合random_state固定顺序,保证结果可复现。
python复制from sklearn.model_selection import S
