机器学习进阶(7):模型评估
第七篇:模型评估到底看什么?为什么准确率高,不一定代表模型真的好
很多人第一次做出一个机器学习模型时,最先盯着看的,通常就是一个数字:准确率。
这很正常。
因为准确率看起来最直观,也最好理解。
比如模型预测了 100 次,猜对了 90 次,那准确率就是 90%。
乍一看,好像也没什么问题。
但机器学习真正让人容易踩坑的地方就在这里:
有时候,一个很好看的准确率,并不能说明模型真的有用。
甚至在某些场景里,准确率高得离谱,反而可能是你评估方式有问题,或者模型根本没学到你真正关心的东西。
所以这一篇要讲的,不是“再多记几个指标名字”,而是把一件事想明白:
不同任务里,什么才叫一个“好模型”。
1. 先从最直观的准确率说起
准确率的定义很简单:
Accuracy=预测正确的样本数总样本数 Accuracy = \frac{预测正确的样本数}{总样本数} Accuracy=总样本数预测正确的样本数
这个公式本身没有问题。
问题出在:它只适合某些场景,不适合所有场景。
比如有一个非常经典的例子。
假设你在做疾病筛查,数据里一共 1000 个人:
- 980 个人没病
- 20 个人有病
现在你训练了一个模型,但这个模型特别“偷懒”,它不管输入是什么,一律预测“没病”。
那它的准确率是多少?
答案是:
9801000=98 \frac{980}{1000} = 98% 1000980=98
98% 听起来是不是很高?
但这个模型其实几乎没有用。
因为它把真正有病的 20 个人一个都没找出来。
这就是为什么在很多分类问题里,单看准确率会很危险。
特别是当数据类别分布不平衡的时候,准确率很容易掩盖问题。
2. 混淆矩阵:先别急着看指标,先看模型错在哪
很多时候,想理解一个分类模型表现如何,最直观的方式不是马上背 Precision、Recall、F1,而是先看混淆矩阵。
二分类的混淆矩阵通常长这样:
| 预测为正类 | 预测为负类 | |
|---|---|---|
| 实际为正类 | TP | FN |
| 实际为负类 | FP | TN |
这四个量分别表示:
- TP(True Positive):实际是正类,模型也预测成正类
- TN(True Negative):实际是负类,模型也预测成负类
- FP(False Positive):实际是负类,但模型误判成正类
- FN(False Negative):实际是正类,但模型漏掉了,判成负类
你可以发现,分类模型其实不只是“对了多少”,还涉及到:
- 它错的时候,是把谁错成了谁
- 它更容易误报,还是更容易漏报
这在很多真实任务里,差别非常大。
比如:
垃圾邮件识别
把正常邮件误判成垃圾邮件(FP)可能会影响用户体验。
疾病筛查
把真正有病的人判成没病(FN)往往比误报更严重。
风控欺诈检测
把欺诈交易漏掉(FN)代价可能非常高。
所以评估模型,不能只看它总共猜对了多少,更要看它错的方式。
3. 精确率和召回率,分别在看什么
有了混淆矩阵以后,再看精确率和召回率就顺很多了。
精确率(Precision)
Precision=TPTP+FP Precision = \frac{TP}{TP + FP} Precision=TP+FPTP
它关注的是:
模型说“是正类”的那些样本里,到底有多少真的就是正类。
说白一点,精确率是在问:
你报出来的那些“可疑对象”,到底准不准?
比如做垃圾邮件检测时,模型说 100 封邮件是垃圾邮件,结果里面 90 封真的垃圾,10 封其实不是。
那精确率就是 90%。
精确率高,说明模型“不乱报”。
召回率(Recall)
Recall=TPTP+FN Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
它关注的是:
所有真正的正类样本里,有多少被模型成功找出来了。
说白一点,召回率是在问:
真正该抓的人,你抓到了多少?
还是疾病筛查那个例子。
如果一共 20 个真正患病的人,模型只找出来 12 个,那召回率就是 60%。
召回率高,说明模型“不容易漏掉重要目标”。
4. 为什么精确率和召回率经常要平衡
很多初学者第一次接触这两个指标时,会下意识地想:
“那我让精确率和召回率都高不就行了吗?”
当然最好是这样。
但现实里,二者经常会有拉扯。
比如你把模型判定为“正类”的门槛设得非常严格,那它只有非常有把握时才会说“是”。
这样通常会发生什么?
- 误报减少了,精确率可能上升
- 但很多本来应该抓到的正类也被漏掉了,召回率可能下降
反过来,如果你把门槛放得很宽,模型更容易把样本判成正类,那通常会发生:
- 抓到的正类更多了,召回率上升
- 但误报也多了,精确率下降
所以在很多任务里,不存在一个“永远最优”的指标,只有更适合当前目标的取舍。
举几个很实际的例子
医疗初筛
宁可多报一点,也不能漏掉真正患病的人。
这时候通常更看重召回率。
垃圾邮件过滤
如果你把太多正常邮件误判掉,用户会很烦。
这时候精确率可能更重要。
风险审核
到底更怕误杀还是更怕漏检,要看业务成本结构。
所以评估指标不是死背定义,而是和具体任务强绑定的。
5. F1 分数为什么会出现
既然精确率和召回率经常拉扯,人们就想:
有没有一个指标,能把二者放在一起看?
于是就有了 F1 Score。
公式是:
F1=2⋅Precision⋅RecallPrecision+Recall F1 = \frac{2 \cdot Precision \cdot Recall}{Precision + Recall} F1=Precision+Recall2⋅Precision⋅Recall
你不用死记这个公式。
现在先记住它的作用就够了:
F1 是在精确率和召回率之间做一个综合平衡。
为什么不是简单平均,而是这种写法?
因为 F1 会更惩罚“偏科”。
比如:
- 精确率很高,但召回率很差
- 或者召回率很高,但精确率很差
这两种情况,F1 都不会给你太好看的分数。
所以在很多类别不平衡的分类任务里,F1 往往比准确率更有参考价值。
6. ROC-AUC 和 PR-AUC,要不要讲
这两个指标你后面大概率会写到,但在这个阶段我建议你讲“直觉”,不要一上来铺太深。
你可以这样理解:
很多分类模型输出的,不是一个硬邦邦的 0 或 1,而是一个概率。
比如:
- 0.92:很像正类
- 0.73:也偏向正类
- 0.48:比较模糊
- 0.10:更像负类
只要阈值一改,模型的 Precision 和 Recall 就会跟着变。
ROC 曲线、PR 曲线,本质上就是在看:
当阈值不断变化时,模型整体的区分能力怎么样。
AUC
可以粗略理解成曲线下面积。
面积越大,通常说明模型整体区分正负类的能力越强。
这个阶段你不用讲太硬。
给读者留一个印象就够了:
- Accuracy 是一个点上的结果
- AUC 更像是在看模型整体排序能力
后面讲到不平衡数据或者概率输出时,再深入展开会更自然。
7. 回归问题怎么评估:不是准确率,而是看“差了多少”
前面说的都是分类任务。
那回归任务呢?
比如:
- 预测房价
- 预测销量
- 预测气温
- 预测用户停留时长
这种任务的目标不是分对类别,而是预测一个连续数值。
这时候就不会看 Accuracy、Precision 这些,而会看另外一组指标。
最常见的有:
- MSE
- RMSE
- MAE
- R2R^2R2
8. MSE:为什么大误差会被罚得更重
均方误差的公式是:
MSE=1n∑i=1n(yi−y^i)2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
这个你前面已经见过了。
它的特点是:
误差会先平方,再平均。
这样做有个非常重要的效果:
小误差和大误差,在 MSE 里受到的惩罚差别会被放大。
比如:
- 误差 1,平方后还是 1
- 误差 5,平方后变成 25
所以 MSE 对大偏差特别敏感。
这有好有坏。
好处是,如果你特别不希望出现“大错”,MSE 很有用。
坏处是,它会更容易受异常值影响。
9. RMSE:为什么很多人更喜欢它
RMSE 是均方根误差:
RMSE=MSE RMSE = \sqrt{MSE} RMSE=MSE
它本质上就是先算 MSE,再开根号。
这样做的好处是:
数值单位会回到原来的量纲上,更直观一些。
比如你在预测房价,MSE 的单位会是“万元的平方”,这不太好理解。
但 RMSE 开根号以后,又回到了“万元”,就更容易解释。
很多实际项目里,人们会更习惯看 RMSE,而不是直接看 MSE。
10. MAE:它更像“平均差多少”
平均绝对误差的公式是:
MAE=1n∑i=1n∣yi−y^i∣ MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| MAE=n1i=1∑n∣yi−y^i∣
它和 MSE 的区别在于:
它不平方,而是直接看绝对值。
所以 MAE 更接近一种朴素直觉:
模型平均每次大概差多少。
比如 MAE = 12,意思就可以比较直白地理解成:
模型平均每次预测大概差 12 个单位。
相比 MSE,MAE 对异常值没那么敏感。
所以有些场景下,MAE 会更稳。
11. R2R^2R2 到底在看什么
很多人第一次看到 R2R^2R2 的时候,会有点懵。
因为它不像 MSE、MAE 那样直接看误差大小。
它更像是在回答这样一个问题:
这个模型,相比一个“只会报平均值”的笨办法,到底好多少?
R2R^2R2 越接近 1,通常说明模型越能解释数据变化。
接近 0,说明模型没比“直接猜平均值”强多少。
有时候它甚至可以是负数,那就说明你的模型比“瞎猜平均值”还差。
所以 R2R^2R2 更像是一个相对评价指标。
它有参考价值,但通常不建议单独看。
更稳妥的做法是和 MAE、RMSE 搭配起来看。
12. 一个小例子:为什么“一个指标好看”不够
假设你做房价预测,两个模型结果如下:
模型 A
- MAE = 12
- RMSE = 30
模型 B
- MAE = 15
- RMSE = 18
哪一个更好?
不一定能立刻下结论。
模型 A 的平均误差更小,说明平时更准。
但它的 RMSE 很大,说明它可能偶尔会犯很大的错。
模型 B 的平均误差稍大,但 RMSE 更小,说明它可能更稳定,不容易出现特别离谱的预测。
你看,这时候到底选哪个,就不是“哪个数字更小”这么简单了,而是要看你更在意哪种错误。
这也是模型评估里很重要的一点:
指标不是拿来背的,而是拿来理解模型行为的。
13. 用 Python 看一个分类评估例子
下面用一个很简单的例子看下分类指标怎么计算。
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
y_true = [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 0, 1, 1, 1, 0]
print("Accuracy:", accuracy_score(y_true, y_pred))
print("Precision:", precision_score(y_true, y_pred))
print("Recall:", recall_score(y_true, y_pred))
print("F1:", f1_score(y_true, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y_true, y_pred))
这个例子里,你最好不要只盯着 Accuracy。
真正更有用的是结合混淆矩阵一起看:
- 错误主要出在哪一类
- 是误报多,还是漏报多
- Precision 和 Recall 哪个更拉胯
这样你才会真正知道模型问题在哪。
14. 再看一个回归评估例子
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np
y_true = np.array([100, 120, 140, 160, 180])
y_pred = np.array([110, 118, 135, 170, 175])
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print("MSE:", mse)
print("RMSE:", rmse)
print("MAE:", mae)
print("R2:", r2)
跑完以后,不要急着问“哪个最好”。
先问自己:
- 这个任务更怕平均偏一点,还是更怕偶尔大错一次
- 我更想看直观误差,还是更想看整体拟合程度
- 我的业务真的能接受这种误差吗
一旦这么想,指标就不再是公式,而是判断模型是否“可用”的工具。
15. 模型评估真正难的地方,不是指标多,而是目标不同
到这里你应该已经能感觉到,模型评估的难点不是“指标太多记不住”,而是:
不同任务里,你在乎的东西本来就不一样。
比如:
- 医疗任务可能更怕漏诊
- 风控任务可能更怕漏掉高风险用户
- 推荐系统可能更看重排序效果
- 房价预测可能更怕偶尔特别离谱的误差
所以不要把模型评估理解成“哪个数字越大越好、越小越好”这么简单。
它真正考验的是:
你到底知不知道,你想让模型在哪方面表现更好。
这也是为什么机器学习不是只会调库就够了。
因为同一个模型,在不同业务目标下,评价标准都可能不一样。
16. 所以这一篇讲完以后,真正该留下来的是什么
到这里,准确率这件事其实已经被放回它该在的位置了:
它不是没用。
只是它没你最开始想得那么万能。
你后面做模型时,最好别再一上来只问:
准确率多少?
更应该问的是:
- 我的任务是分类还是回归
- 数据平衡吗
- 我更怕误报还是漏报
- 我更在意平均误差,还是极端误差
- 这个指标跟我的目标到底匹不匹配
这几个问题,比多背几个公式更重要。
接下来就可以自然往算法走了。
因为数据怎么切、模型怎么评估,你已经有基本认识了。
那下一步就该开始真正看算法本身。
而在所有机器学习算法里,最适合先讲的一个,就是 KNN。
因为它足够直观,很适合把“相似样本往往有相似结果”这件事讲清楚。
更多推荐


所有评论(0)