如何评估模型
训练完一个模型,你怎么知道它好不好? 这一章讲评估的核心方法。
为什么不能直接用训练数据评估?
一个最常见的错误:在训练数据上算准确率,觉得"99% 准了,完美!"
这是大错特错。模型可能只是把训练数据"背下来了"——遇到新数据就抓瞎。这种现象叫做过拟合(下一章会详细讲)。
正确做法:把数据分成两份,一份训练,一份测试,只在测试集上评估。
训练集 / 验证集 / 测试集
最规范的划分是三七开:
| 数据集 | 比例 | 用途 |
|---|---|---|
| 训练集 | 60% | 训练模型参数 |
| 验证集 | 20% | 调超参数(学习率、正则化强度) |
| 测试集 | 20% | 最终评估,只准看一次 |
交叉验证(Cross-Validation)
数据少的时候,把数据切成 7:3 可能太奢侈了。K 折交叉验证用更少的数据浪费做更可靠的评估:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
model = LinearRegression()
scores = cross_val_score(model, X, y, cv=5, scoring='r2')
print(f"5 折交叉验证的 R^2: {scores.mean():.3f} +/- {scores.std():.3f}")
原理:把数据切成 5 份,轮流用 4 份训练、1 份测试,跑 5 次取平均。
第1折: [验证][训练][训练][训练][训练]
第2折: [训练][验证][训练][训练][训练]
第3折: [训练][训练][验证][训练][训练]
第4折: [训练][训练][训练][验证][训练]
第5折: [训练][训练][训练][训练][验证]
回归任务常用指标
| 指标 | 公式 | 直观含义 |
|---|---|---|
| MSE | (1/n) * sum((y_hat - y)^2) | 误差的平方平均,对大误差敏感 |
| RMSE | sqrt(MSE) | 跟 y 同量级,容易解释 |
| MAE | (1/n) * sum(|y_hat - y|) | 误差的绝对值平均,对异常值稳健 |
| R^2 | 1 - sum((y_hat - y)^2) / sum((bar_y - y)^2) | 解释了多少方差,1=完美,0=跟均值一样差 |
分类任务常用指标
准确率(Accuracy)是最直白的:预测正确的比例。但在类别不平衡时会骗人。
假设 100 个邮件里 95 个是正常邮件,5 个是垃圾邮件。一个"全部预测为正常"的傻模型,准确率高达 95%!但它一个垃圾邮件都没抓出来。
这时候要看精确率(Precision)、召回率(Recall)和 F1 分数:
| 指标 | 公式 | 关注点 |
|---|---|---|
| Precision | TP / (TP + FP) | 我说是垃圾的有多少真垃圾(查准) |
| Recall | TP / (TP + FN) | 真的垃圾有多少被我抓出来了(查全) |
| F1 | 2PR / (P+R) | P 和 R 的调和平均,综合看待 |
from sklearn.metrics import classification_report
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
会输出类似:
precision recall f1-score support
正常 0.98 1.00 0.99 95
垃圾 1.00 0.80 0.89 5
accuracy 0.98 100
小结
- 评估模型必须在没见过的数据上,训练集评估毫无意义
- 数据少时优先用交叉验证,比单次 train/test 划分更稳健
- 回归看 RMSE 或 R^2,分类看 F1(类别不平衡时尤其重要)
- 测试集只能"看一次"——它是模型的"期末考试"
练习思考
- 为什么"5 折交叉验证"的评估结果,通常比"单次 8:2 划分"更稳定?
- 在一个癌症筛查系统里,误诊(把健康人判成癌症)和漏诊(把癌症判成健康),哪个更不能接受?对应到 P/R 上意味着什么?
- 用 sklearn
cross_val_score跑一遍你之前写的线性回归,对比 R^2 的均值和单次划分的 R^2。
章末小测验
检验你对《如何评估模型》的掌握程度。
1
为什么要把数据分成训练集和测试集?
2
K 折交叉验证相比单次 train/test 划分,优势是?
3
癌症筛查中,漏诊(把癌症判成健康)通常比误诊(把健康判成癌症)更不能接受,这对应:
学完这章, 你可能想看
讨论区(0)
加载评论中...