【笔记】评价指标
机器学习中,根据不同的侧重点,需要不同的指标来进行衡量;在大多数情况下不同类别的分类代价并不相等,即将样本分类为正例或反例的代价是不能相提并论的。例如在垃圾邮件过滤中,我们希望重要的邮件永远不要被误判为垃圾邮件,还有在癌症检测中,宁愿误判也不漏判。在这种情况下,仅仅使用错误率来度量是不充分的,这样的度量错误掩盖了样本如何被错分的事实。
这里主要记录 7 个:
准确率
,召回率
,F1
, 混淆矩阵
,ROC
,AUC
,Kappa
1、精准率(Precision)
注意这里这里所属的指标叫做精准率或者查准率,英文为Precision; 和统计对错的accuracy是不同的概念;概念上容易混淆,查准率是针对类别而言的。其计算方式如下:
准确率
a c c = 判定正确样本数 样本总数 acc = \frac{\text{判定正确样本数}}{\text{样本总数}} acc=样本总数判定正确样本数
精确率
p r e c = 分类正确的某类别样本个数 分类器判定为该类别的样本个数 prec = \frac{\text{分类正确的某类别样本个数}} {\text{分类器判定为该类别的样本个数}} prec=分类器判定为该类别的样本个数分类正确的某类别样本个数
精准率衡量查准的程度,判定为该类别的样本中确实是该类别的比率;
2、召回率(Recall)
召回率也叫查全率,其计算公式如下,衡量的是查全,不漏,指该类别样本中有多少被识别出来了;
召回率
r e c a l l = 分类正确的某类别样本个数 真实的该类别的样本个数 recall = \frac{\text{分类正确的某类别样本个数}}{\text{真实的该类别的样本个数}} recall=真实的该类别的样本个数分类正确的某类别样本个数
3、F1 分数
速记,2pr除以p加r
; F1是准确率和召回率的调和平均值;F1计算公式如下:
F1分数
f1分数是精准率和召回率的调和平均值
F
1
=
2
×
p
r
e
c
×
r
e
c
a
l
l
p
r
e
c
+
r
e
c
a
l
l
F1 = \frac{2\times prec \times recall}{prec + recall}
F1=prec+recall2×prec×recall
需要注意的是:F1中分为F1宏平均和F1微平均;
宏平均(Macro-averaging),是先对每一个类统计指标值,然后在对所有类求算术平均值。即计算每一个类别的F1后求均值;
微平均(Micro-averaging)。是对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标。 即计算出全局的PR后求F1;
宏平均和微平均的对比
- 如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
- 如果每个class的样本数量差异很大,而且你想:
- 更关注样本量多的class:使用宏平均
- 更关注样本量少的class:使用微平均
- 如果微平均大大低于宏平均,检查样本量多的class
- 如果宏平均大大低于微平均,检查样本量少的class
4、ROC
ROC: Receiver Operating Characteristic
ROC是一个用于度量分类中的非均衡性的工具,ROC曲线及AUC常被用来评价一个二值分类器的优劣。
ROC曲线存在一个很好的特性:其图形不受类别数量导致的不均衡所影响。
ROC曲线的定义如下:
绘制曲线关系,其中横坐标为FPR
(False positive rate 假阳率),纵坐标为真阳率TPR
(True postive rate)。
FPR:所有负例中有多少被预测为正例; TPR:有多少真正的正例被预测出来;
定义如下:
预测为 正样例 预测为 负样例 真实 正样例 TP FN 真实负样例 FP TN P r e c i s o n = T P T P + F P Precison = \frac{TP}{TP+FP} Precison=TP+FPTP 预测为正例的样本中有真正预测为正例的;
R e c a l l = T P T P + F N Recall = \frac{TP}{TP+FN} Recall=TP+FNTP 所有正例中有多少被预测出来
F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP 所有负样例中有多少被预测为正例
T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP 等同于recall
ROC曲线如何判断模型好坏,ROC曲线越接近左上角,该分类器的性能越好。 意味着分类器在假阳率很低的同时获得了很高的真阳率。
ROC有什么用呢?ROC可以用来辅助决策哪一个分类器比较好,举个例子,在以阈值作为分类的模型中,往往不知道哪一个阈值合适,这个时候可以使用不同的阈值来计算一组FPR和TPR的值,将其绘制成ROC曲线,从而知道那种阈值是最佳的;
5、AUC
AUC(Area Under Curve) 被定义为ROC曲线下的面积,因为ROC曲线一般都处于y=x这条直线的上方,所以取值范围在0.5和1之间,使用AUC作为评价指标是因为ROC曲线在很多时候并不能清晰地说明哪个分类器的效果更好(都知道越靠近左上角越好,怎么衡量靠近,就用曲线下面积来计算),而AUC作为一个数值,其值越大代表分类器效果更好。
6、Kappa
Kappa系数是一个用于一致性检验的指标,也可以用于衡量分类的效果。因为对于分类问题,所谓一致性就是模型预测结果和实际分类结果是否一致。kappa系数的计算是基于混淆矩阵的,取值为-1到1之间,通常大于0。值越大表示相关性越好;
基于混淆矩阵的kappa系数计算公式如下:
其计算公式为
K
a
p
p
a
=
P
o
−
P
e
1
−
P
o
Kappa = \frac{P_o-P_e}{1-P_o}
Kappa=1−PoPo−Pe
其中:
P
o
=
对角线元素之和
整个矩阵元素之和
其
实
就
是
a
c
c
P_o = \frac{\text{对角线元素之和}}{\text{整个矩阵元素之和}}\quad \quad\quad\textcolor{blue}{其实就是acc}
Po=整个矩阵元素之和对角线元素之和其实就是acc
P e = ∑ i 第i行元素之和 ⋅ 第i列元素之和 ( ∑ 矩 阵 所 有 元 素 之 和 ) 2 即 所 有 类 别 分 别 对 应 的 “ 实 际 与 预 测 数 量 的 乘 积 ” , 之 总 和 , 除 以 “ 样 本 总 数 的 平 方 P_e = \frac{\sum_i \text{第i行元素之和} \cdot \text{第i列元素之和}}{(\sum 矩阵所有元素之和)^2}\\\textcolor{blue}{ 即所有类别分别对应的“实际与预测数量的乘积”,之总和,除以“样本总数的平方} Pe=(∑矩阵所有元素之和)2∑i第i行元素之和⋅第i列元素之和即所有类别分别对应的“实际与预测数量的乘积”,之总和,除以“样本总数的平方
举个例子:
P e = [ ( 8 ∗ 8 ) + ( 27 ∗ 25 ) + ( 16 ∗ 14 ) + ( 4 ∗ 4 ) ] / 5 3 2 = 0.348 Pe = [ (8 * 8)+(27 * 25) + (16 * 14) + (4 * 4) ] / 53^2 = 0.348 Pe=[(8∗8)+(27∗25)+(16∗14)+(4∗4)]/532=0.348
P o = ( 4 + 20 + 9 + 3 ) / 53 = 0.6792 Po = (4+20+9+3)/53 = 0.6792 Po=(4+20+9+3)/53=0.6792
k a p p a = ( p o − p e ) / ( 1 − p e ) = 0.51 kappa = (po-pe)/(1-pe) = 0.51 kappa=(po−pe)/(1−pe)=0.51
代码实现
import numpy as np
# 没有对输入的合法性进行校验
# 使用时需要注意
def kappa(confusion_matrix):
"""计算kappa值系数"""
pe_rows = np.sum(confusion_matrix, axis=0)
pe_cols = np.sum(confusion_matrix, axis=1)
sum_total = sum(pe_cols)
pe = np.dot(pe_rows, pe_cols) / float(sum_total ** 2)
po = np.trace(confusion_matrix) / float(sum_total)
return (po - pe) / (1 - pe)
使用sklearn计算
from sklearn.metrics import cohen_kappa_score
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
kappa_value = cohen_kappa_score(y_true, y_pred)
print("kappa值为 %f" % kappa_value)
kappa值为 0.428571