我已经使用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推荐产品时,我所期望的只是推荐用户尚未购买的产品。但是令我惊讶的是,为什么模型会返回训练数据中已经存在的数据。
有人可以帮助我如何避免训练数据本身得到预测吗?