Средняя точность @ K Средняя отзыв @ K
У меня есть два набора с пользовательскими сессиями. Каждый набор состоит из двух столбцов:
- идентификатор просмотренных товаров в интернет-магазине
- идентификатор купленных товаров в интернет-магазине
Один комплект должен быть использован для поезда (рейтинг верхних веток), второй комплект должен использоваться для испытания.
все идентификаторы купленных предметов разные.
Мне нужно сделать:
1. На тестовом наборе подсчитайте частоты просмотренных и купленных идентификаторов (один идентификатор может встречаться несколько раз в элементах viwed)
2. Реализуйте два алгоритма рекомендаций:
- сортировать просмотренные идентификаторы по популярности (частота встречаемости просматриваемых товаров)
- сортировать просмотренные идентификаторы путем покупки (частота встречается в купленных товарах)
3. Используя эти алгоритмы, мне нужно вычислить AverageRecall@1, AveragePrecision@1, AverageRecall@5, AveragePrecision@5
Важно:
- сеансы, в которых пользователь ничего не покупал, правило оценки качества.
- Если предмет не найден в тренировочном наборе, его популярность равна 0.
- Нужно рекомендовать разные предметы. И его номер должен быть не больше, чем количество различных просмотренных пользователем элементов.
- Рекомендации никогда не превышают как минимум двух чисел: количества просмотренных элементов и k в отзыве @ k / precision @ k.
Первое задание (рассчитать частоты) я делаю с помощью OrderedDict. Для второго задания я использую функцию:
def apk(viwed, bought, k=1):
if len(predicted)>k:
predicted = predicted[:k]
score = 0.0
num_hits = 0.0
for i,p in enumerate(bought):
if p in actual and p not in bought[:i]:
num_hits += 1.0
score += num_hits / (i+1.0)
if not viewed:
return 0.0
return score / min(len(viewed), k)
def mapk(actual, predicted, k=10):
return np.mean([apk(a,p,k) for a,p in zip(actual, predicted)])
Но я не знаю, как рассчитать третье задание (средний отзыв и т. Д. Для каждого k) и что делать с OrderedDict.