如何让PySpark ALS推荐系统返回测试集用户的推荐结果
PySpark ALS 冷启动用户推荐获取方案
Spark MLlib 中的ALS模型是基于隐式/显式反馈的矩阵分解实现,训练阶段只会为在训练集中出现过交互行为的用户、物品生成对应的隐向量。
model.recommendForAllUsers(N)API的逻辑是遍历所有模型已存储的用户隐向量,和全量物品隐向量做内积计算后取TopN结果,自然只会返回训练集中存在的58971位用户的推荐结果,测试集中未在训练集出现的44819位用户属于「用户冷启动」范畴,默认不会生成推荐。
两个问题的明确回答
1. 如何获取测试集用户的推荐结果
分两种场景处理:
- 场景1:测试集用户存在历史交互行为,只是拆分数据集时被划分到测试集
这是最常见的情况,你提到的全量重训练方案就是最优解法,具体操作如下:- 复用你之前通过交叉验证/留出法验证得到的最优ALS参数,包括
rank、regParam、maxIter、implicitPrefs等 - 将训练集、测试集的所有交互数据合并为全量数据集,重新训练ALS模型
- 训练完成后调用
model.recommendForAllUsers(3)即可获取全部103790位用户的推荐结果
- 复用你之前通过交叉验证/留出法验证得到的最优ALS参数,包括
- 场景2:测试集用户为无任何历史交互的纯新用户
ALS模型本身无法解决纯冷启动问题,你需要额外做兜底策略,比如给新用户推荐全站TopN热门物品,或者基于用户的年龄、性别、标签等属性做规则召回,兜底策略的结果不需要通过ALS模型生成。
2. 全量数据集重新训练是否合理
完全合理,这是推荐系统上线的标准流程:
- 前期拆分数据集的核心目的是调参和评估模型的泛化能力,避免参数过拟合到训练集数据
- 参数验证有效后,使用全量交互数据训练可以让模型学习到所有用户、物品的交互特征,最终的推荐效果会优于仅在部分数据集上训练的模型,不存在额外的风险。
内容的提问来源于stack exchange,提问作者Ad Astra
相关产品推荐
相关产品推荐

