首页 > 编程语言 >分类模型的算法性能评价

分类模型的算法性能评价

时间:2024-07-09 15:53:18浏览次数:18  
标签:F1 frac macro 模型 ROC micro 算法 test 评价

一、概述

  分类模型是机器学习中一种最常见的问题模型,在许多问题场景中有着广泛的运用,是模式识别问题中一种主要的实现手段。分类问题概况起来就是,对一堆高度抽象了的样本,由经验标定了每个样本所属的实际类别,由特定算法训练得到一个分类器,输入样本属性即自动计算出其所属类别,从而完成特定的识别任务。依实现原理的不同,分类算法有很多种,常见的如支持向量机、决策树、k近邻、朴素贝叶斯......,以及设计了的各种人工神经网络等。在特定问题中,算法性能的评价是一个重要的方面,它一般由学习器在测试数据中的性能表现来直接衡定,常见的评价指标有准确率、精准度(查准率)、召回率(查全率)、F1值、ROC-AUC值、Kappa系数等。

二、评价指标——二分类情形

  二分类模型是较常见和较一般化的情形,它预测的混淆矩阵可表示为

其中,
  TP(True Positive,真正例)为被正确划分为正例的样本数;
  FP(False Positive,假正例)为被错误划分为正例的样本数;
  TN(True Negative,真负例)为被正确划分为负例的样本数;
  FN(False Negative,假负例)为被错误划分为负例的样本数。

1.准确率(accuracy)

  准确率是被预测正确的样本数与样本总数\(N\)的比值,比较直观地反映了学习器的性能。表达式为

\[Accuracy=\frac{TP+TN}{N} \]

2. 精准度(precision)

   精准度是TP(真正例)占预测为正例样本数的百分比,它表征了预测的正例中有多少有效成分,也叫做查准率。表达式为

\[precision=\frac{TP}{TP+FP} \]

3. 召回率(recall)

  召回率是TP(真正例)与真实正样本数的比值,它表征了所有的有效内容有多少被检测了出来,也叫做查全率、灵敏度(sensitive)。表达式为

\[recall=\frac{TP}{TP+FN} \]

4. F度量(F-Measure, F-Score)

  我们希望学习器的查准率和查全率都高,而查准率和查全率往往是一对矛盾的度量,查准率高时,查全率往往偏低;查全率高时,查准率往往偏低。此时可以用F度量来综合评估精准度(查准率)和召回率(查全率),数值越高学习器越理想。它的一般形式记作\(F_\beta\),表达式为

\[F_\beta=\frac{(1+\beta^2)\cdot precision\cdot recall}{\beta^2\cdot precision + recall} \]

  式中的\(\beta\) 值能够表达出对查准率/查全率的不同偏好,如F1分数认为召回率和精准度同等重要,F2分数认为召回率的重要程度是精准度的两倍,而F0.5分数认为召回率的重要程度是精准度的一半。其中,F1度量是最常用的一种,表达式为

\[F_1=\frac{2\cdot precision\cdot recall}{precision+recall} \]

注:
F1由调和平均进行定义: $$\frac{1}{F_1}=\frac{1}{2}\left(
\frac{1}{precision}+\frac{1}{recall} \right)$$ \(F_\beta\)由加权调和平均进行定义:

\[\frac{1}{F_\beta}=\frac{1}{1+\beta^2 }\left( \frac{1}{precision}+\frac{\beta^2}{recall} \right)\]

5.ROC曲线与AUC值

  ROC(Receiver Operating Characteristic,受试者工作特征)曲线是以真正率(TPR)为纵轴、假正率(FPR)为横轴绘制的曲线,AUC(Area Under ROC Curve)是ROC曲线下的面积,它们能够在一定程度上衡量分类器的性能,示意图如图所示。

  TPR(true positive rate,真正率)、FPR(false positive rate,假正率)表达式为

\[TPR=\frac{TP}{TP+FN} \]

