IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 多标签文本分类MAP(mean average precision)的计算方式及相关代码实现 -> 正文阅读

[人工智能]多标签文本分类MAP(mean average precision)的计算方式及相关代码实现

下面是我从一本书上找到的关于MAP的讲解

?

如果要想计算precision以及recall,我们要先知道TP、FP、FN代表什么,通俗来讲,

TP:预测有,实际也有

FP:预测有,但实际没有

FN:预测没有,但是实际有

一个测试样例的情况:

很明显,通过这个图我们可以知道id表示这些标签的序号,也可以知道图中一共有20个标签种类。而socre则是表示表示这些预测标签的概率,gt_label其实就是correct(k),只有当该预测标签是测试样例的真实标签时,值才为1。因此,图中表明该测试样例一共6个真实标签。

需要对上述结果按照score的大小进行降序排序

?

我们以top-5举例

?

通过该图我们可以看出,TP=2,因为gt_label值为1的标签一共有两个,而真实标签一共有6个,因此也就有4个真实标签没有在里面(没有被预测到),所以我们得知FN=4,也就是有4个标签没有被召回。而剩下三个gt_label值为0的标签则是属于预测有该标签,但实际并无改标签的情况,因此FP=3。可以肯定的是,如果我们要计算top-k的P值,总有FP+TP=k,FN=m-TP,m为公式中样例真实标签的个数。因此,top-5的P和R我们就可以求得。

P=2/(2+3)=2/5

我们很容易就能看出分母其实就是k,即我们可以很容易的理解成

P=截止到k被预测到的真实标签的个数/k

R=2/(2+4)=2/6

我们也很容易的就能看出,分母其实是预测样例真实标签的总数量,即m,所以式子可以总结成

R=截止到k被预测到的真实标签的个数/m

另外,我们可以发现,P最大等于1

其他的top-k的计算方法请自行计算

?

得到P,其实AP就好算了,AP=gt_label*P=correct(k)*P

还有一个很重要的点,我们需要清楚,在计算AP的时候,由于k的取值是从1到多标签的总数,所以我们需要将每个k对应P*correct(k)都相加,但是仔细观察我们就会发现,除了真实标签的correct=1,其他的correct的值均为0,因此我们其实只需要计算截止到真实标签的k对应的P就好,这里用例子解释比较容易理解,比如某个样例有两个标签,L1、L2,设它们的索引为I1、I2(注意索引是从1开始的,因为k是从1开始的),且我们规定,L1比L2的score(预测概率)要高,因此I1比I2要小。通过前面的推理我们很容易就能推出来,P1=1/I1,P2=2/I2,AP=(1/I1+2/I2)/2。注意,在实际编写代码中,I1和I2的顺序千万不要混。

相关代码如下:

# 获得该测试样本每个真实标签在pre_labels里面的索引值(索引从1开始)

# 用列表来存储这些标签的索引值

label_indexs = []

for one_label in true_labels:

for ls in pre:

if one_label == ls[0]:

index = pre.index(ls) # 获取k-1

k = index + 1

label_indexs.append(k)

print("样例真实标签的位置", label_indexs)

"""

测试样例里面的真实标签并不一定会按正确的顺序排列,如[9,1],

我们设L1对应的位置是1,L2对应的位置是9,那么必然L1比L2的socre高,即L1在L2前面

按理说,AP=(1/I1+2/I2)/2=(1/1+2/9)/2

但如果不排序,就会变成AP=(1/I2+2/I1)/2=(1/9+2/1)/2>1,错误

"""

sort_label_indexs = sorted(label_indexs) # 对索引(位置)进行排序

print("排序后的位置",sort_label_indexs)

# 每次用都初始化一下

sum = 0 # 记录AP的分子

number = 1

AP = 0

for i in sort_label_indexs:

sum = sum + (number / i)

number = number + 1

AP = sum / m

print("AP",AP)

if AP==1:

AP_count=AP_count+1

MAP_sum=MAP_sum+AP

count=count+1 #标签编码计数

MAP=MAP_sum / len_sentence

print("MAP",MAP)

print("AP_count",AP_count)

return MAP

预测标签格式(已排好序):

pre=[('里面没有清洁干净(灰尘、垃圾等)', 0.66146), ('车身没有洗干净', 0.54677),

('经销商没提供洗车服务', 0.05352), ('车身没有擦干', 0.04792),

('工作人员不负责任/简单应付', 0.02343)]

真实标签格式:['里面没有清洁干净(灰尘、垃圾等)']

注:len_sentence为公式中的Q,即测试样本的数量

上述是笔者关于多标签文本分类指标MAP的一些理解,如果不对,敬请指正,非常感谢!

参考链接:

(11条消息) 多标签图像分类任务的评价方法——mAP_liubo187的博客-CSDN博客_图像分类map

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 14:56:26  更:2021-10-24 14:57:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 8:23:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码