编辑:我尝试了一个独立的 Spark 应用程序(而不是 PredictionIO),我的观察结果是相同的。所以这不是 PredictionIO 问题,但仍然令人困惑。
<小时/>我正在使用 PredictionIO 0.9.6 和 Recommendation协同过滤的模板。我的数据集中的评分是 1 到 10 之间的数字。当我第一次使用模板中的默认值训练模型时(使用 ALS.train
),预测很糟糕,至少在主观上是这样。分数最高可达 60.0 左右,但推荐似乎完全是随机的。
有人建议 ALS.trainImplicit
做得更好,所以我相应地更改了 src/main/scala/ALSAlgorithm.scala
:
val m = ALS.trainImplicit( // instead of ALS.train
ratings = mllibRatings,
rank = ap.rank,
iterations = ap.numIterations,
lambda = ap.lambda,
blocks = -1,
alpha = 1.0, // also added this line
seed = seed)
现在分数低得多(低于 1.0),但建议与个人评分一致。好多了,但也令人困惑。 PredictionIO 通过以下方式定义显式和隐式之间的差异:
explicit preference (also referred as "explicit feedback"), such as "rating" given to item by users. implicit preference (also referred as "implicit feedback"), such as "view" and "buy" history.
和:
By default, the recommendation template uses
ALS.train()
which expects explicit rating values which the user has rated the item.
文档有误吗?我仍然认为明确的反馈适合我的用例。也许我需要使用 ALS.train
调整模板才能获得有用的建议?或者我只是误解了什么?
最佳答案
很大程度上取决于您收集数据的方式。通常看似明确的评级实际上可能是隐含的。例如,假设您提供允许用户对他们之前购买/使用过的商品进行评分的选项。这意味着他们花时间评估该特定元素这一事实意味着该元素具有高质量。因此,质量差的元素根本不会被评级,因为人们甚至懒得使用它们。因此,即使数据集是显式的,您也可能会得到更好的结果,因为如果您认为结果是隐式的。同样,这根据数据获取方式的不同而有很大差异。
关于machine-learning - 为什么 ALS.trainImplicit 对显式评分给出更好的预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38007724/