\[FPR=\frac{FP}{FP+TN} \]


  ROC与AUC的度量,对二分类问题来说是更直观的,它直接地关注于正例样本,通过正例样本的整体表现来衡量学习器的性能。而这个正例类的指定,则由实际问题情形而确定。
  ROC曲线的绘制过程为,对测试样本集中的样本,将待考察的类别规定为正例类,学习器计算得到每个样本归属于正例类的概率,对所有样本依概率进行排序,起始时将划分阈值设为最大,即将所有样本划为负样本,此时TPR和FPR均为0,坐标轴上在(0,0)处标定了一个点。然后调整划分阈值,依次将每个样本划为正样本,TPR、FPR值随之增大,连接过程中标定的坐标点即得到ROC曲线。易知,若一个学习器的ROC曲线被另一个学习器的曲线完全包住,则后者的性能优于前者;若两个学习器的曲线发生交叉,则可比较ROC曲线下的面积,即AUC(Area Under ROC Curve),面积越大,性能越好。
  假定ROC曲线由坐标点{(x1,y1),(x2,y2),…,(xn,yn)}按序连接而成,则AUC值估算的表达式为

\[AUC=\frac{1}{2}\sum_{i=1}^{n-1}{\left( x_{i+1}-x_i \right)\cdot\left( y_i+y_{i+1} \right)} \]

6.Kappa系数

  Kappa系数是统计分析中一种进行一致性检验的常见方法,能够较大程度上反映出分类算法的性能表现。它的计算同样基于混淆矩阵,反映的是预测结果与实际结果的一致性,其取值范围为[-1,1],值越大说明一致性越高,性能越好;反之性能越差。假设样本总数为N,Kappa系数定义为

\[kappa=\frac{p_o-p_e}{1-p_e} \]

  其中,\(p_o=\frac{1}{N}\left( TP+TN \right)\)是整体准确率,
     \(p_e=\frac{1}{N^2}\left[ \left( TP+FN \right)\cdot \left( TP+FP \right)+\left( FP+TN \right)\cdot \left( FN+TN \right) \right]\)表偶然一致性。

三、评价指标——多分类情形

  多分类情形下的混淆矩阵表示为

  多分类问题往往能够转化为多个二分类问题,对它们性能的评价可通过宏计算或微计算的方式进行。

1.准确率(accuracy)

  准确率即混淆矩阵主对角线上的值之和与样本总数N的比值

\[Accuracy=\frac{1}{N}\sum_{i=1}^{K}{x_{ii}} \]

2.精准度、召回率、F1值

  对于多分类任务,各个类别两两之间即对应了一个混淆矩阵,计算查准率、查全率、F1值的方式有两种,一种是对各混淆矩阵计算得到的指标值对应求平均,得到宏查准率(macro-P)、宏查全率(macro-R)和宏F1值(macro-F1);另一种是将各混淆矩阵对应位置处的值求平均,记为\(\bar{TP}\)、\(\bar{FP}\)、\(\bar{TN}\)、\(\bar{FN}\),由这些平均的值计算得到微查准率(micro-P)、微查全率(micro-R)和微F1值(micro-F1)。假设共有K个类别,那么混淆矩阵数量为\(C_{K}^{2}=\frac{K\cdot(K-1)}{2}\),记为n,则
  宏计算的指标值表示为

\[macro_{-}P=\frac{1}{n}\sum_{i=1}^{n}{precision_i} \]

\[macro_{-}R=\frac{1}{n}\sum_{i=1}^{n}{recall_i} \]

\[macrox_{-}F1=\frac{2\ast macro_{-}P\ast macro_{-}R}{macro_{-}P+macro_{-}R} \]


  微计算的指标值表示为 $$micro_{-}P=\frac{\bar{TP}}{\bar{TP}+\bar{FP}}$$ $$micro_{-}R=\frac{\bar{TP}}{\bar{TP}+\bar{FN}}$$ $$micro_{-}F1=\frac{2\ast micro_{-}P \ast micro_{-}R}{micro_{-}P+micro_{-}R}$$

3. ROC曲线与AUC值

  多分类情形下的ROC与AUC同样可以以“宏”或“微”的形式进行计算。
