Source code for catalyst.metrics.functional._hitrate
from typing import List
import torch
from catalyst.metrics.functional._misc import process_recsys_components
def _nan_to_num(tensor, nan=0.0):
tensor = torch.where(torch.isnan(tensor), torch.ones_like(tensor) * nan, tensor)
return tensor
# nan_to_num is available in PyTorch only from 1.8.0 version
NAN_TO_NUM_FN = torch.__dict__.get("nan_to_num", _nan_to_num)
[docs]def hitrate(
outputs: torch.Tensor, targets: torch.Tensor, topk: List[int], zero_division: int = 0
) -> List[torch.Tensor]:
"""
Calculate the hit rate (aka recall) score given
model outputs and targets.
Hit-rate is a metric for evaluating ranking systems.
Generate top-N recommendations and if one of the recommendation is
actually what user has rated, you consider that a hit.
By rate we mean any explicit form of user's interactions.
Add up all of the hits for all users and then divide by number of users
Compute top-N recommendation for each user in the training stage
and intentionally remove one of this items from the training data.
Args:
outputs (torch.Tensor):
Tensor with predicted score
size: [batch_size, slate_length]
model outputs, logits
targets (torch.Tensor):
Binary tensor with ground truth.
1 means the item is relevant
for the user and 0 not relevant
size: [batch_size, slate_length]
ground truth, labels
topk (List[int]):
Parameter fro evaluation on top-k items
zero_division (int):
value, returns in the case of the divison by zero
should be one of 0 or 1
Returns:
hitrate_at_k (List[torch.Tensor]): the hitrate score
Example:
.. code-block:: python
import torch
from catalyst import metrics
metrics.hitrate(
outputs=torch.Tensor([[4.0, 2.0, 3.0, 1.0], [1.0, 2.0, 3.0, 4.0]]),
targets=torch.Tensor([[0, 0, 1.0, 1.0], [0, 0, 0.0, 0.0]]),
topk=[1, 2, 3, 4],
)
# [tensor(0.), tensor(0.2500), tensor(0.2500), tensor(0.5000)]
"""
results = []
targets_sort_by_outputs = process_recsys_components(outputs, targets)
for k in topk:
k = min(outputs.size(1), k)
hits_score = torch.sum(targets_sort_by_outputs[:, :k], dim=1) / targets.sum(
dim=1
)
hits_score = NAN_TO_NUM_FN(hits_score, zero_division)
results.append(torch.mean(hits_score))
return results
__all__ = ["hitrate"]