• 多标签分类 评价指标Metrics play quite an important role in the field of Machine Learning or Deep Learning. We start the problems with metric selection as to know the baseline score of a particular ...

多标签分类 评价指标

Metrics play quite an important role in the field of Machine Learning or Deep Learning. We start the problems with metric selection as to know the baseline score of a particular model. In this blog, we look into the best and most common metrics for Multi-Label Classification and how they differ from the usual metrics.
指标在机器学习或深度学习领域中扮演着非常重要的角色。 我们从度量选择开始着手，以了解特定模型的基线得分。 在此博客中，我们研究了“多标签分类”的最佳和最常用指标，以及它们与通常的指标有何不同。
Let me get into what is Multi-Label Classification just in case you need it. If we have data about the features of a dog and we had to predict which breed and pet category it belonged to.
让我进入什么是多标签分类，以防万一您需要它。 如果我们有关于狗的特征的数据，并且我们必须预测它属于哪个品种和宠物。
In the case of Object Detection, Multi-Label Classification gives us the list of all the objects in the image as follows. We can see that the classifier detects 3 objects in the image. It can be made into a list as follows [1 0 1 1] if the total number of trained objects are 4 ie. [dog, human, bicycle, truck].
在对象检测的情况下，多标签分类为我们提供了图像中所有对象的列表，如下所示。 我们可以看到分类器检测到图像中的3个对象。 如果训练对象的总数为4，即[1 0 1 1]，则可以将其列为以下列表。 [狗，人，自行车，卡车]。

Object Detection output

目标检测输出

This kind of classification is known as Multi-Label Classification.
这种分类称为多标签分类。
The most common metrics that are used for Multi-Label Classification are as follows:
用于多标签分类的最常见指标如下：
Precision at k k精度 Avg precision at k平均精度(k)Mean avg precision at k k的平均平均精度 Sampled F1 Score采样的F1分数
Let’s get into the details of these metrics.
让我们详细了解这些指标。
k精度(P @ k)： (Precision at k (P@k):)
Given a list of actual classes and predicted classes, precision at k would be defined as the number of correct predictions considering only the top k elements of each class divided by k. The values range between 0 and 1.
给定实际类别和预测类别的列表，将在k处的精度定义为仅考虑每个类别的前k个元素除以k得出的正确预测数。 取值范围是0到1。
Here is an example as explaining the same in code:
这是一个解释相同代码的示例：
def patk(actual, pred, k):
#we return 0 if k is 0 because
#   we can't divide the no of common values by 0
if k == 0:
return 0

#taking only the top k predictions in a class
k_pred = pred[:k]

#taking the set of the actual values
actual_set = set(actual)

#taking the set of the predicted values
pred_set = set(k_pred)

#taking the intersection of the actual set and the pred set
# to find the common values
common_values = actual_set.intersection(pred_set)

return len(common_values)/len(pred[:k])

#defining the values of the actual and the predicted class
y_true = [1 ,2, 0]
y_pred = [1, 1, 0]

if __name__ == "__main__":
print(patk(y_true, y_pred,3))
Running the following code, we get the following result.
运行以下代码，我们得到以下结果。
0.6666666666666666
In this case, we got the value of 2 as 1, thus resulting in the score going down.
在这种情况下，我们将2的值设为1，从而导致得分下降。
K处的平均精度(AP @ k)： (Average Precision at K (AP@k):)
It is defined as the average of all the precision at k for k =1 to k. To make it more clear let’s look at some code. The values range between 0 and 1.
它定义为k = 1至k时k处所有精度的平均值。 为了更加清楚，让我们看一些代码。 取值范围是0到1。
import numpy as np
import pk

def apatk(acutal, pred, k):
#creating a list for storing the values of precision for each k
precision_ = []
for i in range(1, k+1):
#calculating the precision at different values of k
#      and appending them to the list
precision_.append(pk.patk(acutal, pred, i))