方式一:
  对于K(K>2)类分类问题,分别将每一个类别视作正例,其余各类别视作负例,在概率预测矩阵中,按当前类别列下的概率值进行排序,随之调整划分阈值,可得到一条ROC曲线,如此,共可得到K条ROC曲线,对各曲线的坐标点求平均,即绘制出一条“宏计算(macro)”的ROC曲线,并可计算出它对应的AUC值。简单地说就是,概率预测矩阵的每一列值排序后都形成一条ROC曲线,再得到平均后的曲线。

方式二:
  对于K(K>2)类分类问题,首先将样本标签one-hot化,得到一个K列的0和1标识的矩阵,将概率预测矩阵和该矩阵分别按行或按列将各自拼接为一维向量,按此概率向量进行排序,随之调整划分阈值,可得到一条“微计算(micro)”的ROC曲线,并可计算出它对应的AUC值。简单地说就是,概率预测矩阵的所有值排序后直接地形成一条ROC曲线。

4.Kappa系数

  Kappa的计算与二分类是一致的,假设样本类别数为K,总样本数为N,实际为i预测为j的样本数为\(a_{ij}\),有

\[kappa=\frac{p_o-p_e}{1-p_e} \]

  其中,\(p_o=\frac{1}{N}\sum_{i=1}^{K}{a_{ii}}\)是整体准确率,\(p_e=\frac{1}{N^2}\sum_{i=1}^{K}{a_{i+}\cdot a_{+i}}\) 表偶然一致性。

例如,在某分类问题中,样本真实类别和预测类别分别是
   y_true=['A','A','C','B','B','A','C','B'];
   y_pred=['C','A','C','B','B','A','B','B'],
其对应的混淆矩阵为

  则\(p_o=\frac{2+3+1}{8}=0.75\),\(p_e=\frac{3\times 2+3\times 4+2\times 2}{8\times 8}=0.3438\)
  所以\(kappa=\frac{0.75-0.3438}{1-0.3438}=0.619\)

四、Python实现

二分类情形

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from sklearn.metrics import cohen_kappa_score

## 1.定义数据集

# 训练数据
train_x = [
    [4.8,3,1.4,0.3],
    [5.1,3.8,1.6,0.2],
    [4.6,3.2,1.4,0.2],
    [5.3,3.7,1.5,0.2],
    [5,3.3,1.4,0.2],
    [7,3.2,4.7,1.4],
    [6.4,3.2,4.5,1.5],
    [6.9,3.1,4.9,1.5],
    [5.5,2.3,4,1.3],
    [6.5,2.8,4.6,1.5]
]

# 训练数据标签
train_y = [
    'A',
    'A',
    'A',
    'A',
    'A',
    'B',
    'B',
    'B',
    'B',
    'B'
]


# 测试数据
test_x = [
    [3.1,3.5,1.4,0.2],
    [4.9,3,1.4,0.2],
    [5.1,2.5,3,1.1],
    [6.2,3.6,3.4,1.3]
]

# 测试数据标签
test_y = [
    'A',
    'A',
    'B',
    'B'
]

train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)
test_y = np.array(test_y)

## 2.训练分类器
clf_dt = DecisionTreeClassifier(max_depth=None, min_samples_split=2)  # 定义决策树学习器
rclf_dt = clf_dt.fit(train_x,train_y)  # 训练

## 3.数据计算
pre_y = rclf_dt.predict(test_x)
pre_y_proba = rclf_dt.predict_proba(test_x)[:,0] # 预测为类'A'的概率

## 4.性能评价
# (1) 准确率
accuracy = metrics.accuracy_score(test_y,pre_y)

# (2) 精确度(查准率)
precision = metrics.precision_score(test_y,pre_y,pos_label='A') # pos_label指定正例类

# (3) 召回率(查全率)
recall = metrics.recall_score(test_y,pre_y,pos_label='A')

# (4) F1度量
F1 = metrics.f1_score(test_y,pre_y,pos_label='A')

