第七篇:模型评估到底看什么?为什么准确率高,不一定代表模型真的好

很多人第一次做出一个机器学习模型时,最先盯着看的,通常就是一个数字:准确率。

这很正常。
因为准确率看起来最直观,也最好理解。

比如模型预测了 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,而是先看混淆矩阵

二分类的混淆矩阵通常长这样:

预测为正类预测为负类
实际为正类TPFN
实际为负类FPTN

这四个量分别表示:

  • 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+Recall2PrecisionRecall

你不用死记这个公式。
现在先记住它的作用就够了:

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=1n(yiy^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=1nyiy^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。
因为它足够直观,很适合把“相似样本往往有相似结果”这件事讲清楚。

更多推荐