0

我正在使用非负矩阵分解和非负最小二乘法进行预测,并且我想根据给定的数据量评估预测的好坏。例如原始数据是

original = [1, 1, 0, 1, 1, 0]

现在我想看看当给定数据不完整时我能重建原始数据有多好:

incomplete1 = [1, 1, 0, 1, 0, 0],
incomplete2 = [1, 1, 0, 0, 0, 0],
incomplete3 = [1, 0, 0, 0, 0, 0]

我想对大数据集中的每个示例都这样做。现在的问题是,原始数据的正数据量不同,在上面的原始数据中有 4 个,但对于数据集中的其他示例,它可能或多或少。假设我进行了一轮评估,给出了 4 个正例,但我的数据集的一半只有 4 个正例,另一半有 5,6 或 7 个。我应该排除有 4 个正例的那一半,因为它们没有丢失数据使“预测”更好?另一方面,如果我排除数据,我会更改训练集。我能做些什么?或者在这种情况下我根本不应该用 4 进行评估?

编辑:

基本上我想看看我能重建输入矩阵有多好。为简单起见,假设“原始”代表观看了 4 部电影的用户。然后我想知道我能预测每个用户有多好,仅基于用户实际观看的一部电影。我得到了很多电影的预测。然后我绘制 ROC 和 Precision-Recall 曲线(使用预测的 top-k)。我将用用户实际观看的 n 部电影重复所有这些。对于每个 n,我都会在我的图中得到一条 ROC 曲线。当我使用例如用户实际观看的 4 部电影来预测他观看的所有电影时,但他只看了这 4 部电影,结果变得太好了。

我这样做的原因是为了看看我的系统需要多少“观看电影”才能做出合理的预测。如果它在已经观看了 3 部电影时只返回好的结果,那在我的应用程序中就不会那么好了。

4

1 回答 1

1

我认为首先要清楚你要衡量什么,以及你的输入是什么。

你真的在测量重建输入矩阵的能力吗?在协同过滤中,输入矩阵本身本质上是非常不完整的。推荐人的全部工作就是填补一些空白。如果它完美地重建了输入,它不会给出任何答案。通常,在使用 NNMF 进行协同过滤时,您的评估指标与此完全不同。

FWIW 我正在将其商业化——基于矩阵分解的 CF——作为Myrrix。它基于我在Mahout中的工作。您可以阅读文档,了解对产品中曲线下面积 (AUC) 等测试的一些基本支持。

这里的“原始”是输入矩阵中一行的示例吗,可能是针对一个用户的?当您谈论一半(不包括在内)时,您指的是什么训练/测试拆分?拆分每个用户,还是跨用户获取一个子集?因为您似乎在谈论测量重建误差,但这不需要排除任何东西。您只需将矩阵因子相乘并查看它们与输入的接近程度。“关闭”意味着低 L2 / Frobenius 范数。

但是对于完全不同的约定推荐测试(如 AUC 或精确召回),您可以按时间(最近的数据是测试数据)或值(最喜欢或相关的项目是测试数据)。如果我理解 0 是输入矩阵的缺失元素,那么它们并不是真正的“数据”。您永远不会遇到测试数据全为 0 的情况,因为一开始就没有输入它们。问题是,哪些 1 用于训练,哪些 1 用于测试。

于 2012-09-01T14:17:24.847 回答