在推荐系统上将数据集拆分为训练集和测试集
Splitting data set into training and testing sets on recommender systems
我实现了一个基于矩阵分解技术的推荐系统。我要评价一下。
我想对 All-but-one 协议使用 10 折交叉验证 (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
...
想到数据将如何拆分让我很困惑,因为我不能在测试集中放置一些三元组(用户、项目、评级)。例如,如果我 select 测试集的三元组 (2,1,5) 并且这是用户 2 所做的唯一评分,则不会有关于此用户的任何其他信息,并且经过训练的模型获胜'为他预测任何值。
考虑到这种情况,拆分应该怎么做?
协同过滤(矩阵分解)无法为没有反馈的看不见的用户提供好的推荐。然而,评估应该考虑这种情况并考虑它。
您可以做的一件事是报告所有测试用户的性能,只测试有一些反馈的用户,只测试没有反馈的看不见的用户。
所以我会说保持测试,训练随机分割但单独评估看不见的用户。
更多信息here。
您的基本逻辑非常正确:如果您在 class 中只有一个观察值,您 必须 将其包含在模型的训练集中在 class.
中具有任何有效性
然而,将输入分成这些 classes 取决于各种观察之间的相互作用。你能找出 class 的数据,例如你提到的 "only rating" 问题吗?当您发现其他小的 classes 时,您还需要确保在训练数据中有足够的这些观察结果。
不幸的是,这是一个很难自动化的过程。大多数一次性应用程序只需从数据中手动挑选这些观察值,然后按正常划分分配其他观察值。这确实存在一个问题,即特殊情况在训练集中的比例过高,这可能会在一定程度上影响模型训练中的正常情况。
您是否有能力在遇到后期数据时调整模型?这通常是处理稀疏 classes 输入的最佳方式。
你没有指定语言或工具集,所以我不能给你一个 100% 适用于你的简明答案,但这是我用来解决同样问题的方法。
我正在开发一个使用 Treasure Data(即 Presto)和隐式观察的推荐系统,运行 我的矩阵存在一些用户和项目不存在的问题。我不得不重新编写算法,将观察结果分成训练和测试,这样每个用户和每个项目都会在训练数据中得到体现。对于我的算法的描述,我假设用户多于项目。如果这对您来说不是真的,那么只需交换两者。这是我的算法。
- Select 每个用户一个观察值
- 对于只有一个观察且尚未从上一步select编辑的每个项目select一个观察
- 将前两步的结果合并在一起。
这应该产生一组涵盖所有用户和所有项目的观察结果。
- 计算您需要多少个观测值来填充您的训练集(通常占观测值总数的 80%)
- 计算第 3 步的合并集中有多少观测值。
第 4 步和第 5 步之间的差异是填充训练集所需的剩余观察值的数量。
- 随机 select 足够的剩余观察值来填充训练集。
- 合并第 3 步和第 6 步中的集合:这是您的训练集。
- 剩下的观察结果就是你的测试集。
正如我提到的,我正在使用 Treasure Data 和 Presto 执行此操作,所以我可以使用的唯一工具是 SQL、常用 table 表达式、临时 tables和 Treasure Data 工作流。
我实现了一个基于矩阵分解技术的推荐系统。我要评价一下。
我想对 All-but-one 协议使用 10 折交叉验证 (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
...
想到数据将如何拆分让我很困惑,因为我不能在测试集中放置一些三元组(用户、项目、评级)。例如,如果我 select 测试集的三元组 (2,1,5) 并且这是用户 2 所做的唯一评分,则不会有关于此用户的任何其他信息,并且经过训练的模型获胜'为他预测任何值。
考虑到这种情况,拆分应该怎么做?
协同过滤(矩阵分解)无法为没有反馈的看不见的用户提供好的推荐。然而,评估应该考虑这种情况并考虑它。
您可以做的一件事是报告所有测试用户的性能,只测试有一些反馈的用户,只测试没有反馈的看不见的用户。
所以我会说保持测试,训练随机分割但单独评估看不见的用户。
更多信息here。
您的基本逻辑非常正确:如果您在 class 中只有一个观察值,您 必须 将其包含在模型的训练集中在 class.
中具有任何有效性然而,将输入分成这些 classes 取决于各种观察之间的相互作用。你能找出 class 的数据,例如你提到的 "only rating" 问题吗?当您发现其他小的 classes 时,您还需要确保在训练数据中有足够的这些观察结果。
不幸的是,这是一个很难自动化的过程。大多数一次性应用程序只需从数据中手动挑选这些观察值,然后按正常划分分配其他观察值。这确实存在一个问题,即特殊情况在训练集中的比例过高,这可能会在一定程度上影响模型训练中的正常情况。
您是否有能力在遇到后期数据时调整模型?这通常是处理稀疏 classes 输入的最佳方式。
你没有指定语言或工具集,所以我不能给你一个 100% 适用于你的简明答案,但这是我用来解决同样问题的方法。
我正在开发一个使用 Treasure Data(即 Presto)和隐式观察的推荐系统,运行 我的矩阵存在一些用户和项目不存在的问题。我不得不重新编写算法,将观察结果分成训练和测试,这样每个用户和每个项目都会在训练数据中得到体现。对于我的算法的描述,我假设用户多于项目。如果这对您来说不是真的,那么只需交换两者。这是我的算法。
- Select 每个用户一个观察值
- 对于只有一个观察且尚未从上一步select编辑的每个项目select一个观察
- 将前两步的结果合并在一起。 这应该产生一组涵盖所有用户和所有项目的观察结果。
- 计算您需要多少个观测值来填充您的训练集(通常占观测值总数的 80%)
- 计算第 3 步的合并集中有多少观测值。 第 4 步和第 5 步之间的差异是填充训练集所需的剩余观察值的数量。
- 随机 select 足够的剩余观察值来填充训练集。
- 合并第 3 步和第 6 步中的集合:这是您的训练集。
- 剩下的观察结果就是你的测试集。
正如我提到的,我正在使用 Treasure Data 和 Presto 执行此操作,所以我可以使用的唯一工具是 SQL、常用 table 表达式、临时 tables和 Treasure Data 工作流。