如何在 Spark 中确定 ALS.transImplicit 中的偏好/置信度?

Posted

技术标签:

【中文标题】如何在 Spark 中确定 ALS.transImplicit 中的偏好/置信度?【英文标题】:How to determine Preference/Confidence in ALS.transImplicit in Spark? 【发布时间】:2016-08-03 20:00:59 【问题描述】:

我在 Spark 中使用来自 ALStrainsimplicit。 从文档页面:http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.recommendation.ALS.trainImplicit,使用 trainImplicit(ratings, rank, iterations=5, lambda_=0.01, blocks=-1, alpha=0.01, nonnegative=False, seed=None) 训练模型。

我的问题是我们应该将ratings 输入为(user, product, view times/watching time >0) 吗? 还是(user, product, preference = 0/1)

同时,我注意到如果将alpha =0.01 更改为其他值,结果会有所不同。我们如何知道训练期间在 Spark 中使用了哪种偏好-置信关系,例如 c = 1 + alpha * r1+ alpha * log(1+r/e)r 可能是持续时间或频率数)?

我还注意到,在 web https://spark.apache.org/docs/1.4.0/api/python/_modules/pyspark/mllib/recommendation.html#ALS.trainImplicit 中,trainsimplicit 类方法中有 cls。它是一种定义偏好-置信关系的方法吗?

非常感谢!

【问题讨论】:

【参考方案1】:

隐式偏好的含义是,每次用户查看/观看产品时,您的信心都会增加。正确的? 因此输入应该是(user, product, view times/watching time >0) 如果您将输入限制为 0/1 首选项,您只会丢失信息。

正如我从original spark code 看到的那样

if (implicitPrefs) 
  // Extension to the original paper to handle b < 0. confidence is a function of |b|
  // instead so that it is never negative. c1 is confidence - 1.0.
  val c1 = alpha * math.abs(rating)
  // For rating <= 0, the corresponding preference is 0. So the term below is only added
  // for rating > 0. Because YtY is already added, we need to adjust the scaling here.
  if (rating > 0) 
    numExplicits += 1
    ls.add(srcFactor, (c1 + 1.0) / c1, c1)
  
 

ALS 使用线性依赖的修改版本。

虽然我从未见过任何文档

【讨论】:

我明白了。但是我们怎么知道 ALS 在训练模型中使用了confidence = 1+alpha*rconfidence = 1+alpha *log(1+r/e)?这里r= view times/watching time,任意实数且>0。

以上是关于如何在 Spark 中确定 ALS.transImplicit 中的偏好/置信度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark MLlib 中进行回归分析,以确定电信行业的客户流失率?

spark如何确定任务数量?

如何确定 Apache Spark 数据帧中的分区大小

任务中如何确定spark分区数task数目core个数worker节点个数excutor数量

如何使用Spark确定分区键/列

当按使用的时间窗口分组时,Spark 如何确定第一个窗口的 window.start?