为推荐引擎生成测试集
Generating test set for recommendation engine
我正在研究基于隐式反馈的推荐引擎。我正在使用这个 link : 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 | |
+---------------------------------------------------------------------------------------------------+
这里的行是用户,列是项目。
现在,我想知道这是否是我的测试集的正确表示。我选择了一个非零值并将所有值设为零。所以,我的算法应该将非零值列为推荐项。
这是处理事情的正确方法吗?
任何帮助将不胜感激
更新:
是的,您应该使用您的一些原始计数创建一个测试集,并查看您的系统是否将这些用户项识别为良好匹配。
您应该注意以下几点:
- 只为您拥有的项目或用户添加您的测试集值
更多数据;
- 从训练数据中隐藏那些测试集值;
- 只在你有数据的用户-项目对上训练你的模型,而不是在 0 上 - 这样做的原因是因为假设你的 0 代表你没有数据的对,而不是真实收视率;
注意:这篇文章 Collaborative Filtering for Implicit Feedback Datasets 应该可以帮助您解决这些问题和其他问题。
我正在研究基于隐式反馈的推荐引擎。我正在使用这个 link : 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 | | +---------------------------------------------------------------------------------------------------+
这里的行是用户,列是项目。
现在,我想知道这是否是我的测试集的正确表示。我选择了一个非零值并将所有值设为零。所以,我的算法应该将非零值列为推荐项。
这是处理事情的正确方法吗?
任何帮助将不胜感激
更新:
是的,您应该使用您的一些原始计数创建一个测试集,并查看您的系统是否将这些用户项识别为良好匹配。
您应该注意以下几点:
- 只为您拥有的项目或用户添加您的测试集值 更多数据;
- 从训练数据中隐藏那些测试集值;
- 只在你有数据的用户-项目对上训练你的模型,而不是在 0 上 - 这样做的原因是因为假设你的 0 代表你没有数据的对,而不是真实收视率;
注意:这篇文章 Collaborative Filtering for Implicit Feedback Datasets 应该可以帮助您解决这些问题和其他问题。