machine-learning - 为什么 ALS.trainImplicit 对显式评分给出更好的预测?

标签 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 通过以下方式定义显式和隐式之间的差异:

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.

source

文档有误吗?我仍然认为明确的反馈适合我的用例。也许我需要使用 ALS.train 调整模板才能获得有用的建议?或者我只是误解了什么?

最佳答案

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

关于machine-learning - 为什么 ALS.trainImplicit 对显式评分给出更好的预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38007724/

相关文章:

apache-spark - Spark MLlib LDA : the possible reasons behind generating always very similar LDA topics?

python - 使用 LightFM 和打印预测创建稀疏矩阵

python - Jupyter 错误 - 给定代码段的 'the kernel appears to have died, it will restart automatically'

python - Spark - 将 DataFrame 转换为 RowMatrix 以有效计算所有对的相似度

c#-4.0 - C# 中有没有直接的方法来优化数学函数或最小化表达式中的参数?

machine-learning - Keras 如何更新多标签学习中的权重(实现方面)

apache-spark-mllib - Spark LinearRegressionSummary "normal"摘要

python - 使用 tf.train.MonitoredTrainingSession 时如何获取全局步骤

python - 带有 Mobilenets 的 Tensorflow 对象检测 API 过拟合自定义多类数据集

java - Spark : StringIndexer on sentences