召回-ALS(Alternating least Squares)-交替最小二乘

项目背景:使用星球联盟的每日必做

#准备数据

分类情况:

情况标签
仅曝光 未点击 未完成0
仅一次点击 未完成1
仅多次点击 未完成2
仅一次完成3
多次完成4

 

1.数据来源:

表mlg.xqlm_app_child_task,任务曝光数据

表mlg.xqlm_app_taskfinish_details 任务完成情况数据

2.sql语句,得到曝光表,点击表,完成表:

# SQL语句
# select passid as uid,dailytaskid  from mlg.xqlm_app_child_task where dt='2020-03-18' and pagetype='sy_2' and eventtype='1' and dailytaskid is not null
# select passid as uid,dailytaskid  from mlg.xqlm_app_child_task where dt='2020-03-18' and pagetype='sy_2' and eventtype='2' and dailytaskid is not null
# select uid,dailyid as dailytaskid  from mlg.xqlm_app_taskfinish_details where dt='2020-03-18' and dailyid is not null

3.数据预处理

data_0:仅曝光表count=1 且 点击表、完成表count为0

data_1:仅点击表count=1 且完成表count为0

data_2:仅点击表count>1 且完成表count为0

data_3:完成表count=1

data_4:完成表count>1

样本数量:

label 0|5589175|

label 2| 215338|

label 1| 423625| 

label 3|1646449| 

label 4|6606331| 

 

 

 

#模型训练

ALS.train(ratings, 20, 10, 0.01)

参数:

rank:20

inter:10

lambda:0.01

1) ratings : 评分矩阵对应的RDD。需要我们输入。如果是隐式反馈,则是评分矩阵对应的隐式反馈矩阵。

2) rank : 矩阵分解时对应的低维的维数。即PTm×kQk×n中的维度k。这个值会影响矩阵分解的性能,越大则算法运行的时间和占用的内存可能会越多。通常需要进行调参,一般可以取10-200之间的数。

3) iterations :在矩阵分解用交替最小二乘法求解时,进行迭代的最大次数。这个值取决于评分矩阵的维度,以及评分矩阵的系数程度。一般来说,不需要太大,比如5-20次即可。默认值是5。

4) lambda: 在 python接口中使用的是lambda_,原因是lambda是Python的保留字。这个值即为FunkSVD分解时对应的正则化系数。主要用于控制模型的拟合程度,增强模型泛化能力。取值越大,则正则化惩罚越强。大型推荐系统一般需要调参得到合适的值。

5) alpha : 这个参数仅仅在使用隐式反馈trainImplicit时有用。指定了隐式反馈信心阈值,这个值越大则越认为用户和他没有评分的物品之间没有关联。一般需要调参得到合适值。

从上面的描述可以看出,使用ALS算法还是蛮简单的,需要注意调参的参数主要的是矩阵分解的维数rank, 正则化超参数lambda。如果是隐式反馈,还需要调参隐式反馈信心阈值alpha 。

#实验结果

均方误差 = 0.015047

均方根误差 = 0.122666

##上线测试结果

 

优化改进:

测试结果显示,完成率和有曝光记录的人均完成任务数较小。这表明,很多用户对于曝光的任务一个也不感兴趣,一个也没完成。

原来的推荐思路是根据点击和完成情况进行数据的rating分类,经过ALS模型训练,根据预测的rating值排序,对用户进行推荐。

情况rating
仅曝光 未点击 未完成0
仅一次点击 未完成1
仅多次点击 未完成2
仅一次完成记录3
多次完成记录4

 

考虑了两点:

1.在用户历史行为中,有的用户从来就没有完成任务或者只是点击却并未完成。这样模型的预测结果 max(rating)<3 ,这样排序出来的列表,用户仍然是不感兴趣,并且不会做的。可以适当添加一些别的他没有见过的任务去探索一下他的兴趣点。

2.每日必做的模式是只有完成前3个任务,才会更新后面的任务,而且从有完成记录用户的人均任务完成数来看,平均每个用户的完成数是1到2个,所以应该思考如何提高前三个任务的完成率。

优化想法:

1.对于预测max(rating)<3的用户,不再根据任务的rating排序进行推荐。推荐列表的第3,6,9个位置设置为该用户从未被曝光过的任务,其余位置设置为训练数据中,完成率为topk的任务。

2.对于预测3<【(rating>3).count()】<9的用户,剩余位置用完成率topk的任务补充。

3.对于预测【(rating>3).count()】>=9的用户,仍然按照rating的排序来推荐。

 

 

 

 

#用户冷启动

根据完成情况统计,将完成率为topK的items推荐给新用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值