【问题标题】:Calculating multilabel recall for this problem计算此问题的多标签召回率
【发布时间】:2022-12-10 04:20:31
【问题描述】:

我有一个包含两列的表,一行中的两个条目表明它们是相关的:

Col1 Col2
a A
b B
a C
c A
b D

这里a与A, C相关,b与B, D相关,c与A相关,这意味着col1中的相同条目可能在col2中有多个标签相关。我训练了一个Machine Learning模型,通过创建Col1和Col2的向量嵌入并优化两个向量之间的cosine_similarity来量化Col1和Col2之间的关系。现在,我想通过在测试集上计算 Recall 来测试我的模型。我想检查是否在各种 recall@N 中,可以检索这些积极关系的比例。假设我已经对每一列中的所有条目进行了归一化向量表示,那么我可以将它们之间的余弦距离计算为:

cosine_distance = torch.mm(col1_feature, col2_feature.t())

它给出了col1 和col2 之间可以形成的所有对之间的距离矩阵。

dist(a,A) dist(a,B) dist(a,C) dist(a,A) dist(a, D)
dist(b,A) dist(b,B) dist(b,C) dist(b,A) dist(b, D)
dist(a,A) dist(a,B) dist(a,C) dist(a,A) dist(a, D)
dist(c,A) dist(c,B) dist(c,C) dist(c,A) dist(c, D)
dist(b,A) dist(b,B) dist(b,C) dist(b,A) dist(b, D)

然后我可以计算出哪些对具有最大距离来计算recall@k。我的问题是我怎样才能使这对数百万行有效。我在 pytorch 中找到了这个模块:torchmetrics.classification.MultilabelRecall(https://torchmetrics.readthedocs.io/en/stable/classification/recall.html),这似乎很有用,但为此我需要指定标签的数量。就我而言,我可以为col1 的每个唯一条目设置可变数量的标签。有任何想法吗?

【问题讨论】:

  • 在使用 MultiLabelRecall 之前,您不能计算唯一标签(使用 pandas 或任何数据框库很容易)吗?

标签: python machine-learning pytorch precision-recall


【解决方案1】:

正如 GuiGav 含糊地建议的那样:在使用 MultiLabelRecall 之前计算唯一标签。

您可以使用pandas 来这样做。首先,让我们用问题中指定的两列定义一个 pandas df:df = pd.DataFrame({"Col1": ["a", "b", "a", "c", "b"], "Col2": ["A", "B", "C", "A", "D"]})。

现在我们通过使用nunique() 清楚地计算第二列中唯一标签的数量:

n_labels = df["Col2"].nunique()

在使用 MultilabelRecall 之前,我们只需为第一列中的每个条目创建一个预测标签和真实标签的张量:

groups = df.groupby("Col1")["Col2"].apply(list)

predicted = torch.tensor(groups.values)

true = torch.tensor([[y for y in df["Col2"] if x == df["Col1"].iloc[y]] for x in df["Col1"].unique()])

完成的!现在您可以简单地计算出您需要的相应k值的recall@k:

recall = MultilabelRecall(num_labels = n_labels)
print(recall.compute(predicted, true, k = 1))

请注意,使用 pandas 创建预测/真实张量可能不是最有效的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 2023-03-08
    • 2012-11-26
    • 2016-09-21
    • 2016-04-09
    • 2014-11-20
    • 2020-10-02
    • 2011-07-12
    相关资源
    最近更新 更多