我正在研究基于隐式反馈的推荐引擎 . 我正在使用此链接:http://insightdatascience.com/blog/explicit_matrix_factorization.html#movielens
这使用ALS(交替最小二乘)来计算用户和项目向量 . 因为,我的数据集不能按时间划分 . 我随机从用户那里获取'x'个评级并将它们放入测试集中 . 这是我的训练用户项矩阵的可重现示例 .
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col1 col12 col13
+---------------------------------------------------------------------------------------------------+
| 1 0 0 3 10 0 0 3 0 0 1 0 0 | |
| 0 0 0 5 0 0 1 8 0 0 1 0 0 | |
| 0 0 0 6 7 1 0 2 0 0 1 0 0 | |
+---------------------------------------------------------------------------------------------------+
I then create a test set using this piece of code
test_ratings = np.random.choice(counts[user,:].nonzero()[0],size=1,replace=True)
train[user,test_ratings] = 0
test[user,test_ratings] = counts[user,test_ratings]
assert(np.all((train * test) == 0))
这给了我:
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col1 col12 col13
+---------------------------------------------------------------------------------------------------+
| 0 0 0 0 0 0 0 3 0 0 0 0 0 | |
| 0 0 0 0 0 0 1 0 0 0 0 0 0 | |
| 0 0 0 6 0 0 0 0 0 0 0 0 0 | |
+---------------------------------------------------------------------------------------------------+
行是用户,列是项 .
现在,我想知道这是否是我的测试集的正确表示 . 我已经获得了一个非零值并使一切都为零 . 因此,我的算法应该将非零值排名为推荐项 .
这是正确的做事方式吗?
任何帮助将非常感激
1 回答
Updated:
是的,您应该使用一些原始计数创建一个测试集,并查看您的系统是否将这些用户项识别为良好匹配 .
你应该小心一些事情:
仅为您拥有更多数据的项目或用户设置测试集值;
隐藏训练数据中的那些测试集值;
仅在您拥有数据的用户 - 项目对上训练您的模型,而不是在没有数据的情况下训练您的模型,而不是真正的评级;
Note: 这篇文章,Collaborative Filtering for Implicit Feedback Datasets,应该帮助你解决这些问题和其他问题 .