Spark ALS 算法给出了太多的零因子

Spark ALS algorithm gives too many zero factors

我们在 spark 2.2.1 中使用 ALS 来计算用户嵌入和项目嵌入。我们的实验样本包含 120 亿个实例,点击的实例标记为正例,否则标记为负例。

当用用户嵌入和项目嵌入的乘积评估 AUC 时,我们发现 AUC 指标在相同的训练数据和相同的参数上不稳定。检查嵌入后,我们发现即使用户点击了一些异常的项目,ALS 也可能给出零因子。

有什么想法吗?谢谢你的帮助。 这是我们的代码

val hivedata = sc.sql(sqltext).select(id,dpid,score).coalesce(numPartitions)
val predataItem =  hivedata.rdd.map(r=>(r._1._1,(r._1._2,r._2.sum)))
  .groupByKey().zipWithIndex()
  .persist(StorageLevel.MEMORY_AND_DISK_SER)
val predataUser = predataItem.flatMap(r=>r._1._2.map(y=>(y._1,(r._2.toInt,y._2))))
  .aggregateByKey(zeroValueArr,numPartitions)((a,b)=> a += b,(a,b)=>a ++ b).map(r=>(r._1,r._2.toIterable))
  .zipWithIndex().persist(StorageLevel.MEMORY_AND_DISK_SER)
val trainData = predataUser.flatMap(x => x._1._2.map(y => (x._2.toInt, y._1, y._2.toFloat)))
  .setName(trainDataName).persist(StorageLevel.MEMORY_AND_DISK_SER)

case class ALSData(user:Int, item:Int, rating:Float) extends Serializable
val ratingData = trainData.map(x => ALSData(x._1, x._2, x._3)).toDF()
    val als = new ALS
    val paramMap = ParamMap(als.alpha -> 25000).
      put(als.checkpointInterval, 5).
      put(als.implicitPrefs, true).
      put(als.itemCol, "item").
      put(als.maxIter, 60).
      put(als.nonnegative, false).
      put(als.numItemBlocks, 600).
      put(als.numUserBlocks, 600).
      put(als.regParam, 4.5).
      put(als.rank, 25).
      put(als.userCol, "user")
    als.fit(ratingData, paramMap)

有两个原因: 1. 项目向量在没有正样本的情况下全部为零。 2. 输入数据可能是不确定的。 related github issues