Understanding evaluation metrics and pricing factors
import numpy as np
import pandas as pd
import math
def hit_rate_at_k(recommended_list, bought_list, k=5):
bought_list = np.array(bought_list)
recommended_list = np.array(recommended_list)[:k]
flags = np.isin(bought_list, recommended_list)
return (flags.sum() > 0) * 1
recommended_list = [156, 1134, 27, 1543, 3345, 143, 32, 533, 11, 43] #items ids
bought_list = [521, 32, 143, 991]
hit_rate_at_k(recommended_list, bought_list, 5)
0
hit_rate_at_k(recommended_list, bought_list, 10)
1
def precision_at_k(recommended_list, bought_list, k=5):
bought_list = np.array(bought_list)
recommended_list = np.array(recommended_list)[:k]
flags = np.isin(bought_list, recommended_list)
return flags.sum() / len(recommended_list)
def money_precision_at_k(recommended_list, bought_list, prices_recommended, k=5):
recommend_list = np.array(recommended_list)[:k]
prices_recommended = np.array(prices_recommended)[:k]
flags = np.isin(recommend_list, bought_list)
precision = np.dot(flags, prices_recommended) / prices_recommended.sum()
return precision
recommended_list = [156, 1134, 27, 1543, 3345, 143, 32, 533, 11, 43] #items ids
bought_list = [521, 32, 143, 991]
prices_recommendede_list = [400, 60, 40, 90, 60, 340, 70, 190,110, 240]
precision_at_k(recommended_list, bought_list, 5)
0.0
precision_at_k(recommended_list, bought_list, 10)
0.2
money_precision_at_k(recommended_list, bought_list, prices_recommendede_list, 5)
0.0
money_precision_at_k(recommended_list, bought_list, prices_recommendede_list, 10)
0.25625
recommended_list=[143,156,1134,991,27,1543,3345,533,11,43] #itemsid
prices_recommended_list=[400,60,40,90,60,340,70,190,110,240]
bought_list=[521,32,143,991]
prices_bought=[150,30,400,90]
def recall_at_k(recommended_list, bought_list, k=5):
bought_list = np.array(bought_list)
recommended_list = np.array(recommended_list)[:k]
flags = np.isin(bought_list, recommended_list)
return flags.sum() / len(bought_list)
def money_recall_at_k(recommended_list, bought_list, prices_recommended, prices_bought, k=5):
bought_list = np.array(bought_list)
prices_bought = np.array(prices_bought)
recommended_list = np.array(recommended_list)[:k]
prices_recommended = np.array(prices_recommended)[:k]
flags = np.isin(recommended_list, bought_list)
return np.dot(flags, prices_recommended)/prices_bought.sum()
recall_at_k(recommended_list, bought_list, 5)
0.5
recall_at_k(recommended_list, bought_list, 10)
0.5
money_recall_at_k(recommended_list, bought_list, prices_recommendede_list, 5)
98.0
money_recall_at_k(recommended_list, bought_list, prices_recommendede_list, 10)
49.0
def ap_k(recommended_list, bought_list, k=5):
bought_list = np.array(bought_list)
recommended_list = np.array(recommended_list)[:k]
relevant_indexes = np.nonzero(np.isin(recommended_list, bought_list))[0]
if len(relevant_indexes) == 0:
return 0
amount_relevant = len(relevant_indexes)
sum_ = sum([precision_at_k(recommended_list, bought_list, k=index_relevant+1) for index_relevant in relevant_indexes])
return sum_/amount_relevant
def map_k(recommended_list, bought_list, k=5):
amount_user = len(bought_list)
list_ap_k = [ap_k(recommended_list[i], bought_list[i], k) for i in np.arange(amount_user)]
sum_ap_k = sum(list_ap_k)
return sum_ap_k/amount_user
#list of 3 users
recommended_list_3_users = [[143,156,1134,991,27,1543,3345,533,11,43],
[1134,533,14,4,15,1543,1,99,27,3345],
[991,3345,27,533,43,143,1543,156,1134,11]]
bought_list_3_users= [[521,32,143], #user1
[143,156,991,43,11], #user2
[1,2]] #user3
map_k(recommended_list_3_users, bought_list_3_users, 5)
0.3333333333333333
def reciprocal_rank(recommended_list, bought_list, k=1):
recommended_list = np.array(recommended_list)
bought_list = np.array(bought_list)
amount_user = len(bought_list)
rr = []
for i in np.arange(amount_user):
relevant_indexes = np.nonzero(np.isin(recommended_list[i][:k], bought_list[i]))[0]
if len(relevant_indexes) != 0:
rr.append(1/(relevant_indexes[0]+1))
if len(rr) == 0:
return 0
return sum(rr)/amount_user
reciprocal_rank(recommended_list_3_users, bought_list_3_users, 5)
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:3: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray This is separate from the ipykernel package so we can avoid doing imports until
0.3333333333333333
def ndcg_at_k(recommended_list, bought_list, k=5):
rec = recommended_list
b = bought_list
recommended_list = np.array(recommended_list)[:k]
bought_list = np.array(bought_list)
flags = np.isin(recommended_list, bought_list)
rank_list = []
for i in np.arange(len(recommended_list)):
if i < 2:
rank_list.append(i+1)
else:
rank_list.append(math.log2(i+1))
if len(recommended_list) == 0:
return 0
dcg = sum(np.divide(flags, rank_list)) / len(recommended_list)
i_dcg = sum(np.divide(1, rank_list)) / len(recommended_list)
# print(i_dcg)
return dcg/i_dcg
recommended_list = [143,156,1134,991,27,1543,3345,533,11,43] #iditems
prices_recommended_list = [400,60,40,90,60,340,70,190,110,240]
bought_list = [521,32,143,991]
prices_bought = [150,30,400,90]
ndcg_at_k(recommended_list, bought_list, 5)
0.489938890671454