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
我们在 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