【笔记】评价指标

本文介绍了机器学习中常用的评价指标,包括精准率、召回率、F1分数及其宏平均与微平均的区别,ROC曲线和AUC,以及Kappa系数。精准率衡量分类正确样本的比例,召回率表示正例被正确识别的比例,F1分数综合考虑精准率和召回率。ROC曲线用于评估二值分类器的性能,AUC表示ROC曲线下的面积,Kappa系数则评估分类一致性。这些指标对于选择合适的模型和调整分类阈值至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【笔记】评价指标


机器学习中,根据不同的侧重点,需要不同的指标来进行衡量;在大多数情况下不同类别的分类代价并不相等,即将样本分类为正例或反例的代价是不能相提并论的。例如在垃圾邮件过滤中,我们希望重要的邮件永远不要被误判为垃圾邮件,还有在癌症检测中,宁愿误判也不漏判。在这种情况下,仅仅使用错误率来度量是不充分的,这样的度量错误掩盖了样本如何被错分的事实。

这里主要记录 7 个:

准确率召回率F1混淆矩阵ROCAUCKappa

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;

宏平均和微平均的对比
  1. 如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
  2. 如果每个class的样本数量差异很大,而且你想:
    • 更关注样本量多的class:使用宏平均
    • 更关注样本量少的class:使用微平均
  3. 如果微平均大大低于宏平均,检查样本量多的class
  4. 如果宏平均大大低于微平均,检查样本量少的class

4、ROC

参考

ROC: Receiver Operating Characteristic

ROC是一个用于度量分类中的非均衡性的工具,ROC曲线及AUC常被用来评价一个二值分类器的优劣。

ROC曲线存在一个很好的特性:其图形不受类别数量导致的不均衡所影响。

ROC曲线的定义如下:

绘制曲线关系,其中横坐标为FPR(False positive rate 假阳率),纵坐标为真阳率TPR(True postive rate)。

FPR:所有负例中有多少被预测为正例; TPR:有多少真正的正例被预测出来;

定义如下:

预测为 正样例预测为 负样例
真实 正样例TPFN
真实负样例FPTN

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=1PoPoPe

其中:
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=2ii行元素之和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=[(88)+(2725)+(1614)+(44)]/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=(pope)/(1pe)=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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值