编辑:我尝试了一个独立的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通过这种方式定义显式和隐式之间的区别:
显式偏好(也称为“显式反馈”),例如
用户对项目的“评级”。隐式偏好(也称为
(例如“隐式反馈”),例如“查看”和“购买”历史记录。
和:
默认情况下,推荐模板使用
ALS.train()
,它期望用户已对该项目进行评级的明确评级值。source
文档是否有误?我仍然认为显式反馈适合我的用例。也许我需要使用
ALS.train
修改模板以获得有用的建议?还是我只是误解了什么? 最佳答案
这很大程度上取决于您如何收集数据。通常,看似明确的等级实际上可以是隐含的。例如,假设您提供允许用户对他们之前购买/使用过的商品进行评分的选项。这意味着他们花了很多时间评估该特定项目这一事实意味着该项目具有高品质。因此,质量差的物品根本不会被评级,因为人们甚至都不想使用它们。这样,即使数据集是显式的,也可能会得到更好的结果,因为如果您认为结果是隐式的。再次,这基于如何获取数据而显着变化。
关于machine-learning - 为什么ALS.trainImplicit可以对明确的收视率做出更好的预测?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38007724/