📜  多标签排名指标-标签排名平均精度 |机器学习

📅  最后修改于: 2022-05-13 01:55:03.602000             🧑  作者: Mango

多标签排名指标-标签排名平均精度 |机器学习

标签排名平均精度 (LRAP) 测量预测模型的平均精度,但使用的是精确召回。它测量每个样本的标签排名。它的值总是大于0 。该指标的最佳值为1 。该指标与平均精度有关,但使用标签排名而不是精度和召回率
LRAP 基本上会问一个问题,即对于每个给定的样本,哪些百分比较高的标签是真正的标签。
给定一个真实标签的二进制指示矩阵

y\epsilon \left \{ 0, 1 \right \}^{n_{samples} * n_{labels}} .

与每个标签相关的分数表示为\hat{f}在哪里,

 \hat{f}\epsilon \left \{ \mathbb{R} \right \}^{n_{samples} * n_{labels}}

然后我们可以使用以下公式计算LRAP:

 LRAP(y, \hat{f}) = \dfrac{1}{n_{samples}}*\sum_{i=0}^{n_{samples}-1}\dfrac{1}{\left \| y_i \right \|_{0}} \sum _{j:y_{ij}=1} \dfrac{\left |L_{ij} \right |}{rank_{ij}}

在哪里,

 L_{ij} = \left \{ k\colon y_{ik} =1, \hat{f_{ik}}\geq\hat{f_{ij}} \right \}



 rank_{ij} = \left | \left \{  k \colon \hat{f_{ik}}\geq\hat{f_{ij}} \right \}\right |

代码:实现 LRAP 的Python代码
# import numpy and scikit-learn libraries
import numpy as np
from sklearn.metrics import label_ranking_average_precision_score
   
# take sample datasets
y_true = np.array([[1, 0, 0], 
                   [1, 0, 1], 
                   [1, 1, 0]])
y_score = np.array([[0.75, 0.5, 1], 
                    [1, 0.2, 0.1],
                    [0.9, 0.7, 0.6]])
   
# print the output
print(label_ranking_average_precision_score(
    y_true, y_score))

输出 :

0.777

为了理解上面的例子,让我们以人类(由[1, 0, 0]表示),猫(由[0, 1, 0]表示),狗(由[0, 0, 1]表示)三个类别。我们提供了三个样本,例如[1, 0, 0], [1, 0, 1], [1, 1, 0] 。这意味着我们总共有5 个真实标签(3 个人类,1 个猫和 1 个狗)。例如,在第一个样本中,只有真正的标签人在预测标签中排名第二。所以,rank = 2。接下来我们需要找出沿途有多少正确的标签。只有一个正确的标签是人类,因此分子值为 1。因此分数变为 1/2 = 0.5。
因此,第 1 个样本的 LRAP 值为:


 LRAP_{1st}=\dfrac{\left ( 0.5 \right )}{1} = 0.5

在第二个样本中,排名第一的是人类,其次是猫和狗。人类的分数是 1/1 = 1,狗是 2/3 = 0.66(沿途真实标签排名的数量/预测标签中狗类别的排名)。
第二个样本的 LRAP 值为:

 LRAP_{2nd}=\dfrac{\left ( 1+0.66 \ right )}{2} = 0.83

同样,对于第三个样本,人类类的分数值是 1/1 = 1,猫类是 2/2 = 1。第三个样本的 LRAP 值为:


 LRAP_{3rd}=\dfrac{\left ( 2 \right )}{2} = 1

因此,总 LRAP 是每个样本上的 LRAP 之和除以样本数。

 LRAP =  \sum_{i=0}^{n_{samples}-1}\left ( 1 + 0.83 + 0.5 \right ) \\ LRAP =  \dfrac{1}{3}\left ( 2.33 \right ) \\          \\ LRAP =   .77