Finish P2Q3-4
This commit is contained in:
@@ -154,6 +154,22 @@ class SimilarUserPredictor(ReviewScorePredictor):
|
|||||||
- user in self.graph._vertices
|
- user in self.graph._vertices
|
||||||
- book in self.graph._vertices
|
- book in self.graph._vertices
|
||||||
"""
|
"""
|
||||||
|
if self.graph.adjacent(user, book): # if the user already made a review, use that score
|
||||||
|
return self.graph.get_weight(user, book)
|
||||||
|
users = self.graph.get_neighbours(book)
|
||||||
|
total_weighted = 0
|
||||||
|
total = 0
|
||||||
|
all_zero = True
|
||||||
|
for u in users:
|
||||||
|
weight = self.graph.get_similarity_score(u, book, 'strict')
|
||||||
|
score = self.graph.get_weight(u, book)
|
||||||
|
if weight > 0:
|
||||||
|
all_zero = False
|
||||||
|
total_weighted += score * weight
|
||||||
|
total += score
|
||||||
|
if all_zero:
|
||||||
|
return round(total / len(users))
|
||||||
|
return round(total_weighted / len(users))
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
@@ -184,11 +200,26 @@ def evaluate_predictor(predictor: ReviewScorePredictor,
|
|||||||
- all users and books in test_file are in predictor.graph
|
- all users and books in test_file are in predictor.graph
|
||||||
format described on the assignment handout
|
format described on the assignment handout
|
||||||
"""
|
"""
|
||||||
|
num_reviews = 0
|
||||||
|
num_correct = 0
|
||||||
|
total_error = 0
|
||||||
|
mp: dict[str, str] # maps book ID to book name
|
||||||
|
with open(book_names_file, 'r', newline='', encoding='UTF-8') as f:
|
||||||
|
reader = csv.reader(f)
|
||||||
|
mp = dict(reader)
|
||||||
|
with open(test_file, 'r', newline='', encoding='UTF-8') as f:
|
||||||
|
reader = csv.reader(f)
|
||||||
|
for book, user, score in reader:
|
||||||
|
book = mp[book]
|
||||||
|
num_reviews += 1
|
||||||
|
actual = predictor.predict_review_score(user, book)
|
||||||
|
if actual == score:
|
||||||
|
num_correct += 1
|
||||||
|
total_error += abs(score - actual)
|
||||||
return {
|
return {
|
||||||
'num_reviews': ...,
|
'num_reviews': num_reviews,
|
||||||
'num_correct': ...,
|
'num_correct': num_correct,
|
||||||
'average_error': ...,
|
'average_error': total_error / num_reviews,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -207,4 +238,4 @@ if __name__ == '__main__':
|
|||||||
'extra-imports': ['csv', 'a3_part2_recommendations'],
|
'extra-imports': ['csv', 'a3_part2_recommendations'],
|
||||||
'allowed-io': ['evaluate_predictor'],
|
'allowed-io': ['evaluate_predictor'],
|
||||||
'max-nested-blocks': 4
|
'max-nested-blocks': 4
|
||||||
})
|
}, output='pyta_report.html')
|
||||||
|
|||||||
Reference in New Issue
Block a user