#return 0 if there are no values in the list
if len(precision_) == 0:
return 0

#returning the average of all the precision values
return np.mean(precision_)

#defining the values of the actual and the predicted class
y_true = [[1,2,0,1], [0,4], [3], [1,2]]
y_pred = [[1,1,0,1], [1,4], [2], [1,3]]

if __name__ == "__main__":
for i in range(len(y_true)):
for j in range(1, 4):
print(
f"""
y_true = {y_true[i]}
y_pred = {y_pred[i]}
AP@{j} = {apatk(y_true[i], y_pred[i], k=j)}
"""
)
Here we check for the AP@k from 1 to 4. We get the following output.
在这里，我们检查从1到4的AP @ k。我们得到以下输出。
y_true = [1, 2, 0, 1]
y_pred = [1, 1, 0, 1]
AP@1 = 1.0

y_true = [1, 2, 0, 1]
y_pred = [1, 1, 0, 1]
AP@2 = 0.75

y_true = [1, 2, 0, 1]
y_pred = [1, 1, 0, 1]
AP@3 = 0.7222222222222222

y_true = [0, 4]
y_pred = [1, 4]
AP@1 = 0.0

y_true = [0, 4]
y_pred = [1, 4]
AP@2 = 0.25

y_true = [0, 4]
y_pred = [1, 4]
AP@3 = 0.3333333333333333

y_true = [3]
y_pred = [2]
AP@1 = 0.0

y_true = [3]
y_pred = [2]
AP@2 = 0.0

y_true = [3]
y_pred = [2]
AP@3 = 0.0

y_true = [1, 2]
y_pred = [1, 3]
AP@1 = 1.0

y_true = [1, 2]
y_pred = [1, 3]
AP@2 = 0.75

y_true = [1, 2]
y_pred = [1, 3]
AP@3 = 0.6666666666666666
This gives us a clear understanding of how the code works.
这使我们对代码的工作方式有了清晰的了解。
K处的平均平均精度(MAP @ k)： (Mean Average Precision at K (MAP@k):)
The average of all the values of AP@k over the whole training data is known as MAP@k. This helps us give an accurate representation of the accuracy of whole prediction data. Here is some code for the same.
整个训练数据中AP @ k所有值的平均值称为MAP @ k。 这有助于我们准确表示整个预测数据的准确性。 这是一些相同的代码。
The values range between 0 and 1.
取值范围是0到1。
import numpy as np
import apk

def mapk(acutal, pred, k):

#creating a list for storing the Average Precision Values
average_precision = []
#interating through the whole data and calculating the apk for each
for i in range(len(acutal)):
average_precision.append(apk.apatk(acutal[i], pred[i], k))

#returning the mean of all the data
return np.mean(average_precision)

#defining the values of the actual and the predicted class
y_true = [[1,2,0,1], [0,4], [3], [1,2]]
y_pred = [[1,1,0,1], [1,4], [2], [1,3]]

if __name__ == "__main__":
print(mapk(y_true, y_pred,3))
Running the above code, we get the output as follows.
运行上面的代码，我们得到的输出如下。
0.4305555555555556
Here, the score is bad as the prediction set has many errors.
在此，由于预测集存在许多错误，因此评分很差。
F1-样本： (F1 — Samples:)
This metric calculates the F1 score for each instance in the data and then calculates the average of the F1 scores. We will be using sklearn’s implementation of the same in the code.
此度量标准计算数据中每个实例的F1分数，然后计算F1分数的平均值。 我们将在代码中使用sklearn的相同实现。
Here is the documentation of F1 Scores. The values range between 0 and 1.
这是F1分数的文档。 取值范围是0到1。
We first convert the data into binary format and then perform f1 on the same. This gives us the required values.
我们首先将数据转换为二进制格式，然后对它执行f1。 这为我们提供了所需的值。
from sklearn.metrics import f1_score
from sklearn.preprocessing import MultiLabelBinarizer

