推荐引擎指标
recommendation engine metrics
我一直致力于通过基于隐式反馈的推荐来实现推荐系统。因此,我使用元组 (user,item, count) 来创建我的用户项目矩阵。
我确实使用 Insight 数据科学博客上这个非常好的示例实现了我的推荐系统:http://insightdatascience.com/blog/explicit_matrix_factorization.html
然而,与电影镜头数据集相比,我的数据集非常稀疏。在这个例子中,6.3% 的数据集被填满了,而这个数字对我来说是 0.30%。所以,我的数据集中有很多未知值。我有大约 2900 个用户和 5000 个项目。
我一直在训练我的模型,训练的MSE不肯下来。我试过优化参数,但无济于事。我有以下问题:
(1) MSE 不是一个可靠的指标吗?我经历过这个讨论:https://www.quora.com/How-do-you-measure-and-evaluate-the-quality-of-recommendation-engines
但是,A/B 测试对我来说不是一个选择。我在机器学习模型方面的经验一直告诉我,如果训练 MSE 卡在一个点上,那将是一件非常糟糕的事情(出于一大堆原因)
那么,我是不是评价不当?
(2) 冷启动问题?我正在像这样初始化我的用户向量和项目向量:
self.user_vectors = np.random.normal(size=(self.num_users,self.num_factors))
self.item_vectors = np.random.normal(size=(self.num_items,self.num_factors))
这里有什么我可以改变的吗?
我对下一步该做什么感到困惑。矩阵的稀疏性非常高,我知道我的算法正在预测大量零的值。我直觉上觉得这让我的 MSE 保持不变。
任何想法或方向将不胜感激!
谢谢
(1) MovieLens 数据集是一个学术数据集,他们对如何生成数据集有明确的选择,这使得它与现实生活中的推荐系统数据集截然不同。在数据集的 README 上,作者指定:
Each user has rated at least 20 movies.
所以他们的低RMSE只适用于有这个特点的用户。
我建议两个指标:
- 将您的数据分成训练集和测试集,并将您的预测与测试集进行比较,看看您是否预测了测试集中的(用户,电影)对;
- 将您的数据与基线进行比较,例如用户平均值和电影平均值。
(2) 我觉得你对冷启动问题有点疑惑:
这是一个影响没有关于用户或电影数据的推荐系统 (RS) 的问题。例如,如果没有人看过一部电影,您就无法对谁会喜欢这部电影做出可靠的预测。对于用户来说也是一样,对于没有看过电影的人来说,你无法预测他们会喜欢什么电影。
解决该问题的一种方法是根据用户的特征(性别、年龄、用户所在的国家/地区以及电影的流派、日期和语言)在电影之间和用户之间创建相似性度量。有了这个,您可以根据最相似的用户和电影进行推荐。这些类型的 RS 据说是混合型的。
推荐论文:
Collaborative Filtering for Implicit Feedback Datasets,它涵盖了隐式反馈和冷启动问题。
Hybrid Recommender Systems: Survey and Experiments - 关于混合 RS。
我一直致力于通过基于隐式反馈的推荐来实现推荐系统。因此,我使用元组 (user,item, count) 来创建我的用户项目矩阵。
我确实使用 Insight 数据科学博客上这个非常好的示例实现了我的推荐系统:http://insightdatascience.com/blog/explicit_matrix_factorization.html
然而,与电影镜头数据集相比,我的数据集非常稀疏。在这个例子中,6.3% 的数据集被填满了,而这个数字对我来说是 0.30%。所以,我的数据集中有很多未知值。我有大约 2900 个用户和 5000 个项目。
我一直在训练我的模型,训练的MSE不肯下来。我试过优化参数,但无济于事。我有以下问题:
(1) MSE 不是一个可靠的指标吗?我经历过这个讨论:https://www.quora.com/How-do-you-measure-and-evaluate-the-quality-of-recommendation-engines
但是,A/B 测试对我来说不是一个选择。我在机器学习模型方面的经验一直告诉我,如果训练 MSE 卡在一个点上,那将是一件非常糟糕的事情(出于一大堆原因)
那么,我是不是评价不当?
(2) 冷启动问题?我正在像这样初始化我的用户向量和项目向量:
self.user_vectors = np.random.normal(size=(self.num_users,self.num_factors))
self.item_vectors = np.random.normal(size=(self.num_items,self.num_factors))
这里有什么我可以改变的吗?
我对下一步该做什么感到困惑。矩阵的稀疏性非常高,我知道我的算法正在预测大量零的值。我直觉上觉得这让我的 MSE 保持不变。
任何想法或方向将不胜感激!
谢谢
(1) MovieLens 数据集是一个学术数据集,他们对如何生成数据集有明确的选择,这使得它与现实生活中的推荐系统数据集截然不同。在数据集的 README 上,作者指定:
Each user has rated at least 20 movies.
所以他们的低RMSE只适用于有这个特点的用户。
我建议两个指标:
- 将您的数据分成训练集和测试集,并将您的预测与测试集进行比较,看看您是否预测了测试集中的(用户,电影)对;
- 将您的数据与基线进行比较,例如用户平均值和电影平均值。
(2) 我觉得你对冷启动问题有点疑惑: 这是一个影响没有关于用户或电影数据的推荐系统 (RS) 的问题。例如,如果没有人看过一部电影,您就无法对谁会喜欢这部电影做出可靠的预测。对于用户来说也是一样,对于没有看过电影的人来说,你无法预测他们会喜欢什么电影。
解决该问题的一种方法是根据用户的特征(性别、年龄、用户所在的国家/地区以及电影的流派、日期和语言)在电影之间和用户之间创建相似性度量。有了这个,您可以根据最相似的用户和电影进行推荐。这些类型的 RS 据说是混合型的。
推荐论文:
Collaborative Filtering for Implicit Feedback Datasets,它涵盖了隐式反馈和冷启动问题。
Hybrid Recommender Systems: Survey and Experiments - 关于混合 RS。