将数据拆分为推荐系统上的培训和测试集

时间:2017-03-30 23:03:42

标签: machine-learning recommendation-engine cross-validation

我已经实现了基于矩阵分解技术的推荐系统。我想评估它。

我想使用All-but-one协议(https://ai2-s2-pdfs.s3.amazonaws.com/0fcc/45600283abca12ea2f422e3fb2575f4c7fc0.pdf)进行10次交叉验证。

我的数据集具有以下结构:

user_id,item_id,rating
1,1,2
1,2,5
1,3,0
2,1,5
...

让我想一想数据是如何分割的,这让我很困惑,因为我不能在测试集中加入一些三元组(用户,项目,评级)。例如,如果我选择测试集的三元组(2,1,5)并且这是用户2所做的唯一评级,则不会有关于此用户的任何其他信息,并且训练的模型将不会预测任何他的价值观。

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

3 个答案:

答案 0 :(得分:1)

你的基本逻辑非常正确:如果你在一个班级中只有一个观察,你必须在模型的训练集中包含那个在该类中有任何有效性的观察

然而,将输入划分为这些类取决于各种观察之间的相互作用。您是否可以识别数据类别,例如" only rating"你提到的问题?当您找到其他小班时,您还需要确保您的训练数据中有足够的观察结果。

不幸的是,这是一个自动化的过程。大多数一次性应用程序只需从数据中手工挑选这些观察结果,然后按正常分区分配其他应用程序。这确实存在一个问题,即特殊情况在训练集中过度表示,这可能会在训练模型时略微偏离正常情况。

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

答案 1 :(得分:1)

您未指定语言或工具集,因此我无法为您提供100%适用于您的简明答案,但这是我用来解决同样确切问题的方法。

我正在使用Treasure Data(即Presto)和隐式观察在推荐系统上工作,但是我的矩阵出现了问题,其中没有用户和商品。我不得不重新编写算法,将观察结果分为训练和测试,以便每个用户和每个项目都可以在训练数据中表示出来。对于我的算法的描述,我假设用户多于项目。如果这对您不正确,则只需将两者交换即可。这是我的算法。

  1. 为每个用户选择一个观察值
  2. 对于只有一个观测值且尚未从上一步中选择的每个项目,请选择一个观测值
  3. 将前两个步骤的结果合并在一起。 这应该产生一组涵盖所有用户和所有项目的观察结果。
  4. 计算完成训练集所需的观察次数(通常占观察总数的80%)
  5. 计算来自步骤3的合并集中有多少个观测值。 第4步和第5步之间的区别在于,填充训练集所需的剩余观测数。
  6. 随机选择剩余的观测值以填充训练集。
  7. 合并步骤3和6中的集合:这是您的训练集合。
  8. 其余的观察值就是您的测试集。

正如我所提到的,我正在使用Treasure Data和Presto进行此操作,因此我唯一可以使用的工具是SQL,公用表表达式,临时表和Treasure Data工作流程。

答案 2 :(得分:0)

对于没有反馈的看不见的用户,协同过滤(矩阵分解)不能提供良好的推荐。然而,评估应考虑此案例并将其考虑在内。

您可以做的一件事是报告所有测试用户的性能,只测试一些反馈的用户以及没有反馈的看不见的用户。

所以我会说保持测试,随机训练分开,但对看不见的用户单独评估。

更多信息here