Recall

Что такое Recall?

Recall@k — это метрика, которая показывает, какая часть всех релевантных элементов была рекомендована пользователю в первых N рекомендованных элементах. Проще говоря, она измеряет СКОЛЬКО РЕЛЕВАТНЫХ ТОВАРОВ из ТОП-N выдачи купил пользователь из ВСЕХ ВОЗМОЖНЫХ РЕЛЕВАТНЫХ ТОВАРОВ.


Пример

У нас есть 10 товаров, которые мы показали пользователю. Тогда что бы посчитать полноту — recall@10 мы просто возьмем все релеватные товары в выдаче, а их у нас 5 (под индексами 1, 3, 4, 6, 8) и поделим на все релевантные товары, а их у нас 8 (под индексами 1, 3, 4, 6, 8, 11, 13, 14). recall@10 = 5/8 = 0.625

Грубо говоря это единички таргета в выдаче, по сравнению ко всем единичкам в таргетах.

Давайте теперь посмотрим в топ 5 рекомендаций. В этом коротком листе мы имеем только 3 релевантных элемента которые мы предложили. Тогда Recall@5 будет 37.5% (3 из 8). Это означает что система уловила менее половины элементов в топ-5 рекомендациях.


Реализация на Python

def recall(recommendation, targets):
    """Computes the recall at k for a single user."""
    if not isinstance(recommendation, (list, np.ndarray)):
        raise TypeError(f'recommendation must be a list or numpy.array, not {type(recommendation)}')
    if not isinstance(targets, (list, np.ndarray)):
        raise TypeError(f'targets must be a list or numpy.array, not {type(targets)}')

    if len(targets) == 0:
        return 0.0

    flags = np.isin(recommendation, targets)
    recall = float(np.sum(flags)) / len(targets)
    return recall

def recall_at_k(dataframe, k=5, user_col='user', item_col='item', score_col='score', target_col='target'):
    """Computes the recall at k for each user and returns the average."""
    grouped = dataframe.groupby(user_col)
    
    recalls = grouped.apply(lambda user_data: recall(
        user_data.sort_values(score_col, ascending=False)[item_col].values[:k],
        user_data[user_data[target_col] == 1][item_col].values
    ))
    
    return recalls.mean()

Дополнительные ссылки

https://www.evidentlyai.com/ranking-metrics/precision-recall-at-k