# (5) ROC-AUC值
fpr,tpr,threshold = metrics.roc_curve(test_y,pre_y_proba,pos_label='A')
AUC = metrics.auc(fpr,tpr)

# (6) Kappa系数
kappa = cohen_kappa_score(test_y, pre_y)

## 5.结果输出
print('\naccuracy:', accuracy)
print('\nprecision:', precision)
print('recall:', recall)
print('F1:', F1)
print('\nAUC:', AUC)
print('\nkappa:', kappa)

# ROC曲线绘图
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % AUC)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Binary Classify ROC')
plt.legend(loc="lower right")
plt.show()


多分类情形

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import cohen_kappa_score

## 1.定义数据集

# 训练数据
train_x = [
    [4.8,3,1.4,0.3],
    [5.1,3.8,1.6,0.2],
    [4.6,3.2,1.4,0.2],
    [5.3,3.7,1.5,0.2],
    [5,3.3,1.4,0.2],
    [7,3.2,4.7,1.4],
    [6.4,3.2,4.5,1.5],
    [6.9,3.1,4.9,1.5],
    [5.5,2.3,4,1.3],
    [6.5,2.8,4.6,1.5],
    [6.3,3.3,6,2.5],
    [5.8,2.7,5.1,1.9],
    [7.1,3,5.9,2.1],
    [6.3,2.9,5.6,1.8],
    [6.5,3,5.8,2.2]
]

# 训练数据标签
train_y = [
    'A',
    'A',
    'A',
    'A',
    'A',
    'B',
    'B',
    'B',
    'B',
    'B',
    'C',
    'C',
    'C',
    'C',
    'C'
]


# 测试数据
test_x = [
    [5.1,3.5,1.4,0.2],
    [4.9,3,1.4,0.2],
    [5.1,2.5,3,1.1],
    [5.7,2.8,4.1,1.3],
    [6.2,3.4,5.4,2.3],
    [5.9,3,5.1,1.8]
]

# 测试数据标签
test_y = [
    'A',
    'A',
    'C',
    'B',
    'C',
    'C'
]

train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)
test_y = np.array(test_y)

## 2.训练分类器
clf_dt = DecisionTreeClassifier(max_depth=None, min_samples_split=2)  # 定义决策树学习器
rclf_dt = clf_dt.fit(train_x,train_y)  # 训练

## 3.数据计算
pre_y = rclf_dt.predict(test_x)
pre_y_proba = rclf_dt.predict_proba(test_x)

## 4.性能评价
# (1) 准确率
accuracy = metrics.accuracy_score(test_y,pre_y)

# (2) P-R度量
precision_macro = metrics.precision_score(test_y,pre_y,average='macro')  #宏精确度(查准率)
recall_macro = metrics.recall_score(test_y,pre_y,average='macro')  #宏召回率(查全率)
F1_macro = metrics.f1_score(test_y,pre_y,average='macro')  #宏F1度量

precision_micro = metrics.precision_score(test_y,pre_y,average='micro')  #微精确度(查准率)
recall_micro = metrics.recall_score(test_y,pre_y,average='micro')  #微召回率(查全率)
F1_micro = metrics.f1_score(test_y,pre_y,average='micro')  #微F1度量

# (3)ROC-AUC值
encoder = OneHotEncoder(sparse_output=False)  # 创建一个OneHotEncoder对象
onehot_test_y = encoder.fit_transform(test_y.reshape(-1, 1)) # 对整数数组进行one-hot编码
AUC_macro = metrics.roc_auc_score(onehot_test_y,pre_y_proba, average='macro', sample_weight=None)
AUC_micro = metrics.roc_auc_score(onehot_test_y,pre_y_proba, average='micro', sample_weight=None)

# (4) Kappa系数
kappa = cohen_kappa_score(test_y, pre_y)

