我已经实现了基于矩阵分解技术的推荐系统。我想评估它。
我想使用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所做的唯一评级,则不会有关于此用户的任何其他信息,并且训练的模型将不会预测任何他的价值观。
考虑到这种情况,我应该如何进行拆分?
答案 0 :(得分:1)
你的基本逻辑非常正确:如果你在一个班级中只有一个观察,你必须在模型的训练集中包含那个在该类中有任何有效性的观察
然而,将输入划分为这些类取决于各种观察之间的相互作用。您是否可以识别数据类别,例如" only rating"你提到的问题?当您找到其他小班时,您还需要确保您的训练数据中有足够的观察结果。
不幸的是,这是一个自动化的过程。大多数一次性应用程序只需从数据中手工挑选这些观察结果,然后按正常分区分配其他应用程序。这确实存在一个问题,即特殊情况在训练集中过度表示,这可能会在训练模型时略微偏离正常情况。
您是否有能力在遇到以后的数据时调整模型?这通常是处理稀疏输入类的最佳方法。
答案 1 :(得分:1)
您未指定语言或工具集,因此我无法为您提供100%适用于您的简明答案,但这是我用来解决同样确切问题的方法。
我正在使用Treasure Data(即Presto)和隐式观察在推荐系统上工作,但是我的矩阵出现了问题,其中没有用户和商品。我不得不重新编写算法,将观察结果分为训练和测试,以便每个用户和每个项目都可以在训练数据中表示出来。对于我的算法的描述,我假设用户多于项目。如果这对您不正确,则只需将两者交换即可。这是我的算法。
正如我所提到的,我正在使用Treasure Data和Presto进行此操作,因此我唯一可以使用的工具是SQL,公用表表达式,临时表和Treasure Data工作流程。
答案 2 :(得分:0)
您可以做的一件事是报告所有测试用户的性能,只测试一些反馈的用户以及没有反馈的看不见的用户。
所以我会说保持测试,随机训练分开,但对看不见的用户单独评估。
更多信息here。