在推荐系统中将数据集分成训练集和测试集

6
我已经基于矩阵分解技术实现了一个推荐系统。我想要对其进行评估。
我想要使用10折交叉验证和All-but-one协议(https://ai2-s2-pdfs.s3.amazonaws.com/0fcc/45600283abca12ea2f422e3fb2575f4c7fc0.pdf)。
我的数据集结构如下:
user_id,item_id,rating
1,1,2
1,2,5
1,3,0
2,1,5
...

我很困惑如何分割数据,因为我不能把某些三元组(用户、项目、评分)放入测试集中。例如,如果我选择将三元组(2,1,5)放入测试集中,并且这是用户2所做的唯一评分,那么关于该用户的任何其他信息都不会被学习模型使用,因此训练模型将无法预测出任何值。

考虑到这种情况,我应该如何进行数据拆分呢?

3个回答

3
您没有说明所使用的语言或工具集,因此我无法为您提供100%适用于您的简洁答案,但这是我解决相同问题时采取的方法。
我正在使用Treasure Data(即Presto)和隐式观察来构建推荐系统,并遇到了矩阵中缺少某些用户和项目的问题。我不得不重新编写算法,将观察分成训练和测试,以便每个用户和每个项目都在训练数据中表示。下面是我的算法描述。假设有更多用户而不是项目,请互换两者。
以下是我的算法:
1. 为每个用户选择一个观察。 2. 对于仅有一个观察且尚未从上一步骤选择的每个项目,选择一个观察。 3. 合并前两个步骤的结果。这应该生成一个覆盖所有用户和所有项目的观测集合。 4. 计算需要填充训练集的观察次数(通常为总观察次数的80%)。 5. 计算第3步中合并的集合中有多少个观察次数。 6. 步骤4和步骤5之间的差异是必要填充训练集的剩余观察次数。 7. 随机选择足够的剩余观察次数以填充训练集。 8. 合并步骤3和6中的数据集,这就是您的训练集。 9. 剩余的观察次数是您的测试集。
正如我所提到的,我正在使用Treasure Data和Presto进行此操作,因此我唯一可以使用的工具是SQL,公共表达式,临时表和Treasure Data工作流程。

但是,你有没有任何参考资料来支持你的观点?我很乐意阅读相关论文或文章!谢谢。 - Boubacar Traoré
让我看看我能想出什么。你的训练集需要包含足够的观察数据,以便矩阵分解训练可以完成其预期的任务:识别每个用户和项目的潜在因素。如果一个用户或项目没有任何观察数据,则训练将无用,即使只有一个观察数据通常也不足够。我已经重新设计了逻辑,只考虑那些至少有10个观察数据的用户和项目。 - JZimmerman

1

您的基本逻辑是正确的:如果您在一个类中只有一个观察结果,您必须将其包含在训练集中,以使模型在该类中具有任何有效性。

然而,将输入分成这些类别取决于各种观察结果之间的交互。您能否识别数据类别,例如您提到的“仅评级”问题?当您发现其他小类别时,您还需要确保在您的训练数据中有足够的这些观察结果。

不幸的是,这是一个难以自动化的过程。大多数一次性应用程序只需手动从数据中挑选这些观察结果,然后按正常分配方式分配其他观察结果。这会有一个问题,即特殊情况在训练集中过度呈现,这可能会影响训练模型中的普通情况。

您是否有调整模型的能力,以处理后来的数据?这通常是处理稀疏输入类别的最佳方法。


0

协同过滤(矩阵分解)无法为没有反馈的未知用户提供良好的推荐。尽管如此,评估应该考虑这种情况并加以考虑。

你可以做的一件事是报告所有测试用户的性能,只测试有一些反馈的用户和没有反馈的未知用户。

所以我建议保持测试、训练的随机性,但对未知用户进行单独评估。

更多信息在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接