def f1_sampled(actual, pred):
#converting the multi-label classification to a binary output
mlb = MultiLabelBinarizer()
actual = mlb.fit_transform(actual)
pred = mlb.fit_transform(pred)

#fitting the data for calculating the f1 score
f1 = f1_score(actual, pred, average = "samples")
return f1

#defining the values of the actual and the predicted class
y_true = [[1,2,0,1], [0,4], [3], [1,2]]
y_pred = [[1,1,0,1], [1,4], [2], [1,3]]

if __name__ == "__main__":
print(f1_sampled(y_true, y_pred))
The output of the following code will be the following:
以下代码的输出如下：
0.45
We know that the F1 score lies between 0 and 1 and here we got a score of 0.45. This is because the prediction set is bad. If we had a better prediction set, the value would be closer to 1.
我们知道F1分数介于0和1之间，在这里我们得到0.45的分数。 这是因为预测集不好。 如果我们有更好的预测集，则该值将接近1。
Hence based on the problem, we usually use Mean Average Precision at K or F1 Sample or Log Loss. Thus setting up the metrics for your problem.
因此，基于该问题，我们通常使用K或F1样本或对数损失的平均平均精度。 从而为您的问题设置指标。
I would like to thank Abhishek for his book Approaching (Any) Machine Learning Problem without which this blog wouldn’t have been possible.
我要感谢Abhishek的书《接近(任何)机器学习问题》，否则就没有这个博客。

翻译自: https://medium.com/analytics-vidhya/metrics-for-multi-label-classification-49cc5aeba1c3

多标签分类 评价指标

展开全文
• pytorch实现多标签分类评价标准 附完整代码

万次阅读 热门讨论 2019-08-13 20:55:13
本周末补充
不好意思，最近有事来不及更 直接打包代码放在百度云盘里面了 有需要的直接下吧
链接: https://pan.baidu.com/s/1WKaiUI5EZAZ2K9jmFF_SHA 提取码: 7jrs 复制这段内容后打开百度网盘手机App，操作更方便哦
云盘里面内容：  运行结果： 
展开全文
• HL，RL， OE， Cov是多标签分类评价指标，通常越小表明模型越好。 一，HL计算 公式： 大意是，有N个样本的数据集，对每个样本的标签集部分，计算真实标签与预测标签部分有多少个不同的部分， 举个栗子： 样本1，y...
AP的计算见本人另一篇博客 HL，RL， OE， Cov是多标签分类的评价指标，通常越小表明模型越好。
一，HL计算 公式：  大意是，有N个样本的数据集，对每个样本的标签集部分，计算真实标签与预测标签部分有多少个不同的部分， 举个栗子： 样本1，y_true = [1, 0, 1, 0, 0]，y_pred = [0, 1, 1, 0, 0]，可以看到它有2个预测出错的部分，记样本1汉明损失为2/5 = 0.4 样本2，y_true = [1, 0, 1, 0, 1]，y_pred = [1, 1, 0, 0, 0]，可以看到它有3个预测出错的部分，记样本1汉明损失为3/5 = 0.6 对于总的样本集，汉明损失为（0.4+0.6）/ 2 = 0.5 程序：
import numpy as np
from sklearn import metrics
label = np.array([[1, 0, 1, 0, 0], [1, 0, 1, 0, 1]])
pred = np.array([[0, 1, 1, 0, 0], [1, 1, 0, 0, 0]])
print(metrics.hamming_loss(label, pred))

