首页 > 解决方案 > MLlib MatrixFactorizationModel RecommendationProducts(user, num) 还返回训练数据产品项

问题描述

我使用 Spark MLib 创建了一个 ALS 模型:

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel

// Build the recommendation model using ALS
val rank = 10
val numIterations = 10
val model = ALS.train(trainingGrid, rank, numIterations)

我的训练网格的结构是这样的:

+-----------+----------+---------+--------+---------+
|.  Bought|cidIndex|productIndex|
+-----------+----------+---------+--------+---------+
|     true|    38.0| 113959.0|
|    false|    38.0| 193806.0|
|     true|    38.0| 260716.0|
|     true|    38.0|   7038.0|
|    false|   107.0|  93949.0|
|    false|    38.0|  13484.0|
|    false|    38.0|  59290.0|
|    false|    38.0|  76696.0|
|    false|   107.0|  71311.0|
|     true|    38.0|  92553.0|
+-----------+----------+---------+--------+---------+

它有大约 2 万条这样的记录。

在我打电话的培训之后,

val products = model.recommendProducts(38,5)

这将返回以下项目:

Rating(38,260716,0.9800308437967447)
Rating(38,219601,0.9800308437967447)
Rating(38,61616,0.9800308437967447)
Rating(38,113959,0.9800308437967447)
Rating(38,92553,0.9800308437967447)

问题在于这 5 个项目中,有 3 个项目已经存在于训练数据中。260716、113959 和 92553。

当我打电话给 ALS 推荐商品时,我所期望的只是推荐用户尚未购买的产品。但令我惊讶的是,为什么模型返回的数据已经存在于训练数据中。

有人可以帮我如何避免训练数据本身被预测吗?

标签: scalaapache-sparkapache-spark-mllibcollaborative-filteringmatrix-factorization

解决方案


推荐阅读