这段代码实现了一个评估推荐算法的函数'printF1Score',输入参数为一个推荐列表'recommend',其中每个元素为一个(uid, bid)的二元组,表示用户uid被推荐购买了商品bid。该函数读取实际的购买情况(从文件'./data/result.txt'中读取),并将预测结果格式调整为字典'R',其中每个元素为一个(uid, [bid1, bid2, ...])的二元组,表示用户uid被推荐购买了商品列表[bid1, bid2, ...]。然后该函数计算推荐数量以及命中数量,并输出精确度、召回率和F1得分。其中,精确度定义为命中数除以预测总数,召回率定义为命中数除以实际购买的商品数,F1得分定义为精确度与召回率的调和平均数。如果实际购买的商品数为0或命中数为0,则F1得分为0。

def printF1Score(recommend):

	predict_num = 0
	hit_num = 0
	brand = 0

	# 读取实际的购买情况
	f = open("./data/result.txt", "r")
	result = {}
	lines = f.readlines()
	for index, item in enumerate(lines):
		uid, bid = item.strip("\n").split("\t")
		result[uid] = set(bid.split(","))
		brand += len(result[uid])
	f.close()

	# 调整预测结果格式
	R = {}
	for uid, bid in recommend:
		R.setdefault(uid, [])
		if bid not in R[uid]:
			R[uid].append(bid)

	# 计算推荐数量以及命中数量
	for uid, bid_list in R.items():
		predict_num += len(bid_list)

		if uid in result:
			for bid in bid_list:
				if bid in result[uid]:
					hit_num += 1

	# 输出结果
	print u"执行时间:	 %s" % datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
	print u"预测总数:	 %d" % predict_num
	print u"命中数量:	 %d" % hit_num

	if brand == 0 or hit_num == 0:
	 	print u"F1得分:	 0"
	else:
		precision = float(hit_num)/predict_num
		recall = float(hit_num)/brand
		print u"精确度:	 %.2f%%" % round(100*precision, 2)
		print u"召回率:	 %.2f%%" % round(100*recall, 2)

		print u"F1得分:	 %.2f%%" % round(100*2*precision*recall/(precision+recall), 2) 

该代码首先读取实际购买数据,并存储在字典'result'中。然后,代码将预测结果格式调整为字典'R',方便后续计算。最后,代码计算了推荐数量、命中数量、精确度、召回率和F1得分,并输出结果。

Python代码实现推荐算法评估:F1得分计算

原文地址: https://www.cveoy.top/t/topic/oY1W 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录