纸上得来终觉浅,绝知此事要躬行 -- 宋.陆游《冬夜读书示子聿》
对于评分预测常用的准确性评测指标是均方根误差RMSE和平均绝对误差MAE。
RMSE: 均方根误差(对大的偏差更敏感)
MAE: 平均绝对值误差
注意:|R|表示数据集合的长度
准确性指标计算函数:
from math import sqrt
def rmse(data):
length = 0
_rmse_sum = 0
for uid, iid, real_rating, pred_rating in data:
length += 1
_rmse_sum += (pred_rating - real_rating) ** 2
return round(sqrt(_rmse_sum / length), 4)
def mae(data):
length = 0
_mae_sum = 0
for uid, iid, real_rating, pred_rating in data:
length += 1
_mae_sum += abs(pred_rating - real_rating)
return round(_mae_sum / length, 4)
def maeAndRmse(data):
length = 0
_rmse_sum = 0
_mae_sum = 0
for uid, iid, real_rating, pred_rating in data:
length += 1
_rmse_sum += (pred_rating - real_rating) ** 2
_mae_sum += abs(pred_rating - real_rating)
return round(_mae_sum / length, 4), round(sqrt(_rmse_sum / length), 4)
接下来我们就利用这两个指标来评估我们前面实现User-Based CF和Item-Based CF算法
为了防止过拟合,我们可以将数据集拆分为训练集和测试集来试验:
数据集拆分
data_split函数将ratings.csv数据集按比例拆分为训练集和数据集,这里的拆分逻辑主要考虑的是控制用户数量不变,从每位用户的评分数据中按比例抽取,
这样能保证训练集和测试集用户是一致的,但是物品不一致,也就是说测试集中存在部分物品,训练集中不存在,而协同过滤一个最大的特点就是对于训练集中不存在的物品是不可能作出预测的。