结果：  二，RL计算 公式：  这一大坨我估计很多人第一眼看到就不想看第二眼，  翻译成人话，就是计算标签集中的排序损失。假设数据集有N个样本，对每个样本计算它的标签集中为1的标签的概率小于标签集中为0的概率的标签个数除以标签为1的标签个数乘以标签为0的标签个数。 举个栗子： 样本1，真实标签集y_true = [1, 0, 1, 0, 0]，标签预测概率值y_score = [0.3, 0.4, 0.5, 0.1, 0.15]，样本1有2个预测为1的标签，即概率为0.3和概率为0.5的标签，一个个来看，对概率为0.3的标签，在整个标签集中，标签为0的标签中，有概率为0.4的标签概率比它大，记为1；对概率为0.5的标签，在整个标签集中，标签为0的标签中，没有标签的概率值比它大，记为0。则样本1的所有标签的排序损失标签为1个，标签为1的标签有2个，标签为0的标签有3个，则基数对有2*3=6个，样本的排序损失为1/6=0.1666667
样本2，真实标签集y_true = [1, 0, 1, 0, 1]，标签预测概率值y_score = [0.4, 0.5, 0.7, 0.2, 0.6]，样本1有3个预测为1的标签，即概率为0.4、概率为0.7和概率为0.7的标签，一个个来看，对概率为0.4的标签，在整个标签集中，标签为0的标签中，有概率为0.5的标签概率比它大，记为1；对概率为0.7的标签，没有标签的概率值比它大，记为0；对概率为0.6的标签，没有标签的概率值比它大，记为0。则样本1的所有标签的排序损失标签为1个，标签为1的标签有2个，标签为0的标签有3个，则基数对有2*3=6个，样本的排序损失为1/6=0.1666667
数据集总的排序损失为：（0.16667+0.16667）/ 2 = 0.16667 程序：
label = np.array([[1, 0, 1, 0, 0], [1, 0, 1, 0, 1]])
logit = np.array([[0.3, 0.4, 0.5, 0.1, 0.15], [0.4, 0.5, 0.7, 0.2, 0.6]])
print(metrics.label_ranking_loss(label, logit))

结果：
三，OE计算 公式：  这个就是计算每个样本标签集中概率最大的那个标签在不在标签为1的部分里面，在，记为0，不在，则记为1。就是说最大的那个标签预测的对不对。 举个栗子： 样本1，真实标签集y_true = [1, 0, 1, 0, 0]，标签预测概率值y_score = [0.3, 0.4, 0.5, 0.1, 0.15]，概率最大的标签对应的真实标签为1，记为0。 样本2，真实标签集y_true = [1, 0, 1, 0, 1]，标签预测概率值y_score = [0.4, 0.5, 0.7, 0.2, 0.6]，概率最大的标签对应的真实标签为1，记为0。 总的错误率就等于 （0+0）/ 2 = 0
程序：
def One_error(label, logit):
N = len(label)
for i in range(N):
if max(label[i]) == 0:
print("该条数据哪一类都不是")
label_index = []
for i in range(N):
index = np.where(label[i] == 1)[0]
label_index.append(index)
OneError = 0
for i in range(N):
if np.argmax(logit[i]) not in label_index[i]:
OneError += 1
OneError = OneError * 1.0 / N
return OneError

label = np.array([[1, 0, 1, 0, 0], [1, 0, 1, 0, 1]])
logit = np.array([[0.3, 0.4, 0.5, 0.1, 0.15], [0.4, 0.5, 0.7, 0.2, 0.6]])
print(One_error(label, logit))

