分类问题性能评价指标详述

目 录

二分类问题

代码实现

多分类问题


二分类问题

根据样例和学习器预测类别的组合划分为表中四种情况,下图也叫做“混淆矩阵”。

        真实情况                                       预测结果
               正例                 反例
            正例        TP(真正例)            FN(假反例)
            反例        FP(假正例)            TN(真反例)

(1)准确率  定义如下:

                                                                    acc=\frac{TP+TN}{TP+TN+FP+FN}

准确率在样本不平衡的情况下,产生效果较差,一般用accuracy来表示准确率。

(2)精确率(查准率)定义如下:

                                                                    P=\frac{TP}{TP+FP}

含义为:分为正例的样本中实际为正例的百分比,一般用precision来表示精确率。

(3)召回率(查全率)定义如下:

                                                                     R=\frac{TP}{TP+FN}

含义为:有多少个实际正例被划分为正例。一般用racall表示。

一般来说,(2)(3)两个度量方式,是一对矛盾的度量。一般来说,精确率高,召回率就会低,反之成立。假设好坏分类,若想将“好”全部选出来(召回率上升),那么可以增加样本数量实现,但将所有样本选上了,精确率也就下降了。

(4)P-R曲线(PR图)

                     图片来自:https://blog.csdn.net/b876144622/article/details/80009867

P-R曲线是以Recall为横轴,Precision为纵轴做图得到的,能够直观的显示学习器的性能问题,(从图中也可以清楚的看出,二者之间一般成负相关的关系):若两个学习器比较,其中一个把另外一个全部包围,则这个学习器更优,如A(黑色)与B(蓝色)作比较;若两者有交叉,如B(蓝色)C(绿色),只能根据具体情况进行比较,或者用各自的P-R曲线下的面积来比较,但是这种方法比较难以计算。

当二者难以比较的时候,平衡点(BEP)就提出来了,即当P=R时,(图中的红线,画的弯弯曲曲的那条线),两者各自的取值。B:约为0.47,C:约为0.57。这样就可以比较二者的优劣性了。

(5)F_{\beta }(加权调和平均)和 F1(调和平均)

利用F_{\beta }可以,使得在衡量问题时,可以定义召回率(查全率)和精确率(查准率)两者的相对重要性。

F_{\beta }定义如下:

                                                                        F_{\beta }=\frac{(1+\beta ^{2})*P*R}{(\beta ^{2}*P)+R}

\beta >1时,召回率影响更大;反之,精确率影响更大。

\beta =1,得到了F1度量,即:

                                                                             F_{1}=\frac{2*P*R}{P+R}

F1根据的是P和R的调和平均计算定义的:

                                                                         \frac{1}{F_{1}}=\frac{1}{2}*(\frac{1}{R}+\frac{1}{P})

F_{\beta }根据加权调和平均计算定义的:

                                                              \frac{1}{F_{\beta }}=\frac{1}{1+\beta ^{2}}*(\frac{\beta ^{2}}{R}+\frac{1}{P})

算数平均为:\frac{R+R}{2},几何平均为:\sqrt{P*R},调和平均更注重较小值。

代码实现

上述几种性能评价指标,在sklearn中的都有封装,可以直接使用。代码如下。

为了简单,我直接将y_test和y_pred给出了,按照道理来说,应该是通过模型得到的。

from sklearn import metrics as ms #统计库

y_test = [1,1,1,1,0,0,1,1,1,0,0]
y_pred = [1,1,1,0,1,1,0,1,1,1,0] 

print("准确率为:{0:%}".format(ms.accuracy_score(y_test, y_pred)))
print("精确率为:{0:%}".format(ms.precision_score(y_test, y_pred)))
print("召回率为:{0:%}".format(ms.recall_score(y_test, y_pred)))
print("F1分数为:{0:%}".format(ms.f1_score(y_test, y_pred)))
print("Fbeta为:{0:%}".format(ms.fbeta_score(y_test, y_pred,beta =1.2)))
# beta为fbeta_score()函数需要设置的

 

多分类问题

假设为三分类(ABC)问题,同样利用混淆矩阵来求解。

(1)宏查准率(macro-P),宏查全率(macro-R),宏F1(macro-F1),做法如下:

将A与BC化为两类,将A看做正例,非A看做反例,计算Pa、Ra。

将B与AC化为两类,将B看做正例,非B看做反例,计算Pb、Rb。

将C与AB化为两类,将C看做正例,非C看做反例,计算Pc、Rc。

【各自计算】后,再计算平均值。

                                                         macro-P = \frac{1}{n} *\sum_{i=1}^{n}P_{i}

                                                        macro-R = \frac{1}{n} *\sum_{i=1}^{n}R_{i}

                                          macro-F1 = \frac{2*(macro-P)*(macro-R) }{(macro-P)+(macro-R)}

(2)微查准率(micro-P)、微查全率(micro-R)、微F1(micro-F1)

按照上述做法,首先得到A、B、C的TP、FP、TN、FN。然后取平均值,得到{(TP)}'{(FP)}'{(TN)}'{(FN)}'。(没找见平均值的那个表示,用撇来表示)

                                                        macro-P = \frac{{(TP)}'}{{(TP)}'+{(FP)}'}

                                                       macro-P = \frac{{(TP)}'}{{(TP)}'+{(FN)}'}

                                          macro-F1 = \frac{2*(macro-P)*(macro-R) }{(macro-P)+(macro-R)}

 

还有很多指标评价方法,以后再做补充吧。

 

参考:《机器学习》周志华

发布了56 篇原创文章 · 获赞 29 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/foneone/article/details/88920256
今日推荐