机器学习分类算法的评价指标有:混淆矩阵(Confuse Matrix)、准确率(Accuracy)、错误率(ErrorRate)、精准率(Precision)和召回率(Recall)、F1 Score、ROC曲线(Receiver Operating Characteristic Curve)、AUC(Area Under the Curve)、KS曲线、Lift值、P-R曲线 。
接下来对以上这些指标进行一一解释,并给出多分类问题的综合评价指标,如宏平均、微平均、Kappa系数,最后用一个多分类实例来计算这些指标。
混淆矩阵(Confusion Matrix),可以使人们更好地了解分类中的错误。如果矩阵中的非对角元素均为0,就会得到一个完美的分类器。下图的混淆矩阵只针对二分类问题得到的。
真正例(True Positive,TP):一个正例被正确预测为正例
真反例(True Negative,TN):一个反例被正确预测为反例
假正例(False Positive,FP):一个反例被错误预测为正例
假反例(False Negative,FN):一个正例被错误预测为反例
准确率是所有样本中预测正确的样本占比,其公式如下:
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN
准确率有一个明显的弊端问题,就是在数据的类别不均衡,特别是有极偏的数据存在的情况下,准确率这个评价指标是不能客观评价算法的优劣的。
如:在测试集中,有1000个测试样本,999个反例,只有1个正例。如果模型对任意一个测试样本都预测是反例,那么模型的准确率就是99%,从数值上看是非常好的,但事实上,这样的算法没有任何的预测能力。
错误率指的是所有测试样例中错分的样例比例,其公式如下
E r r o r R a t e = F P + F N T P + T N + F P + F N = 1 − A c c u r a c y ErrorRate=\frac{FP+FN}{TP+TN+FP+FN}=1-Accuracy ErrorRate=TP+TN+FP+FNFP+FN=1−Accuracy
但是这样的度量错误掩盖了样例如何被分错的事实。
精准率(Precision)又称查准率,它是针对预测结果而言的,它的含义是在所有被预测为正的样本中实际为正的样本的概率,即在预测为正样本的结果中,有多少把握可以预测正确,其公式如下:
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
精准率和准确率是完全不同的两个概念。精准率代表对正样本结果中的预测准确程度,而准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。
召回率(Recall)又称查全率,它是针对原样本而言的,它的含义是在实际为正的样本中被预测为正样本的概率,其公式如下:
R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP
在不同的应用场景下,关注点不同,例如,在预测股票的时候,更关心Precision,即预测升的那些股票里,真的升了有多少,因为那些预测升的股票都是投钱的。而在预测病患的场景下,更关注Recall,即真的患病的那些人里预测错了情况应该越少越好。
Precision和Recall是一对此消彼长的度量。例如在推荐系统中,想让推送的内容尽可能用户全都感兴趣,那只能推送把握高的内容,这样就漏掉了一些用户感兴趣的内容,Recall就低了;如果想让用户感兴趣的内容都被推送,那只有将所有内容都推送上,宁可错杀一千,不可放过一个,这样Precision就很低了。
通常使用Precision和Recall这两个指标,来评价二分类模型的效果。但是,Precision和Recall指标有时是此消彼长的,即精准率高了,召回率就下降。为了兼顾Precision和Recall,最常见的方法就是F-Measure,又称F-Score。F-Measure是P和R的加权调和平均,计算公式如下:
1 F β = 1 1 + β 2 ⋅ ( 1 P + β 2 R ) F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R \begin{aligned}\frac{1}{F_{\beta}}={\frac{1}{1+\beta^2}}·(\frac{1}{P}+\frac{\beta^2}{R})\\F_{\beta}=\frac{(1+\beta^2)×P×R}{(\beta^2×P)+R}\end{aligned} Fβ1=1+β21⋅(P1+Rβ2)Fβ=(β2×P)+R(1+β2)×P×R
当 β = 1 \beta=1 β=1时,也就是常说的F1-score,是P和R的调和平均,F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差 。当F1较高时,模型的性能越好。
1 F 1 = 1 2 ⋅ ( 1 P + 1 R ) F 1 = 2 × P × R P + R \begin{aligned}\frac{1}{F1}={\frac{1}{2}}·(\frac{1}{P}+\frac{1}{R})\\F1=\frac{2×P×R}{P+R}\end{aligned} F11=21⋅(P1+R1)F1=P+R2×P×R
其中,P代表Precision,R代表Recall。
ROC曲线全称为受试者工作特征曲线(Receiver Operating Characteristic Curve)。ROC是一张图上的一条线(如下图所示),越靠近左上角的ROC曲线,模型的准确度越高,模型越理想;
图ROC曲线中,横轴是假阳率(False positive rate ,简称FPR),定义为 在所有真实的负样本中,被模型错误的判断为正例的比例 ,计算公式如下
F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP
纵轴是真阳率(True Positive Rate,简称TPR),定义为 在所有真实的正样本中,被模型正确的判断为正例的比例,其实就是召回率,计算公式如下
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
上图ROC曲线中,左下角的点所对应的是将所有样本判断为反例的情况,而右上角的点对应的是将所有样例判断为正例的情况;
FPR表示模型对于负样本误判的程度,而TPR表示模型对正样本召回的程度。我们所希望的当然是:负样本误判的越少越好,正样本召回的越多越好。所以总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。 参考如下动态图进行理解。
进行模型的性能比较时,若一个模型A的ROC曲线被另一个模型B的ROC曲线完全包住,则称B的性能优于A。若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。
ROC曲线对整体样本是否均衡并不敏感。因为ROC曲线只与TPR和FPR有关系,而这两个指标是针对单一类别的预测结果而言的 。举个例子:假设总样本中,90%是正样本,10%是负样本。在这种情况下如果使用准确率进行评价是不科学的,但是用TPR和FPR却是可以的,因为TPR只关注90%正样本中有多少是被预测正确的,而与那10%负样本毫无关系,同理,FPR只关注10%负样本中有多少是被预测错误的,也与那90%正样本毫无关系。这样就避免了样本不平衡的问题。
ROC曲线也是通过遍历所有阈值来绘制整条曲线的。如果我们不断的遍历所有阈值,预测的正样本和负样本是在不断变化的,相应的在ROC曲线图中也会沿着曲线滑动。
ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。
AUC( Area Under Curve )是曲线下面积,AUC给出的是分类器的平均性能值。 每一条ROC曲线对应一个AUC值。通常,AUC的取值在0.5与1之间。 模型的AUC面积值越大,模型的准确度越高,模型越理想;
KS( Kolmogorov-Smirnov)值越大,表示模型能够将正、负客户区分开的程度越大,则模型的风险区分能力越强。KS值的取值范围是[0,1]。
KS需要TPR和FPR两个值,具体如下:
KS曲线含有三条线,其横轴是阈值,纵轴是TPR(黄色那条)、FPR(蓝色那条)和(TPR-FPR)(绿色那条)的值。两条曲线之间相距最远(即绿色曲线最高点,即KS值)对应的阈值,就是最能划分模型的阈值。
具体KS曲线如下图所示:
一般,KS>0.3,则表示模型有较好的预测准确性,具有如下:
KS值 | 说明 |
---|---|
(0.3,+∞】 | 模型预测性较好 |
(0.2,0.3】 | 模型可用 |
(0,0.2】 | 模型预测能力较差 |
【-∞,0】 | 模型错误 |
Lift值是指与不利用模型相比,模型的预测能力“变好”了多少,即用该模型与没用该模型即随机选择所得结果的比值,Lift应该大于1,且Lift(提升指数)越大,模型预测效果越好。
例如:对于某二分类模型,假设需要给这1000名顾客进行营销。如果不用模型,一般有90个顾客会产生购买行为,则Random Rate=9%。如果按照模型预测的正例概率降序排序,取前10%(即前100个顾客),如果其中有60个人产生购买行为,那么排名前10%
的用户其实际购买率的Lift=(60/100)/9%=6.67。
P-R曲线(Precision Recall Curve )表现的是Precision和Recall之间的关系。
P-R曲线定义如下:根据学习器的预测结果(一般为一个实值或概率)对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的排在后面,按此顺序逐个把样本作为“正例”进行预测,每次计算出当前的P值和R值,如下图所示:
当P-R曲线越靠近右上方时,表明模型性能越好。在对不同模型进行比较时,一般有以下两种情况:
如果只有一个二分类混淆矩阵,则用上面的指标即可。
如果有多个二分类的混淆矩阵(如:多次训练或者在多个数据集上训练的结果),或者是多分类问题,则就会用到综合评价指标宏平均和微平均,具体如下:
宏平均(macro-average):先算出每个混淆矩阵(或每个类别)的P值和R值,然后取得平均P值macro-P和平均R值macro-R,再算出 F β F_{\beta} Fβ或F1,计算公式如下:
m a c r o P = 1 n ∑ i = 1 n P i m a c r o R = 1 n ∑ i = 1 n R i m a c r o F 1 = 2 × m a c r o P × m a c r o R m a c r o P + m a c r o R 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} macro P=n1i=1∑nPimacro R=n1i=1∑nRimacro F1=macro P+macro R2×macro P×macro R
微平均(micro-average): 对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算出混淆矩阵的平均TP、FP、TN、FN,构成全局混淆矩阵,然后计算P、R,进而求出 F β F_{\beta} Fβ或F1,计算公式如下:
m i c r o P = T P ‾ T P ‾ + F P ‾ m i c r o R = T P ‾ T P ‾ + F N ‾ m i c r o F 1 = 2 × m i c r o P × m i c r o R m i c r o P + m i c r o R micro \ P=\frac{\overline{TP}}{\overline{TP}+\overline{FP}} \\micro \ R=\frac{\overline{TP}}{\overline{TP}+\overline{FN}} \\micro \ F1=\frac{2 × micro \ P × micro \ R}{micro \ P+micro \ R} micro P=TP+FPTPmicro R=TP+FNTPmicro F1=micro P+micro R2×micro P×micro R
在多分类任务场景中,如果非要用一个综合考量的metric的话, 宏平均会比微平均更好一些,因为宏平均受稀有类别影响更大。宏平均平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均平等考虑数据集中的每一个样本,所以它的值受到常见类别的影响比较大。
kappa系数(简称KIA)是一种衡量分类精度的指标。KIA主要应用于比较分析两幅地图或图像的差异性是“偶然”因素还是“必然”因素所引起的,还经常用于检查卫星影像分类对于真实物判断的正确性程度。KIA是能够计算整体一致性和分类一致性的指数。 可以用KIA来进行多分类模型准确度的评估,这个系数的值越高,则代表模型实现的分类准确度越高。
kappa系数的计算方法可以这样来表示:
K I A = p 0 − p c 1 − p c KIA=\frac{p_0-p_c}{1-p_c}\\ KIA=1−pcp0−pc
其中
p 0 = ∑ i = 1 n x i i N p c = ∑ i = 1 n x i + x + i N 2 p_0=\frac{\sum_{i=1}^{n}x_{ii}}{N}\\ p_c=\frac{\sum_{i=1}^{n}x_{i+}x_{+i}}{N^2} p0=N∑i=1nxiipc=N2∑i=1nxi+x+i
x i i x_{ii} xii表示混淆矩阵中对角线上的元素, x i + x_{i+} xi+表示第 i i i行所有元素之和, x + i x_{+i} x+i表示第 i i i列所有元素之和,N表示所有元素之和。
p 0 p_0 p0表示观测精确性或一致性单元的比例; p c p_c pc表示偶然性一致或期望的偶然一致的单元的比例。
kappa取值范围是[-1,1],但通常kappa是[0,1],一般可分为如下五组来表示不同级别的一致性:
关于在房子周围可能发现的动物类型的预测,这个预测的三类问题的混淆矩阵如下所示:
从上图可以计算得到,总样本量N为96;
p 0 = 24 + 27 + 30 96 = 0.84 p c = ( 24 + 2 + 5 ) ∗ ( 24 + 2 + 4 ) + ( 2 + 27 + 0 ) ∗ ( 2 + 27 + 2 ) + ( 5 + 0 + 30 ) ∗ ( 4 + 2 + 30 ) 9 6 2 = 31 ∗ 30 + 29 ∗ 31 + 35 ∗ 36 9 6 2 = 0.34 K I A = 0.84 − 0.34 1 − 0.34 = 0.76 p_0=\frac{24+27+30}{96}=0.84 \\ \begin{aligned} p_c&=\frac{(24+2+5)*(24+2+4)+(2+27+0)*(2+27+2)+(5+0+30)*(4+2+30)}{96^2}\\&=\frac{31*30+29*31+35*36}{96^2}\\&=0.34 \end{aligned}\\ KIA=\frac{0.84-0.34}{1-0.34}=0.76 p0=9624+27+30=0.84pc=962(24+2+5)∗(24+2+4)+(2+27+0)∗(2+27+2)+(5+0+30)∗(4+2+30)=96231∗30+29∗31+35∗36=0.34KIA=1−0.340.84−0.34=0.76
import numpy as np
def kappa(confusion_matrix):
"""
计算多分类混淆矩阵的kappa系数
"""
N = np.sum(confusion_matrix)
sum_po = 0
sum_pe = 0
for i in range(len(confusion_matrix[0])):
sum_po += confusion_matrix[i][i]
i_row = np.sum(confusion_matrix[i, :])
i_col = np.sum(confusion_matrix[:, i])
sum_pe += i_row * i_col
po = sum_po / N
pe = sum_pe / (N * N)
kia = (po - pe) / (1 - pe)
return kia
输入如下代码
confusion_matrix=np.array([[24,2,5],[2,27,0],[4,2,30]])
kia=kappa(confusion_matrix)
print("kappa系数为:",kia)
运行结果如下:
kappa系数为: 0.7649747021380774
首先将上面的多分类混淆矩阵,根据类别拆分为3个二分类的混淆矩阵,并计算出每个混淆矩阵的Precision和Recall,具体如下图所示:
则
m a c r o P = 0.87 + 0.80 + 0.86 3 = 0.84 m a c r o R = 0.93 + 0.77 + 0.83 3 = 0.84 m a c r o F 1 = 2 × 0.84 × 0.84 0.84 + 0.84 = 0.84 macro \ P=\frac{0.87+0.80+0.86}{3}=0.84 \\ macro \ R=\frac{0.93+0.77+0.83}{3}=0.84 \\ macro \ F1=\frac{2 × 0.84 × 0.84}{0.84+0.84}=0.84 macro P=30.87+0.80+0.86=0.84macro R=30.93+0.77+0.83=0.84macro F1=0.84+0.842×0.84×0.84=0.84
对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算出混淆矩阵的平均TP、FP、TN、FN,构成全局混淆矩阵,并计算出了P、R,进而求出F1,具体结果如下:
分类性能指标
如果本文对你有帮助,记得“点赞”哦~