为什么ALS.trainImplicit可以更好地预测显性评级?

时间:2016-06-24 07:18:02

标签: machine-learning apache-spark-mllib recommendation-engine collaborative-filtering

编辑:我尝试了一个独立的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以这种方式定义显式隐式之间的区别:

  

显式偏好(也称为"显式反馈"),例如   "评价"由用户给予项目。隐含的偏好(也称为   as"隐含反馈"),例如" view"和"买"历史。

  

默认情况下,推荐模板使用ALS.train(),该ALS.train需要用户对该项目进行评级的显式评级值。

source

文档错了吗?我仍然认为显式反馈符合我的用例。也许我需要使用scan调整模板以获得有用的建议?或者我只是误解了什么?

1 个答案:

答案 0 :(得分:0)

很大程度上取决于您收集数据的方式。通常看似明确的评级实际上是隐含的。例如,假设您选择允许用户对之前购买/使用过的商品进行评级。这意味着他们花时间评估该特定项目的事实意味着该项目具有高质量。因此,质量差的物品根本没有评级,因为人们甚至懒得使用它们。因此,即使数据集是明确的,您也可能获得更好的结果,因为如果您认为结果是隐式的。同样,这根据数据的获取方式而有很大差异。