结果：  四，Cov计算 公式：  这个就是计算每个样本的标签集中，按照概率从大到小排列，到排多少的时候能把标签为1的标签覆盖完毕。为啥要减1，是因为排序是从1开始的。 举个栗子： 样本1，真实标签集y_true = [1, 0, 1, 0, 0]，标签预测概率值y_score = [0.3, 0.4, 0.5, 0.1, 0.15]，标签从大到小排序，0.5-》0.4-》0.3，排到第三个，把标签为1的全部覆盖了，则样本1的覆盖率为（3-1） = 2 样本2，真实标签集y_true = [1, 0, 1, 0, 1]，标签预测概率值y_score = [0.4, 0.5, 0.7, 0.2, 0.6]，标签从大到小排序，0.7-》0.6-》0.5-》0.4，排到第四个，把标签为1的全部覆盖了，则样本1的覆盖率为（4-1） = 3 总的覆盖率为 （2+3）/ 2 = 2.5 程序：
def Coverage(label, logit):
D = len(label[0])
N = len(label)
label_index = []
for i in range(N):
index = np.where(label[i] == 1)[0]
label_index.append(index)
cover = 0
for i in range(N):
# 从大到小排序
index = np.argsort(-logit[i]).tolist()
tmp = 0
for item in label_index[i]:
tmp = max(tmp, index.index(item))
cover += tmp
coverage = cover * 1.0 / N
return coverage
label = np.array([[1, 0, 1, 0, 0], [1, 0, 1, 0, 1]])
logit = np.array([[0.3, 0.4, 0.5, 0.1, 0.15], [0.4, 0.5, 0.7, 0.2, 0.6]])
print(Coverage(label, logit))

结果：  这里注意下，sklearn库里自带了一个方法，
label = np.array([[1, 0, 1, 0, 0], [1, 0, 1, 0, 1]])
logit = np.array([[0.3, 0.4, 0.5, 0.1, 0.15], [0.4, 0.5, 0.7, 0.2, 0.6]])
print(metrics.coverage_error(label, logit))
print(Coverage(label, logit))

这个coverage方法没有在每个样本排序的时候减去1，导致最终结果如下：  本文的程序代码来自多标签评价指标python代码
如有错误，烦请指正。
展开全文
• 多标签分类的评价指标

万次阅读 2018-01-24 19:03:22
多标签分类作为分类的一种推广，每个样本可以有个类别，如下图的标签为：sea，sunset。所以其评价指标分类的也有差异，本文将介绍几种评价指标。  1.Hamming loss(汉明损失)，表示所有label中错误样本...
 多标签分类作为多分类的一种推广，每个样本可以有多个类别，如下图的标签为：sea，sunset。所以其评价指标与多分类的也有差异，本文将介绍几种评价指标。

1.Hamming loss(汉明损失)，表示所有label中错误样本的比例，所以该值越小则网络的分类能力越强。计算公式如下。

其中：|D|表示样本总数，|L|表示标签总数，xi和yi分别表示预测结果和ground truth。xor表示异或运算。
样例：

  from sklearn.metrics import hamming_loss
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
hamming_loss(y_true, y_pred)  #输出结果为0.25

hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))  #输出结果为0.75
2. Jaccard index(杰卡德指数)，概念挺陌生，公式是再熟悉不过了。其中：T表示ground truth，P表示预测结果。再观察这个公式，和检测算法中的IOU多么相近。

3. 精度、召回率和F1值。其中精度计算公式为，召回率计算公式为，F1值的计算为精度和召回率的调和平均数。
4. 准确匹配。这个是最严格的标准了，是预测结果和ground truth完全一致时的样本数与总的样本数的比值。

参考文献：https://en.wikipedia.org/wiki/Multi-label_classification
展开全文
• 多标签分类问题的评价指标

万次阅读 2018-09-09 09:39:04
多标签分类评价指标 标签学习系统中的性能评估与经典的单标签学习问题中不同，在单标签问题中使用的经典度量标准包括准确率，Precision，Recall 和 F-measure.在标签学习中，评估会更加复杂，对于一个测试...
• 分类一般分为三种情况：二分类、分类和多标签分类多标签分类比较直观的理解是，一个样本可以同时拥有几个类别标签，比如一首歌的标签可以是流行、轻快，一部电影的标签可以是动作、喜剧、搞笑，一本书的标签可以...
• 关于多标签分类任务的损失函数和评价指标的一点理解 之前有接触到多标签分类任务，但是主要关注点都放在模型结构中，最近关于多标签分类任务进行了一个讨论，发现其中有些细节不是太清楚，经过查阅资料逐渐理解，...
• 其中，讲到了交叉熵在多标签分类问题中的应用，这是我之前博客没有提到的，所以我在这篇博客中进行总结。 首先需要说说，评价分类模型进行分类处理是好是坏的几个指标 模型在处理分类问题时，分...
• 参考文献：[1]刘文臻. 中文文本多标签分类算法研究[D].电子科技大学,2020.
• 对于多标签分类评价指标比较复杂，一般对于n个二分类混淆矩阵要引入宏平均、微平均、权重评价即Macro-average、Micro-Average，Weighted-Average，近期正好应用，所以就总结一下。 Macro-averaging：指所有类别的...
• 二分类和多分类问题的评价指标总结

