模型性能评估指标,大家一定不陌生!很多小伙伴们都说难,但是它真的很重要很重要很重要!它会对我们的模型有很多的指导,也会给我们真正做模型的时候提供一些指导性的思想,不然我们看到别人的东西只能跟着人家的思路走,不能有自己的想法,或者说没办法去”批判“他做得好还是不好!这多憋屈呀!来!咱学!给它学得透透的!
今天的分析会略微包含一丢丢数学相关内容,大家不要怕!冲!当然,不了解这些也没关系,不会影响大家应用!当然,了解它们一定会让我们更开心对不啦!
性能度量(performance measure),也就是性能评价指标,其实就是指衡量模型泛化能力的性价标准。我们在对比不同模型的能力时,使用不同的性能度量,往往会导致不同的评判结果。这就意味着模型的好坏其实是相对的,什么样的模型是好的,它其实不仅取决于算法和数据,还取决于任务需求。
那么我们的任务需求是什么呢?
在预测任务中给定样本集 D = {( x 1 x_1 x1, y 1 y_1 y1), ( x 2 x_2 x2, , y 1 y_1 y1), ( x 3 x_3 x3, y 1 y_1 y1), … , ( x m x_m xm, y m y_m ym)},其中 y i y_i yi 是样本 x i x_i xi 的真实标签。我们要评估模型 f f f 的性能,就要把模型预测结果 f ( x ) f(x) f(x) 和真实标签 y y y 进行比较。
在回归任务中,最常用的性能度量就是“均方误差”(mean squared error):
E ( f ; D ) = 1 m Σ i = 1 m ( f ( x i ) − y i ) 2 E(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}(f(x_i)-y_i)^2 E(f;D)=m1i=1Σm(f(xi)−yi)2
看到公式我们不要怕!其实都是纸老虎!我们举个例子帮助大家理解!
假如我们的样本集 D 是这样的:D = {小要, 2), (小刘, 6), (小曼, 8)},那我们的 m,也就是样本数量就是 3。现在有个模型 f 已经被构建好啦,我们把”小要“、”小刘“、”小曼“输入这个模型,就可以得到它们各自的结果,比如得到的结果是这样:{小要, 2), (小刘, 5), (小曼, 8)}。其中的”2, 5, 8“就是我们的模型预测结果 f(x),而之前的”2, 6, 8“就是真实标签 y。我们把预测结果和真实标签相减后平方然后加起来除以样本个数,就可以得到均方误差。也就是:
M S E = [ ( 2 − 2 ) 2 + ( 5 − 6 ) 2 + ( 8 − 8 ) 2 ] / 3 MSE = [(2-2)^2 + (5-6)^2 + (8 - 8)^2] / 3 MSE=[(2−2)2+(5−6)2+(8−8)2]/3
其实均方误差就是计算数据预测值与真实值差值的平方和的平均数,也就是误差平方和的平均数。
更一般的,对于数据分布 D \mathcal D D 和概率密度函数 p ( ⋅ ) p(·) p(⋅),均方误差可以描述为:
E ( f ; D ) = ∫ x ∼ D ( f ( x ) − y ) 2 p ( x ) d x E(f; \mathcal D) = \int_{x \sim \mathcal D}(f(x)-y)^2p(x)dx E(f;D)=∫x∼D(f(x)−y)2p(x)dx
其实还有一种情况,就是每个样本出现的概率是不一样的,比如同样是上面的例子,我们又知道”小要“出现的概率是 0.2,”小刘“的概率0.5,”小曼“的的 0.3,那么这个时候就不可以像上面一样那么单纯了!不过也简单,咱们这么干:
M S E = [ ( 2 − 2 ) 2 × 0.2 + ( 5 − 6 ) 2 × 0.5 + ( 8 − 8 ) 2 × 0.3 ] / 3 MSE=[(2-2)^2\times0.2+(5-6)^2\times0.5+(8-8)^2\times0.3]/3 MSE=[(2−2)2×0.2+(5−6)2×0.5+(8−8)2×0.3]/3
简单地把概率乘进去就好啦!是不是也蛮好理解!
下面我们就来主要介绍一下分类任务中最常用的性能度量。
错误率与精确度
**错误率(error rate)和精确度(accuracy)**是分类任务中最常用的两种性能度量,适用于二分类和多分类。
这俩很好理解,咱们来瞅瞅!通过我上面通俗易懂、出神入化的解释,相信大家应该对公式恐惧感减弱了叭!来!咱们继续掰扯!前期多解释,后期我们对于简单的公式就可以嗖嗖嗖过去啦!当然,对于难度较大的,当然还是会对它进行深入剖析!
首先是错误率,它是指分类错误的样本数占样本总数的比例。
公式如下:
E ( f ; D ) = 1 m Σ i = 1 m ∥ ( f ( x i ) ≠ y i ) E(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}\parallel(f(x_i)\not= y_i) E(f;D)=m1i=1Σm∥(f(xi)=yi)
这个就是我们前面的均方误差的公式,大家已经很清楚啦!其中的那个小双杠 ∥ \parallel ∥ 呢,它是统计满足括号中条件的元素的个数,如果相等就取 0,不相等就取 1,最后进行求和,得到的值一共有多少个不相等,比如说 10 个里面有 6 个不相等,那就说明错误率为 0.6。感觉有点类似于条件表达式,真返回 1,假返回 0。上面的 E 就是我们的错误率,注意它不是期望哈,千万不要搞混,不然会一脸懵逼皱眉挠头的!
然后是精确度,和错误率相反,它指的是分类正确的样本数占样本总数的比例。
公式如下:
a c c ( f ; D ) = 1 m Σ i = 1 m ∥ ( f ( x i ) = y i ) = 1 − E ( f ; D ) acc(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}\parallel(f(x_i)= y_i)=1-E(f; D) acc(f;D)=m1i=1Σm∥(f(xi)=yi)=1−E(f;D)
用 1 减去错误率,就得到精确度啦!
查准率、查全率与 F1
错误率和精确度虽然很常用,但是其实并不能满足所有的任务需求。比如说西瓜问题,如果我们关心的是“挑出的西瓜当中有多少的比例是好瓜”,或者说“所有好瓜当中有多少比例被挑了出来”,显然,错误率就不够用了,就需要使用其它的性能度量。查准率(precision)与查全率(recall)就是更适用于这类需求的性能度量,感觉平常我们好像更习惯叫它们准确率和召回率。
首先,我们简单介绍一下混淆矩阵(confusion matrix)。
混淆矩阵本身是对于预测结果的一个粗略评价,可以让我们对预测结果和原始数据有一个宏观的了解。在计算查准率。查全率等评价指标时我们也会用到混淆矩阵中的数值。
混淆矩阵里面有四个格子,包含了我们在进行一个二分类预测的时候,预测结果所有可能出现的情况。也就是说,对于任何一个样本进行预测以后,预测结果一定属于这四个格子的其中一个:
左上角 True Positive(简写为 TP)表示实际上这个样本为 Positive,模型也把这个样本预测为 Positive 的情况。这是我们预测正确的部分。
右下角 True Negative(简写为 TN)表示实际上这个样本为 Negative,模型也把这个样本预测为 Negative 的情况。这是我们预测正确的部分。
右上角 False Positive(简写为 FP)表示实际上这个样本为 Negative,但是模型预测为了 Positive 的情况。这是预测错误的部分,也是统计学上的第一类错误(Type I Error)。
左下角 False Negative(简写为 FN)表示实际上这个样本为 Positive,但是模型预测为了 Negative 的情况。这是预测错误的部分,也是统计学上的第二类错误(Type II Error)。
假设,我们有一个任务:给定一些患者的样本,构建一个模型来预测肿瘤是不是恶性的。在这里,肿瘤要么良性,要么恶性,所以这是一个典型的二分类问题。
假设用 y = 1 表示肿瘤是良性,y = 0 表示肿瘤是恶性。则我们可以制作如下表格:
真实情况(竖)/预测结果(横) | y = 1,良性 | y = 0,恶性 |
---|---|---|
y = 1,良性 | TP(真正例) | FN(假反例) |
y = 0,恶性 | FP(假正例) | YN(真反例) |
TP 表示预测为良性,而实际也是良性的样例数;
FN 表示预测为恶性,而实际是良性的样例数;
FP 表示预测为良性,而实际是恶性的样例数;
TN 表示预测为恶性,而实际也是恶性的样例数;
所以,这四个数值就形成了一个矩阵,我们称为混淆矩阵。
那么,查准率(precision,P)和查全率(recall,R)就分别定义为:
P = T P T P + F P P= \frac{TP}{TP+FP} P=TP+FPTP
R = T P T P + F N R= \frac{TP}{TP+FN} R=TP+FNTP
查准率和查全率是一对矛盾的度量,也就是说它们二者之间是一个**反向变动的关系。**让我们通过一个通俗易懂的例子来解释这个问题(P-R反向变动关系原理)。
假设你是一名草药采集者,你的任务是在一片森林里寻找特定的草药。你带着一个草药识别工具,这个工具可以帮助你判断某个植物是不是你正在寻找的草药。
现在,你在森林中随机采集了 100 株植物,其中有 10 株是你需要找的目标草药,剩下 90 株是其他植物。你使用草药识别工具对这 100 株植物进行了测试,并记录了结果。
查准率衡量的是你找到的草药中有多少是真正的目标草药。换句话说,查准率是在所有被工具判定为目标草药的植物中,真正是目标草药的比例。
查全率衡量的是你实际找到的目标草药占所有目标草药的比例。换句话说,查全率是在所有目标草药中,你成功找到的比例。
现在我们按照上面给出的公式来计算一下:
假设草药识别工具判断有 8 株植物是目标草药,其中只有 6 株是真正的目标草药,其他 2 株是误判的。
- 查准率 P = 真正的目标草药数 / 被判定为目标草药数 = 6 / 8 = 0.75 = 75%
- 查全率 R = 真正的目标草药数 / 所有目标草药数 = 6 / 10 = 0.6 = 60%
这里就体现了查准率和查全率的矛盾:
- 如果你只采集了非常确定的植物(比如,你非常自信这是目标草药的情况下),那么你的查准率可能很高,因为大部分你判断为目标草药的都是对的。但是,你可能错过了很多真正的目标草药,因此查全率会较低。
- 如果你为了不错过任何目标草药而采集了大量的植物,那么你的查全率可能会很高,因为你找到了大部分的目标草药。但是,你可能也会采集到很多其他植物,导致查准率较低。
所以在分类任务中,我们需要权衡查准率和查全率,并根据具体任务的要求来选择合适的度量指标。有时候我们希望更注重准确率,有时候我们又希望更注重覆盖率,这取决于具体的应用场景。
在很多情况下,我们可以根据模型的预测结果对样本进行排序,排在前面的就是模型认为最可能是正例的样本,排在最后的就是模型认为这不可能是正例的样本,那么我们按照这个顺序逐个把样本作为正例进行预测,那么每次就可以计算出当前的查全率和查准率。以查准率为纵轴、查全率为横轴作图,就得到了查准率 - 查全率曲线,也就是我们常见的”P-R曲线“。
我们也把当前判定样本是否是正例的预测分数定义为阈值(threshold),选取不同的阈值会得到不同的查准率和查全率。
那么,我们要选择哪一个阈值下的查准率和查全率才能代表我们模型的最优效果呢?
我们就设计了一些方法去帮助我们确定最优阈值:
-
平衡点(Break-Even Point,BEP):它比较简单粗暴,就是 P = R 时的取值。BEP 过于简化,而且不太靠谱,所以不常用。
-
F1度量:让我们再来回顾一下之前的例子,草药采集者在森林中使用草药识别工具采集了 100 株植物,其中 10 株是目标草药,90 株是其他植物。假设草药识别工具给每株植物一个概率得分,表示这株植物可能是目标草药的概率。
在这个情况下,我们可以设定一个概率阈值,比如 0.5。如果植物的概率得分大于 0.5,我们将其判定为目标草药;否则,我们将其判定为其他植物。
现在,我们来计算一下在不同概率阈值下的查准率和查全率,并绘制 P - R 曲线。为了简化计算,我们假设在不同阈值下,草药识别工具的结果如下:
阈值 判定为目标草药的植物 真正的目标草药 查准率 查全率 0.1 80 10 0.125 1.0 0.3 60 10 0.167 1.0 0.5 40 10 0.25 1.0 0.7 20 9 0.45 0.9 0.9 10 6 0.6 0.6 F1 度量其实就是查准率和查全率的调和平均(harmonic mean),它通过综合考虑这两个指标来给出一个单一的度量值。F1 度量的计算方式为 2 * (查准率 * 查全率) / (查准率 + 查全率),也就是下面的公式:
F 1 = 2 × P × R P + R = 2 × T P 样本总数 + T P − T N F_1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{样本总数+TP-TN} F1=P+R2×P×R=样本总数+TP−TN2×TP
在这个公式中,查准率和查全率都出现在分子和分母中,所以 F1 度量会受到这两个指标的影响。F1 度量的取值范围在 0 到 1 之间,值越接近 1 表示模型在查准率和查全率上都表现良好,值越接近 0 表示模型在这两个指标上表现较差。
继续使用上面的表格数据,我们可以计算出不同阈值下的 F1 度量:
阈值 F1 0.1 0.222 0.3 0.286 0.5 0.4 0.7 0.64 0.9 0.6 我们可以看到,随着阈值的变化,F1 度量也会相应变化。当阈值为 0.7 时,F1 度量最高,这意味着在这个阈值下,模型在查准率和查全率上都取得了一个较好的平衡。
所以 F1 度量能够帮我们找到一个合适的阈值,使模型在查准率和查全率上都能取得较好的表现。
-
F β F_β Fβ:有时候我们会希望将其中一个指标更加重视,而另一个指标则相对较次要。比如在商品推荐系统中,我们就希望推荐内容尽量都是用户感兴趣的,这个时候查准率就更重要;而在逃犯信息检索系统中,我们会希望尽可能少漏掉逃犯,这个时候查全率就更重要。这个时候就可以使用 F β F_β Fβ 度量来确定 P - R 曲线的阈值,公式如下:
F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_β=\frac{(1+β^2)\times P\times R}{(β^2\times P)+R} Fβ=(β2×P)+R(1+β2)×P×R
F1 度量是查准率和查全率的调和均值,而 F β F_β Fβ 度量则是查准率和查全率的加权调和平均,它通过引入参数 β 来调整查准率和查全率之间的平衡。β 的取值决定了对查准率和查全率的重视程度:
- 当 β = 1 时,相当于常见的 F 1 F_1 F1 度量,即查准率和查全率的平衡值。
- 当 β > 1 时,查全率会对 F β F_β Fβ 度量的影响更大,因此更注重覆盖率。
- 当 0 < β < 1 时,查准率会对 F β F_β Fβ 度量的影响更大,因此更注重准确率。
总结一下, F β F_β Fβ 度量可以帮助我们根据任务需求,调整查准率和查全率之间的平衡,使模型在特定方面表现得更优秀。通过选择不同的 β 值,我们可以根据实际应用场景来确定最合适的阈值,从而优化模型的性能。
那如果我们想要用 n个二分类实现多分类问题,这该如何做呢?
我们可以先根据各混淆矩阵分别求 P 和 R,然后再计算平均值,这样就可以得到”宏查准率(macro-P)“、”宏查全率(macro-R)“和”宏 F 1 F_1 F1(macro- F 1 F_1 F1)“;也可以先对各混淆矩阵的对应元素求平均,记为 T P ‾ \overline{TP} TP、 F P ‾ \overline{FP} FP、 T N ‾ \overline{TN} TN、 F N ‾ \overline{FN} FN,再基于这些平均值计算”微查准率(micro-P)“、”微查全率(micro-R)“和”微 F 1 F_1 F1(micro- F 1 F_1 F1)“。
前面我们讲了这么多,那么我们如何用P-R曲线去比较模型的好坏呢?
比如上图的三个模型,我们可以明确地看出,B 模型和 A 模型肯定是比 C 模型好,而 B 模型和 A 模型曲线有交叉,我们用肉眼就无法确定二者哪个更好啦!那我们有什么方法去对它们进行判断吗?
有的!
- 比较曲线下面积的大小(这个我们后续会详细讲解,其实就是我们平常说的 AUC),它可以一定程度上表征模型的优劣。
- F 1 F_1 F1
- F β F_β Fβ
这部分内容过多,我们分个期好不好!下节见!
文末碎碎念
那今天的分享就到这里啦!我们下期再见哟!
最后顺便给自己推荐一下嘿嘿嘿!
如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!
蟹蟹你们的喜欢和支持!!!
啊对!如果小伙伴们有需求的话,也可以加入我们的交流群:一定要知道 | 永久免费的生信交流群终于来啦!
还有兴趣的话,也可以看看我掏心掏肺的干货满满 | 给生信小白的入门小建议 | 掏心掏肺版!绝对干货满满!
如果有小伙伴对付费分析有需求的话,可以看看这里:个性化科研服务 | 付费分析试营业正式启动啦!定制你的专属生信分析!可提供1v1答疑!
入群链接后续可能会不定期更新,主要是因为群满换码或是其他原因,如果小伙伴点开它之后发现,咦,怎么失效啦!不要慌!咱们辛苦一下动动小手去主页的要咨询
那里,点击进交流群
即可入群!
参考资料
- 周志华. 机器学习[M]. 北京:清华大学出版社. 2016.01.
- https://www.bilibili.com/video/BV17J411C7zZ
- https://zhuanlan.zhihu.com/p/364253497