如何使用LightFM为仅持有评分数据的新用户生成推荐
LightFM新用户冷启动推荐实现方案
你遇到的ValueError核心原因是predict()和predict_rank()方法仅支持处理训练交互矩阵中已存在的用户ID,未收录的新用户没有预计算好的嵌入向量,无法直接调用原生接口。可按照以下步骤实现:
- 构造新用户嵌入向量
新用户嵌入可以通过其已交互物品的嵌入加权平均得到,权重使用用户给出的评分即可,也可以根据业务调整权重逻辑(比如仅取评分>3的正反馈物品计算平均)。参考代码:
import numpy as np # 从训练好的模型中取出物品嵌入、物品偏置 item_embeddings = model.item_embeddings.weight.detach().numpy() item_biases = model.item_biases.weight.detach().numpy() # 处理新用户的<book_id, 评分>配对数据 rated_book_ids = [pair[0] for pair in new_user_ratings] ratings = np.array([pair[1] for pair in new_user_ratings]) # 归一化权重,这里用评分减去全局平均评分做示例,可自行调整逻辑 normalized_weights = ratings - ratings.mean() # 加权平均得到新用户嵌入 new_user_emb = np.dot(normalized_weights, item_embeddings[rated_book_ids]) / len(rated_book_ids)
- 计算全量物品推荐得分
直接按照LightFM的预测逻辑自行计算得分,不需要调用原生predict接口:
# 得分计算公式:用户嵌入 · 物品嵌入 + 物品偏置 all_item_scores = np.dot(item_embeddings, new_user_emb) + item_biases.flatten()
- 过滤排序得到推荐结果
过滤掉新用户已经评分过的书籍,按得分倒序取TopN即可:
# 过滤已评分物品 mask = np.ones(all_item_scores.shape[0], dtype=bool) mask[rated_book_ids] = False filtered_scores = all_item_scores[mask] candidate_book_ids = np.arange(all_item_scores.shape[0])[mask] # 取Top10推荐 top10_book_ids = candidate_book_ids[np.argsort(-filtered_scores)[:10]]
若你训练模型时使用了用户特征矩阵,也可以直接构造新用户的特征向量,调用
get_user_representations()方法直接获取嵌入,无需手动加权计算:new_user_emb, _ = model.get_user_representations(features=new_user_feature_vec)
内容的提问来源于stack exchange,提问作者Serious
相关产品推荐
相关产品推荐