万次阅读 多人点赞 2019-07-09 18:51:55
分类评价指标 准确率（Accuracy） 评价分类问题的性能指标一般是分类准确率，即对于给定的数据，分类正确的样本数占总样本数的比例。 注意：准确率这一指标在Unbalanced数据集上的表现很差，因为如果我们的正负...
• 多标签分类

千次阅读 2019-06-29 18:24:55
1、多标签分类 VS 单标签分类 在图像的分类和识别领域，传统的单标签分类旨在解决一个示例只属于一个类别的问题，不同的标签之间完全独立、互相之间没有关联。然而，在更加复杂的分类任务中，如文本分类、图像类别...
• 多分类问题评价指标

千次阅读 2019-09-02 15:26:39
机器学习或者是日常生活中，遇见的往往是二分类问题比较，二分类模型的模型评价准则很，Auc_score,F1_score，accuracy等等都是比较常用的。而针对多分类问题来说，有些二分类评价准则就相对而言不怎么适用了。...
• 小伙伴发愁深度学习多标签分类的评判指标，觉得用每个部位的预测平均准确率实在是不合理，我写了一个比较全面的评判指标的函数供大家参考~ 具体含义可以看sklearn的文档~ def deep_model(feature_dim,label_...
• ROC(Receiver Operating Characteristic) 曲线和AUC(Area Under the Curve) 值常被用来评价一个... 多分类问题评价指标：precision，recall，F-score 在分类任务中，人们总是喜欢基于错误率来衡量分类器任务的成功...
• mAP转载2015-12-17 13:27:15标签：multi-labelprecisionrecallmap多标签图像分类（Multi-label Image Classification）任务中图片的标签不止一个，因此评价不能用普通单标签图像分类标准，即mean accuracy，该...
• 2. 多分类评价指标 3. 总结 1. 二分类评价指标 常用的二分类评价指标包括准确率、精确率、召回率、F1-score、AUC、ROC、P-R曲线、MCC等 混淆矩阵 2分类问题的混淆矩阵是2*2的，通常以关注的类为正类，另一个类为...
• 分类评价指标概念辨析   这些东西其实没什么难的，而且很多人肯定也是很早就接触过了，最大的问题在于时间长了记不住，所以就尽量解释的简单写，用于下次查阅使用。   主要需要理解的就是二分类的指标。   ...
• 多分类评价指标python代码

千次阅读 2019-10-06 21:17:51
计算每个实例的度量标准，并找到它们的平均值（对于不同于此的多标签分类仅有意义  accuracy_score ）。 sklearn.metrics模块实现了一些loss, score以及一些工具函数来计算分类性能。一些metrics可能需要正例、...
• 文本分类一般可以分为二分类、分类、多标签分类三种情况,二分类是指将一组文本分成两个类(0或1),比较常见的应用如垃圾邮件分类、电商网站的用户评价数据的正负面分类等,分类是指将文本分成若干个类中的某一个类,...
•  Classification）任务中图片的标签不止一个，因此评价不能用普通单标签图像分类标准，即mean  accuracy，该任务采用的是和信息检索中类似的方法—mAP（mean  Average  Precision）。mAP虽然字面意思和mean  ...

...