Could anybody help me out by translating this recall@top-k formula to a “regular” recall?
It concerns a classification task which ranges from 3087 to 1027 classes.
Current code for recall@10,20,30
def recallTop(y_true, y_pred, rank=[10, 20, 30]):
outer = []
for x in range(len(y_pred)):
pred_value = y_pred[x]
true_value = y_true[x]
pred_value = torch.round(pred_value).clone().detach()
TP = torch.sum(torch.logical_and(true_value == 1, pred_value)) # True positives (predictions)
inner = []
for i in rank:
TP_k = torch.sum(torch.logical_and(pred_value[:, :i] == 1, true_value[:, :i])) # True positives @top 10, 20, 30
inner.append(TP_k)
avg = torch.div(torch.tensor(inner), TP)
avg[torch.isnan(avg)] = 0
outer.append(avg.tolist())
return (np.array(outer)).mean(axis=0)
Current code in training loop
train_recall.append(recallTop(y, output))
Current code in every epochs
avg_train_recall = (np.array(train_recall)).mean(axis=0)
print("Epoch: {}/{}...".format(e + 1, epochs),
"Train Recall@10, Recall@20, Recall@30", avg_train_recall)