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部电影的用户。然后我想知道我可以根据用户通常观看的1部电影来预测每个用户有多好。我得到了很多电影的预测。然后绘制ROC和Precision-Recall曲线(使用预测的top-k)。我会用用户实际观看的n部电影重复所有这一切。我会在每个n的情节中得到一条ROC曲线。当我开始使用时,例如用户实际观看的4部电影,以预测他观看的所有电影,但他只观看了4部电影,结果变得非常好。

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

回答

1

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

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

FWIW我正在商业化 - CF基于矩阵分解 - 作为Myrrix。它基于我在Mahout的工作。您可以阅读关于tests like Area under curve (AUC) in the product的一些基本支持的文档。

这里的“原始”是您的输入矩阵中的一行(可能是一个用户)的示例吗?当你谈论一半,不包括,你指的是什么训练/测试分裂?拆分每个用户,还是跨用户采用子集?因为你似乎在谈论测量重建错误,但这并不需要排除任何东西。你只需将你的矩阵因子乘以一起,看看它们与输入有多接近。 “关闭”意味着低L2/Frobenius范数。但是对于常规推荐测试(如AUC或精确回忆),这是完全不同的事情,您可以按时间(最近的数据是测试数据)或数值(最偏爱的或相关项目是测试数据)。如果我理解输入矩阵中缺少的元素,那么它们不是真正的“数据”。你永远不会有这样一种情况,即测试数据都是0,因为它们没有输入。问题是,哪一个用于训练,哪一个用于测试。

+0

嗨,是的,我想看看重建有多好,我将把我的答案放在我的帖子中作为编辑。 – Puckl

+1

我想,你不想测量重建误差。您需要的是您在编辑中的上述说明 - 就像ROC曲线(这是AUC总结的内容)。要回答你的问题,照常运行测试。但是,对于恰好在火车组中有1个项目的用户,2个项目,3个项目等,单独计算AUC。您应该清楚地了解性能如何随着评分而变化。 –

+0

谢谢,我会试试这个! – Puckl