从分类的用户行为中使用 Mahout 进行用户分析

数据挖掘 分类 聚类 apache-mahout
2022-02-12 10:34:34

我正在尝试使用 Mahout 对用户进行聚类和分类。在我处于计划阶段的那一刻,我的脑海里完全混杂着各种想法,而且由于我对这个领域比较陌生,所以我被困在数据格式上。

假设我们有两个数据表(足够大)。第一个表中有用户及其操作。每个用户至少有一个操作,他们也可以有太多的操作。表中有大约 10000 个不同的 user_actions 和数百万条记录。

user        - user_action
u1          - a
u2          - b
u3          - a
u1          - c
u2          - c
u2          - c
u1          - b
u4          - f
u4          - e
u1          - e
u1          - d
u5          - d

在另一个表中,有操作类别。每个动作可能没有或有多个类别。有60个类别。

user_action - category
a           - cat1
b           - cat2
c           - cat1
d           - NULL
e           - cat1, cat3
f           - cat4

我将尝试使用Mahout构建用户分类模型,但我不知道我应该做什么。我应该创建什么类型的用户向量?还是我真的需要用户向量?

我想我需要创造类似的东西;

u1 (a, c, b, e, d)
u2 (b, c, c)
u3 (a)
u4 (f, e)
u5 ()

问题在这里,一些用户执行了超过 100000 个操作(其中一些是相同的操作)

所以; 我认为这更有用;

u1 (cat1, cat1, cat2, cat1, cat3)
u2 (cat2, cat1, cat1)
u3 (cat1)
u4 (cat4, cat1, cat3)
u5 ()

我也担心的事情是

  • 我应该如何为用户加权类别?比如 u1 至少有 3 个与 cat1 相关的 action,而 u3 只有 1 个。这应该不一样吧?
  • 如何减少主动用户和被动用户之间的差异?就像 u1 有太多动作和类别一样,u3 只有 1 个。

欢迎任何指导。

1个回答

我认为一个解决方案可能是使用矩阵分解来执行某种协作过滤。这样,您就不必明确地处理您所拥有的两个关注点。

为此,请创建一个 [User X Action] 矩阵 W,其中行是用户,列是操作。W(i,j) 即第 i 行第 j 列的矩阵条目将是用户 i 执行操作 j 的次数。大多数协同过滤算法将未给出数据的矩阵条目视为缺失数据值。

当你分解这个矩阵时,你把它分解成两部分 W= A*B。A 矩阵的行是用户,列是潜在维度。从这个 A 中,您可以获得每个用户的特征向量。然后,您可以对这些特征向量运行聚类以对用户进行聚类。有关分解方法的更多直觉,请在 google 上查找“协作过滤的矩阵分解”。Mahout 具有您可以使用的矩阵分解实现。

使用动作类别完全是另一回事。这取决于类别的含义。这是否意味着一个类别中的每个动作都非常相似,或者它们只有一个或两个方面的相似性。一种非常简单的方法是分解 [User X (Action + Category)] 矩阵。这可以使用前面提到的相同实现来解决。您还可以有更多花哨的方案,例如将 Matrix B 的一部分固定为与 [Action X Category] ​​矩阵非常相似。但是这些方案将需要您自己编写优化代码。