## 5.结果输出
print('\naccuracy: ', accuracy)
print('\nprecision_macro: ',precision_macro)
print('recall_macro:',recall_macro)
print('F1_macro:',F1_macro)
print('\nprecision_micro:',precision_micro)
print('recall_micro:',recall_micro)
print('F1_micro:',F1_micro)
print('\nAUC_macro: ',AUC_macro)
print('AUC_micro:',AUC_micro)
print('\nKappa: ',kappa)


End.


参考:
  周志华. 机器学习. 清华大学出版社.


全文pdf下载

标签:F1,frac,macro,模型,ROC,micro,算法,test,评价
From: https://www.cnblogs.com/flyup/p/18292099

相关文章

  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • [大数据][机器学习]之Model Card(模型卡片)介绍
    每当我们在公有云或者私有云发布训练好的大数据模型,为了方便大家辨识、理解和运用,参照huggingface所制定的标准制作一个ModelCard展示页,是种非常好的模型展示和组织形式。下面就是一个ModelCard的示例,我试着把它翻译成了中文,源网址,并且提供了Markdown的模板,供大家参考。在这里......
  • Java智能之Spring AI:5分钟打造智能聊天模型的利器
    前言尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架。随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统,人工智能已经成为了现代生活和工作中不可或缺的一部分。在这样......
  • RocketMQ概念与模型
    为啥要用MQ?这个都应该会背了,6个字解耦、异步、削峰RocketMQ的优缺点?适用场景?主要与Kafka相比单机吞吐量:十万级(类似kafka)消息堆积:支持10亿级别消息堆积源码是Java天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其电商里订单扣款、业务削峰,业务场景在阿里双11经历过......
  • 拆解LangChain的大模型记忆方案
    之前我们聊过如何使用LangChain给LLM(大模型)装上记忆,里面提到对话链ConversationChain和MessagesPlaceholder,可以简化安装记忆的流程。下文来拆解基于LangChain的大模型记忆方案。1.安装记忆的原理1.1.核心步骤给LLM安装记忆的核心步骤就3个:在对话之前调取之前的历史消息。......
  • 路径规划(2)——A*算法
    1、A*算法原理搜索区域(TheSearchArea):图中的搜索区域被划分为了简单的二维数组,数组每个元素对应一个小方格,当然我们也可以将区域等分成是五角星,矩形等,通常将一个单位的中心点称之为搜索区域节点(Node)。开放列表(OpenList):我们将路径规划过程中待检测的节点存放于OpenList......
  • 深度学习 - 模型剪枝技术详解
    模型剪枝简介模型剪枝(ModelPruning)是一种通过减少模型参数来降低模型复杂性的方法,从而加快推理速度并减少内存消耗,同时尽量不显著降低模型性能。这种技术特别适用于资源受限的设备,如移动设备和嵌入式系统。模型剪枝通常应用于深度神经网络,尤其是卷积神经网络(CNNs)。模型剪......
  • 大模型算法方向实习会经常提问哪些问题?看完手撕面试官拿下offer!
    现互联网研发一枚,曾拿过多个算法/研发岗SPoffer,简要介绍一下大模型算法岗面试内容和如何准备面试。大模型算法岗的面试内容,实际上可以拆解成两部分,一是算法岗通用的面试内容,二是大模型专有相关部分。算法岗通用面试内容这部分内容很重要,因为通用的面试内容可以适用于不同......
  • 职场人该如何学习使用AI大模型(非常详细)零基础入门到精通,收藏这一篇就够了
    非技术背景的职场人想要学习和使用AI大模型,可以遵循以下步骤:基础学习:首先,需要掌握人工智能的基础知识,包括但不限于机器学习、深度学习等领域。可以通过阅读《ArtificialIntelligence:AModernApproach》和《MachineLearning》等书籍来了解这些概念[1]。此外,高等数学、......
  • 分享一些算法开局技巧(C++)
    目录一、万能头文件二、一些宏定义操作三、提前定义好一些常用的值四、快读五、一键获取题目的案例数据六、一键生成代码模板总结:个人心得一、万能头文件一般算法需要用到各种头文件,但是万能头文件包括了绝大多数的头文件,能缩减一些代码量。但是也有一点副作用,由于......