-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevaluation_function.py
95 lines (53 loc) · 2.47 KB
/
evaluation_function.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on 21/10/2018
@author: Maurizio Ferrari Dacrema
"""
import numpy as np
import scipy.sparse as sps
def precision(is_relevant, relevant_items):
#is_relevant = np.in1d(recommended_items, relevant_items, assume_unique=True)
precision_score = np.sum(is_relevant, dtype=np.float32) / len(is_relevant)
return precision_score
def recall(is_relevant, relevant_items):
#is_relevant = np.in1d(recommended_items, relevant_items, assume_unique=True)
recall_score = np.sum(is_relevant, dtype=np.float32) / relevant_items.shape[0]
return recall_score
def MAP(is_relevant, relevant_items):
#is_relevant = np.in1d(recommended_items, relevant_items, assume_unique=True)
# Cumulative sum: precision at 1, at 2, at 3 ...
p_at_k = is_relevant * np.cumsum(is_relevant, dtype=np.float32) / (1 + np.arange(is_relevant.shape[0]))
map_score = np.sum(p_at_k) / np.min([relevant_items.shape[0], is_relevant.shape[0]])
return map_score
def evaluate_algorithm(URM_test, recommender_object, at=5):
cumulative_precision = 0.0
cumulative_recall = 0.0
cumulative_MAP = 0.0
num_eval = 0
URM_test = sps.csr_matrix(URM_test)
n_users = URM_test.shape[0]
for user_id in range(n_users):
if user_id % 10000 == 0:
print("Evaluated user {} of {}".format(user_id, n_users))
start_pos = URM_test.indptr[user_id]
end_pos = URM_test.indptr[user_id+1]
if end_pos-start_pos>0:
relevant_items = URM_test.indices[start_pos:end_pos]
recommended_items = recommender_object.recommend(user_id, cutoff=at)
num_eval+=1
is_relevant = np.in1d(recommended_items, relevant_items, assume_unique=True)
cumulative_precision += precision(is_relevant, relevant_items)
cumulative_recall += recall(is_relevant, relevant_items)
cumulative_MAP += MAP(is_relevant, relevant_items)
cumulative_precision /= num_eval
cumulative_recall /= num_eval
cumulative_MAP /= num_eval
print("Recommender performance is: Precision = {:.4f}, Recall = {:.4f}, MAP = {:.4f}".format(
cumulative_precision, cumulative_recall, cumulative_MAP))
result_dict = {
"precision": cumulative_precision,
"recall": cumulative_recall,
"MAP": cumulative_MAP,
}
return result_dict