【实验】电商物品推荐
数据集来源
京东提供的订单信息,有这样几个文件:
- readme.utf8 描述其他几个文件的数据格式,以及字段含义
- trainingset.csv:训练集,共2303230条记录,大概有56w个items,131w个users
- validation1.csv:验证集,可以用于验证时的测试集,共20w个订单消息
- validation2.csv:验证集,用于验证validation1.csv中推荐的准确性,每个订单号都在validation1.csv中出现
- test1.csv:测试集,最终在这个文件上做模型的测试
实验中,使用trainingset中的数据训练模型,用validation1和validation2中的数据计算模型精确度。
LDA做推荐的实验
主要两种类型的实验,第一种是使用item-users来训练,第二种是使用items的名称和三级类目名称关键词当做标签来训练。
LDA训练采用GibbsLDA++-0.2工具。
item-users训练
潜语义模型一般用在找document和words之间topic的联系,是一种概率分布的估计,所以我考虑用item=document,users=words,看看能不能找出item和user之间的概率分布。
关于上述思路,完成了两组实验:
- 第一组:训练集每行代表一个item,由所有购买过此物品的userid组成
- 第二组:训练集中去掉了只出现过一次的user,以及去掉后为空的item
LDA训练参数为:
src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 100 -savestep 100 -twords 20 -dfile models/datajd_100/itemuser.dat
由于时间复杂度很高,因为计算准确率时只用了validation1中的10000条记录,Precision = 0.00811和0.0072448(好低,汗颜。。)
问题:
1、之前实验用的是item-user来训练,是否可以尝试一下user-item,或者user-order来训练
2、推断后计算KL距离的时间复杂度很高,这也是很重要的瓶颈,有什么解决方法?
tags训练
本来我的打算是对于item(或者order,user)用tags来表示,但是因为时间比较紧,所以先跳过了这个思路,而是采用lda作为itembase的补充,用来解决冷启动的问题。
主要完成了以下的实验:对sku名称和三级类别名称进行分词,去停用词,去只出现一次的词之后,简单作为tags.
(1)order-tags:
python tags_lda_model.py ------------ 生成lda的训练文件和推断文件
lda训练命令:
src/lda -est -alpha 0.1-beta 0.1 -ntopics 100 -niters 100 -savestep 101 -twords 20 -dfile /data/houlisha/recsys/models/order_tags/order_train.dat
lda推断命令:
src/lda -inf -dir /data/houlisha/recsys/models/order_tags/ -model model-final -niters 100 -twords 20 -dfile sku_valid_inf.dat
代码:
- recommend_lda_itembase.order.simple.py:简单选取kl距离最近订单中的9个物品推荐,precision=0.02910000001
- recommend_lda_itembase.order.cos.py:对kl距离最近的18个订单中的物品,计算cos距离推荐,precision=0.029133333333
- recommend_lda_itembase.order.maxsale.py:对kl距离最近的2*9个订单中的物品,选择销量最高的物品推荐,precision=0.0291222222
其他实验:
- topics num = 200 cos precision:0.029333333333333333
- topics num = 500 cos precision:0.029422222222222221
其他实验均采用cos距离来推荐。
(2)user-tags:
python tags_lda_model.py ------------ 生成lda的训练文件和推断文件
lda训练命令:
src/lda -est -alpha 0.1-beta 0.1 -ntopics 100 -niters 100 -savestep 101 -twords 20 -dfile /data/houlisha/recsys/models/user_tags/users_tags_train.dat
lda推断命令:
src/lda -inf -dir /data/houlisha/recsys/models/user_tags/ -model model-final -niters 100 -twords 20 -dfile users_tags_inf.dat
(3)item-tags:
python tags_lda_model.py ------------ 生成lda的训练文件和推断文件
lda训练命令:
src/lda -est -alpha 0.1-beta 0.1 -ntopics 100 -niters 100 -savestep 101 -twords 20 -dfile /data/houlisha/recsys/models/item_tags/items_tags_train.dat
lda推断命令:
src/lda -inf -dir /data/houlisha/recsys/models/item_tags/ -model model-final -niters 100 -twords 20 -dfile items_tags_inf.dat
代码:
recommend_lda_itembase.item.kl.py:对新出现的item,计算kl距离,推荐最近的9个物品,precision:0.02908888888
其他实验:
- topics num = 200时:0.0291777777778
- topics num = 500时:0.0292222222222
- topics num = 800时:0.029211111111111111
- topics num = 1000时:0.0290666666668
总结
直接说缺点吧:
- 代码写的不好,效率太低,缺乏逻辑性
- 偷懒!!!
后期工作准备学习一个开源的python推荐框架,看看别人写的源代码,多做一些实验。