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



我们在 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. 输入数据可能是不确定的。相关 GitHub 问题

最新更新