拜托,我实现了一个推荐系统,我想计算它的全局精度@k:
我有这两部分代码,返回命中率和NDCG@k,但是有没有可能对这段代码进行修改,以便也能计算出精度@k?你知道吗
评估单个评级的第一部分:
def eval_one_rating(idx, full_dataset: InteractionsDataset):
rating = _testRatings[idx]
items = _testNegatives[idx]
u = rating[0]
gtItem = rating[1]
items.append(gtItem)
# Get prediction scores
map_item_score = {}
users = np.full(len(items), u, dtype='int32')
feed_dict = {
'personId': users,
'contentId': np.array(items),
}
predictions = _model.predict(feed_dict)
for i in range(len(items)):
item = items[i]
map_item_score[item] = predictions[i]
# Evaluate top rank list
ranklist = heapq.nlargest(_topk, map_item_score, key=map_item_score.get)
hr = getHitRatio(ranklist, gtItem)
ndcg = getNDCG(ranklist, gtItem)
return (hr, ndcg)
def getHitRatio(ranklist, gtItem):
for item in ranklist:
if item == gtItem:
return 1
return 0
def getNDCG(ranklist, gtItem):
for i in range(len(ranklist)):
item = ranklist[i]
if item == gtItem:
return math.log(2) / math.log(i+2)
return 0
第二个评估模型:
def evaluate_model(model, full_dataset: InteractionsDataset, topK: int):
"""
Evaluate the performance (Hit_Ratio, NDCG) of top-K recommendation
Return: score of each test rating.
"""
global _model
global _testRatings
global _testNegatives
global _topk
_model = model
_testRatings = full_dataset.testRatings
_testNegatives = full_dataset.testNegatives
_topk = topK
hits, ndcgs = [], []
for idx in range(len(_testRatings)):
(hr, ndcg) = eval_one_rating(idx, full_dataset)
hits.append(hr)
ndcgs.append(ndcg)
return (hits, ndcgs)
谢谢你
目前没有回答
相关问题 更多 >
编程相关推荐