Python+LightFM搭建自己的推荐系统

Python+LightFM搭建自己的推荐系统

前言

lightfm在github上有许多的开源项目,但其中大多数使用的是国外开源的movies作为自己的数据,并未对lightfm中使用的数据格式做出说明,很多人看着项目中的步骤想要修改为自己的数据去实现时,往往无从下手。博主花了一个星期的时间研究了一下这个框架,并想为正在一脸懵逼的小伙伴们提供一些帮助。

LightFM

简介

LightFM 是针对隐式和显式反馈的许多流行的推荐算法的 Python 实现,包括 BPR 和 WARP 排名损失的有效实现。它具备易用、快速(通过多线程模型估计)的特点,能够产生高质量的结果。
官方文档:[https://lyst.github.io/lightfm/docs/home.html]

安装

博主使用的是 win10+python3.5,lightfm安装直接 pip install lightfm,如果报错 error: Microsoft Visual C++ 14.0 is required 可以看一下这个文章(https://blog.csdn.net/qq_36441393/article/details/89216647)

数据介绍

一、介绍

首先,推荐系统的数据源分为隐式反馈和显示反馈,显示反馈就是rank数据,具体的评分(如3.0,5.0,1.0),这类数据在真实场景中比较少,很多公司甚至没有评分、评论数据,这时的推荐系统,只能依靠隐式数据(即不是明确的评级,可以是一次购买,一次浏览,一次点赞等等无法直接反馈用户对物品的评级的行为) 来实现推荐。针对显示数据,svd、svd++等矩阵分解的技术已经表现出极大的优势,而针对隐式反馈,可用的算法就显得少了很多,其中比较优秀的且可解释性较强的当属BPR(贝叶斯个性化排序)

二、过程

在lightfm中,我主要介绍正反馈的数据处理

  1. 首先,构建一个index为user、column为item的Dataframe,表格中的数据即user对item的评分(发生正反馈记为1,无行为记为0)
  2. 加载scipy中的csr_matrix模块(矩阵压缩模块)
  from scipy.sparse import csr_matrix
  1. 使用csr_matrix模块压缩第一步产生的dataframe,得到一个 sparse matrix 压缩矩阵
    data1 = csr_matrix(df)
    #压缩后的数据转化为array格式
    data1.toarray()
  2. 创建模型
model = LightFM()
 	 #LightFM(no_components=10, k=5, n=10, learning_schedule='adagrad', loss='logistic', learning_rate=0.05, rho=0.95, epsilon=1e-06, item_alpha=0.0, user_alpha=0.0, max_sampled=10, random_state=None)
 	 #no_components:user_embedding和item_embedding的长度
 	 #learning_schedule:学习率更新方式
 	 #earning_schedule:选择的损失函数('logistic','bpr','warp','k-os')
 	 #item_alpha、user_alpha:item和user因子数
 	 

5.训练模型

 model.fit(data1)
 #(self, interactions, user_features=None, item_features=None, sample_weight=None, epochs=1, num_threads=1, verbose=False)
 #interactions:参与训练的数据,格式为scipy.sparse.csr.csr_matrix
 #user_feature,item_feature:user和item的特征数据,格式为scipy.sparse.csr.csr_matrix
 #sample_weight:权重,shape为[users,items]
 #epochs:训练的次数,越大花费的时间越多
 #num_thresas:线程数
 #verbose:是否展示过程

6、使用

model.get_user_representations()
#获得user_biases和user_features 
model.get_item_representations()
#同上
model.predict_rank(data1)
#(test_interactions, train_interactions=None, item_features=None, user_features=None, num_threads=1, check_intersections=True)
#test_interactions:要预测的矩阵
#获得data1中每个user对每个item的预测得分,返回一个[users,items]大小的压缩矩阵,toarray()可以展示
model.predict(np.int(1),[1,2,3])
#(user_ids, item_ids, item_features=None, user_features=None, num_threads=1)
#对单个用户对某个商品(列表形式传入一个或多个商品index)的得分预测
model.user_embedding_gradients
#得到一个shape为[users,no_components]大小的矩阵,代表的是()
model.item_embedding_gradients
#同上,shape is [items,no_components]

7、工具
a、模型评估

from lightfm.evaluation import auc_score
auc_score(model,data1).mean()
#取auc均值,查看得分情况
b、数据拆分
from lightfm.cross_validation import random_train_test_split
#
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值