全文链接:https://tecdat.cn/?p=35534
原文出处:拓端数据部落公众号
随着用户数量和项目数量的增加,数据的稀疏性成为影响推荐质量的重要因素。对此,本文帮助客户提出了一种基于混合SVD矩阵填充技术的协同过滤算法。
首先利用准确度指标找出SVD的最优参数和混合IBCF算法的最佳权重,然后使用SVD降维方法对原始的高维稀疏矩阵进行预测填充,最后使用IBCF在用户所属类中寻找目标用户最近邻并使用最佳权重合并结果产生推荐。该算法利用用户与项目之间的潜在关系克服了稀疏性问题,同时保留了可离线建模、可扩展性好等优点。
以母婴产品为例,通过分析母婴类产品,收集数据集构造母婴领域不同类型产品的特征向量。提取母婴类偏好系数不为0的用户为目标用户,通过用户访问的时间偏好来确定服务推荐的权重,计算其访问的母婴类与目标产品的特征向量的相似度来确定推荐产品的类型。最后,在购物平台上实践结果表明,该方法确实可提升用户的个性化推荐。
用户个性化需求解决方案设计
提高计算精度——优化 k 值, SVD 和 ItemCF 的合并。
目前协同过滤算法分为:基于物品(Item-based)的和基于用户(User-based)的,但是在实际商业应用中,User-based算法存在两个重大问题:
1. 数据稀疏性。一个大型的母婴类电子商务推荐系统一般有非常多的商品,用户可能买的其中不到1%的商品,不同用户之间买的商品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。
2. 算法扩展性。最近邻居算法的计算量随着用户和商品数量的增加而增加,不适合实际情况中商品数据量大的情况。
由于母婴类商品的相似性较高,不同商品具有比较固定的相似度,所以我们使用基于物品的协同过滤算法(IBCF)来进行推荐,在推荐过程中可以预先在线下计算好不同商品之间的相似度结果,然后把结果存在相似度表中,当推荐时进行表的查询,预测用户可能的偏好值,从而进行推荐。同时,由于母婴商品相似度高,当推荐过程的运算量比较大的时候,使用物品的一个小部分子集也可以得到高质量的预测结果。
基于物品的协同过滤算法(IBCF)是在计算邻居时采用物品本身,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。因此当物品和用户维度较高的时候,算法的运算量就会很大。
针对上述问题,Sarwar等人首次将SVD算法应用到协同过滤中[21],使用SVD方法将用户评分分解为不同的特征及这些特征对应的重要程度,利用用户与项目之间潜在的关系,用初始评分矩阵的奇异值分解去抽取一些本质的特征,降低数据维度来进行推荐,从而提高运算效率。
由于SVD算法中保留的维数k很重要,也不容易选取,k如果太小,容易失去原始数据中重要的信息,不能得到用户评分矩阵的重要结构,k如果选大了,达不到降维的目的,而且容易过拟合训练数据,因此测试数据时需要先对k的取值进行优化,选取最优的k值然后再进行实验。
更客观的评价用户对商品的兴趣——用户行为权重、用户遗忘曲线
本文首先根据用户的不同行为(bhv)定义偏好权重,行为: "投诉" 、"下单"、 "商品浏览" 、"商品加入购物车" 、"评论"分别对应偏好分值-1、4、3、2、3。
然而传统的推荐基于用户兴趣是固定不变的假设,即用户兴趣不随时间的变化而改变,因此,这些方法不能反映用户兴趣的变化。同时,被推荐的资源(产品)往往具有时效性,用户的兴趣也往往随时间的不同而变化。
针对以上问题,为了满足用户的个性化需求,我们提出了基于时间加权的协同过滤算法,考虑了时间对推荐质量的影响,认为用户兴趣随时间的流逝而衰减,即某个用户感兴趣的资源最可能和他近期访问过的资源相似。
其中,艾宾浩斯遗忘曲线可以较好的描述用户浏览商品和遗忘的过程。它认为当用户浏览商品时,商品信息输入大脑后,遗忘也就随之开始了。遗忘率随时间的流逝而先快后慢,特别是在刚刚识记的短时间里,遗忘最快。遵循艾宾浩斯遗忘曲线所揭示的记忆规律,对所浏览的商品及时进行推荐,可以提升用户的个性化推荐。
用户购买周期性问题解决——惩罚上一周购买
然而,常常存在这样一种现象,用户往往在根据自己的兴趣爱好购买了商品之后,一段时间内会对所购买物品相似的物品产生“疲倦期”,会更加趋向于选择与以前购买过的商品较为相异的那些新商品进行购买。从本质上讲,这种情况往往发生在作为用户短期兴趣的资源上,这样的用户兴趣会随时间的接近而衰减。因此,如果能有效识别出用户的短期兴趣,在预测用户最感兴趣的资源时加以考虑,区分不同时间对推荐的不同影响,可以提升用户的个性化推荐。
算法设计
结合上一章的用户个性化解决方案,本文提出算法的具体步骤描述如下:
第一步: 计算用户偏好。
本文首先根据用户的不同行为(bhv)定义偏好权重,然后根据用户行为距今的时间差对用户的偏好进行权重调整,其中权重的计算使用艾宾浩斯(H.Ebbinghaus)遗忘率,并且计算得到最终的用户行为偏好。
第二步: 利用 SVD 对原始的稀疏矩阵进行平滑,填补缺失值。
第三步: 在测试集上对用户评分进行预测
接下来,算法具备良好的可扩展性根据用户a与其最近邻的相似度,本文采用经典的最近邻预测算法预测a对未知项目的评分
评估数据集和度量标准
随着电商行业的迅猛发展,母婴类购物平台异军突起,进入高速发展期,为妈妈们提供了母婴产品、母婴健康、交流交友等相关的服务和帮助,拥—个数量相当可观的消费群体。因此,我们试图在母婴电商平台中引入推荐系统,从而满足尽可能多的用户个性化推荐的需求。
本章选取母婴用户数据作为实验数据集。该数据集为一个月的用户评分数据,包含8989个用户对 6958个商品的评分记录 151400条。用户评分值介于 1到199 之间,评分间隔为 1,数值越大,说明用户对商品的喜爱程度越高,反之,说明用户对商品兴趣度不高。 数据集示例如图所示。 实验中随机抽取用户评分数据集的 80%作为训练集,其余 20%作为测试集。
数据集描述
变量 | 描述 | 变量类型 |
---|---|---|
DeviceIdentity | 用户id | 名义变量 |
SKUId\_All | 商品id | 名义变量 |
is\_temai | 是否特卖商品 | 名义变量 |
bhv\_type | 用户行为类型 | 名义变量 |
bhv\_cnt | 行为数量 | 数值变量 |
bhv\_datetime | 行为时间 | 日期变量 |
评分预测的预测准确度一般通过平均绝对误差 (MAE)、根方误差(RMSE)等计算,平均绝对偏差越小,预测的准确度越高。
结果
(1)SVD算法参数k的设定
SVD算法中保留的维数k很重要,也不容易选取,k如果太小,容易失去原始数据中重要的信息,不能得到用户评分矩阵的重要结构,k如果选大了,达不到降维的目的,而且容易过拟合训练数据,本节利用测试集数据先对k的取值进行优化,选取最优的k值然后再进行实验。
k与MAE、RMSE、MSE的变化关系如图所示,图中了显示奇异值分解方法中不同维数k下的运行结果,实验中k的取值从5到225,步长为20,分别计算不同k水平下各个指标,选取指标最小时的k值作为最优值。从结果中我们可以看出,当k=45时,平均绝对误差(MAE)最小,所以对于这个数据集,维数k=45是最佳的。所以,在后续采用基于SVD算法的协同过滤算法的试验中我们选取k=45。
(2) 最优权重的选择
function( k){
# cofi_rec <- Recommender(
# data=ratings_train,
# method="svd", param=list(k = k))
# cofi_rec_pred <- predict(
# cofi_rec,
# ratings_test_known ,
# type='ratings',n = 20)
# cofi_rec_pred_acc <- calcPredictionAccuracy(
# cofi_rec_pred,
# ratings_test_unknown )
# cofi_rec_pred_acc
# }
#
# k=seq(5,150,by = 10)
# time=0
# RMSE=0
# MSE=0
# MAE=0
# for(i in 1:length(k)){
# time[i]=system.time(recomres<-mclapply( k[i], ratingsrecsvd))
# RMSE[i]=recomres[[1]][1]
# MSE[i]=recomres[[1]][2]
# MAE[i]=recomres[[1]][3]
Recommender(
Recommender(ratings_train, method = "SVD", param=list(274)),
Recommender(ratings_train, method = "IBCF") ,
weights = c(.8, .2)
)
为了得到最优推荐结果,首先应得到最优SVD和IBCF的混合权重。我们将从0.5开始每递增0.1直到0.9为止,利用用户-项目评分矩阵,分别计算调整对应算法的预测精度MAE、RMSE、MSE值。实验结果如图所示。从结果来看当取0.8的时候具有最高的准确度。因此,下文使用SVD的混合权重为0.8。
ROC性能比较
为了验证本文所提出的算法的性能,将传统的推荐算法和本文提出的基于SVD的协同过滤的算法(SVD approximation)进行TOP-N实验比对。其中,使用SVD对用户-项目评价矩阵降低稀疏程度时使用上述实验得到的45作为最佳维度。实验指标使用ROC曲线性能。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛。
在测试数据集上,这五种方法在不同近邻个数上的ROC性能表现如图5所示,其中横坐标为FPR,纵坐标是TPR值。
在图中,曲线random item代表随机推荐算法,曲线popular item代表热门物品推荐算法,曲线user-based cf代表基于用户的协同过滤算法,曲线item-based cf代表基于物品的协同过滤算法,曲线SVD approximation代表基于SVD矩阵分解的协同过滤算法。
由图可以看到基于SVD矩阵分解的协同过滤算法在ROC指标上要优于其他算法。
精确度指标比较
在接下来的精确度实验中,我们选择SVD算法与其他算法在MAE、RMSE、MSE指标上进行比较。实验结果如图所示。
横轴代表不同的推荐精确度衡量指标,包括MAE、MSE和RMSE。其中,每个指标对应的条形图分别为IBCF、SVD、RANDOM和POPULAR对应的指标函数值。
SVD算法与其他算法相比,在不同的精确度指标下表现较好,即新算法在推荐质量上有所改善,有效地提升了推荐精度。
结论与展望[]()
本文在传统协同过滤的基础上对用户个性化推荐需求进行了研究,将SVD、时间权重等方法应用到传统推荐算法中,给出了几个改进的算法,并且在母婴数据集上进行了相关实验。主要研究工作如下:
1、将SVD应用到传统协同过滤算法中,提出了基于SVD的项目推荐算法,在一定程度上缓解了数据稀疏性问题。同时,提高了算法的推荐速度,在实际应用中,提升了用户的个性化推荐。
2、针对用户对近期已购物品的购买倾向产生的“疲倦”问题。本文提出对近期购买物品的偏好进行惩罚的思想,并且结合艾宾浩斯遗忘曲线函数对用户的偏好进行加权,提出了时间权重的SVD推荐算法。实验结果表明,该算法在缩短了算法的执行时间的同时提高了用户的个性化推荐。
3、使用混合推荐的方法将SVD和IBCF的推荐结果根据最优权重来合并。基于混合推荐的优化协同过滤算法既保证了SVD在数据极端稀疏的情况下可以获得更好的推荐质量,又兼顾了IBCF可以考虑相似物品的特征。该算法在不同的测试标准及不同数据集上的执行效果将作进一步的研究。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。