【问题标题】:Collaborative Filtering in SparkSpark 中的协同过滤
【发布时间】:2017-10-21 12:17:14
【问题描述】:

我正在 SparkML 中为隐式反馈数据集运行协同过滤。

假设我的数据集如下所示。

  User  Item    viewed
1   A   1
1   B   2
2   A   3
2   C   4
3   A   3
3   B   2
3   D   6

所以我有大约 56K 的唯一用户和 8.5K 的唯一项目。但是,在这种情况下,每个用户没有每个项目的行,而只有他们评价/查看的项目。这是一个隐式反馈数据集,其中“查看”列是第。用户查看项目的次数。

现在这也是 SparkML 期望的格式(用户 ID、项目 ID、评级)。

但是我的问题是,我可以像 SparkML ALS 算法一样直接输入这个数据集,还是需要创建所有用户和项目的笛卡尔连接?原因是由于此数据集中没有用户和项目的所有组合,ALS 算法不会看到用户和项目的所有组合,因此会在预测中给出 Null 值。

所以对于用户还没有看到的项目,我们也应该为每个用户创建一个行并将视图设为 0?像下面这样?

User    Item    Viewed
1   A   1
1   B   2
1   C   0
1   D   0
2   A   3
2   C   4
2   B   0
2   D   0
3   A   3
3   B   2
3   D   6
3   C   0

如果这是正确的,那么我有 56K 唯一用户和 8.5K 唯一项目。这将使 56*8.5K= 400MM 行。

想象一下,如果用户数以百万计,物品数以百万计。在那种情况下,它将是巨大的数据集。

我做了笛卡尔的事情,它似乎给出了正确的预测,没有像之前那样的 Null 值。但我想确认这是否需要为 Spark 协作过滤准备数据集?

我说的对吗?

编辑:

另一个问题是关于如何创建笛卡尔连接,而不是笛卡尔连接是否是 Spark ML 的正确数据集格式。所以这是一个不同的问题。请不要关闭。

【问题讨论】:

  • 嘿@baktaawar,您找到问题的明确答案了吗?我会很感兴趣的!
  • @Duesentrieb 不完全是,但我认为我在这里写的是正确的。对于隐式反馈,您必须进行笛卡尔连接,除非您可以接受没有一些建议。我与来自 Cloudera 的 Sean Owen 在电子邮件中就此进行了长时间的讨论,他后来同意我所说的有道理。我认为这是 Spark ppl 没有意识到的事情,可能就像一个错误。

标签: python apache-spark pyspark collaborative-filtering


【解决方案1】:

这个假设显然是错误的:

原因是由于此数据集中没有用户和项目的所有组合,ALS 算法不会看到用户和项目的所有组合,因此会在预测中给出 Null 值。

并使这个问题无效。 不需要用户和项目的所有组合。您所需要的只是每个项目和每个用户的一些数据。直观地说,如果您没有看到用户或答案,它就不会出现在计算因子中,您也无法对其进行推理。就是这样。

关于这个:

所以对于用户还没有看到的项目,我们也应该为每个用户创建一个行并将视图设为 0?像下面这样?

这可能在某种程度上适用于隐式反馈,但对于显式反馈显然是错误的。没有评分不等于最低评分。

【讨论】:

  • 对于显式,您不需要为用户未看到项目的用户和项目创建行。因为它有两个反馈。但是对于隐式这意味着我们需要创建所有用户和项目的笛卡尔连接..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2015-05-23
  • 1970-01-01
  • 2016-12-30
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多