推荐系统召回与评估

召回策略 基于协同过滤 基于item-based:相似的人会有相同的喜好基于user-based:喜欢一个物品的用户会喜欢相似的物品倒排索引 分类关键词topic...基于内容匹配 基于内容标签基于知识图谱...基于热门度评估指标 精确率:表示的是预测为正的样本中有多少是真正的正样本,例如我们给用户推荐了100条新闻,其中10条用户产生了点击,那么准确率为10/100 = 0.1召回率:表示的是样本中的正例有多少被预测正确了, 例如我们给用户推荐了100条新闻,其中10条用户产生了点击,而用户最终在平台上总共点击了200条新闻,那么召回率为10 / 200 = 0.05, 表示的是推荐系统推荐的那些符合用户兴趣并产生点击的新闻量占了用户实际总共点击的新闻 有多少比例

May 5, 2019 · 1 min · jiezi

go推荐系统项目介绍

近期想使用推荐系统实现一些功能,由于不懂Java,担心Python的性能不够,因此就关注了go语言实现的开源项目。推荐系统中的协同过滤算法原理协同过滤的原理很简单,就是根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性, 或者是发现用户的相关性,然后再基于这些关联性进行推荐这里主要实现了基于用户和基于项目的协同过滤两种推荐算法1基于用户的协同推荐(User based Collaborative Filtering Recommendation)基于用户协同推荐的原理是,根据所有用户对物品或者信息的偏好,发现当前用户口味和偏好相似的“邻居”用户群, 基于邻居的偏好信息,对用户进行推荐举例, 假设有以下关系A –> a,c 表示用户A喜欢物品a和cB –> bC –> a,c,d可以发现用户A和C的口味偏好相似(他们是邻居),同时C喜欢物品d,那么我们可以推断 用户A也可能喜欢物品dItem based Collaborative Filtering Recommendation基于项目的协同推荐基于项目的协同推荐的原理是,它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度, 然后根据用户的历史偏好信息,将类似的物品推荐给用户举例,假设有以下关系A –> a,cB –> a,b,cC –> a根据基于项目的协同过滤原理,可以发现物品a和物品c相似,用户C喜欢a物品,那么可以把c物品推荐给他在github上搜索,发现项目较少,较为完善的是gorse项目gorse: Go Recommender System Enginegorse使用go语言实现推荐系统,提供以下模块方便构建推荐系统:数据:支持从文件加载(提供内置部分数据可用于测试)分离器:支持K-fold、比率、保留方式分离数据集模型:推荐模型基于协同过滤算法,包括矩阵分解、基于临接的方法、Slope One、Co-Clustering2评估:可使用RMSE、MAE来评分,包括准确率、召回率、 归一化折损累积增益NDCG、平均准确率MAP、 MRR、AUC.参数搜寻:使用网格或随机方式寻找最佳超参持久化:保存模型或加载模型SIMD(可选):理论上在对矢量采用AVX2指令,可以获得比单指令快4倍的速度项目地址:github.com/zhenghaoz/gorse推荐项亮著的推荐系统实践 ↩实现推荐系统引擎(一):评分预测 ↩

April 1, 2019 · 1 min · jiezi

【机器学习PAI实战】—— 玩转人工智能之美食推荐

前言在生活中,我们经常给朋友推荐一些自己喜欢的东西,也时常接受别人的推荐。怎么能保证推荐的电影或者美食就是朋友喜欢的呢?一般来说,你们两个人经常对同一个电影或者美食感兴趣,那么你喜欢的东西就很大程度上朋友也会比较感兴趣。在大数据的背景下,算法会帮我寻找兴趣相似的那些人,并关注他们喜欢的东西,以此来给我们推荐可能喜欢的事物。场景描述某外卖店铺收集了一些用户对本店铺美食的评价和推荐分,并计划为一些新老客户推荐他们未曾尝试的美食。数据分析A B C D E F G H I J K0[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],1[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],2[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],3[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],4[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],5[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],6[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],7[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],8[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],9[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]横轴为美食品种,分为A–K 11中,竖轴为用户序号,有0-9 10个人。表内值为某个用户对某种美食的推荐分,0表示其未曾吃过,5分为最高的推荐分。以上数据为实验虚构数据。场景抽象化给定一个用户i,我们根据上面的数据为其推荐N个推荐分最高的美食。模型选择协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。我们也将采用协同过滤来实现商品推荐,并在下面的章节一步步实现基于协同过滤的商品推荐系统。数据处理以上数据,不存在缺失和无意义推荐分,即不超出范围,格式正确。搭建环境首先进入noteBook建模,链接然后创建新实例之后打开实例现在基础环境以及搞定了,我们可以用terminal安装自己需要的包环境。同时可以选择python2或者python3的开发环境。而且左侧的文件系统,支持本地文件的上传下载等。相似度计算在推荐系统中,我们需要计算两个人或商品的相似度,我们可以采用余弦相似度,皮尔逊相关系数等。余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,表示完全一样,而其他任何角度的余弦值都不大于1;并且其最小值是-1,相似度为0。皮尔逊相关系数( Pearson correlation coefficient),是用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。新建文件recom.py,实现相似度计算函数def cosSim(inA,inB): num = float(inA.T*inB) denom = la.norm(inA)la.norm(inB) return 0.5+0.5(num/denom)推荐分计算在文件recom.py,实现推荐分计算#dataMat 用户与美食的矩阵#user 用户序号#simMeas 相似度算法#item 美食商品def standEst(dataMat, user, simMeas, item): n = shape(dataMat)[1]#商品数 simTotal = 0.0; ratSimTotal = 0.0 for j in range(n):#所有商品,遍历 userRating = dataMat[user,j]#user对该商品的推荐分 if userRating == 0: continue#如果user 未推荐该商品则过滤 #logical_and逻辑与,nonzero非零判断,overLap为均为商品item,j推荐的用户 overLap = nonzero(logical_and(dataMat[:,item].A>0, \ dataMat[:,j].A>0))[0] if len(overLap) == 0: similarity = 0 #以此overLap,计算两商品的相似度。 else: similarity = simMeas(dataMat[overLap,item], \ dataMat[overLap,j]) print(’the %d and %d similarity is: %f’ % (item, j, similarity)) simTotal += similarity ratSimTotal += similarity * userRating if simTotal == 0: return 0 else: return ratSimTotal/simTotal对于特征向量非常稀疏,或者特征之间关联关系明显,协方差较大则需要对原有维度的特征进行降维。这样既可以节省资源加快运算,也可以避免冗余特征带来的干扰。def svdEst(dataMat, user, simMeas, item): n = shape(dataMat)[1] simTotal = 0.0; ratSimTotal = 0.0 U,Sigma,VT = la.svd(dataMat) #奇异值分解 Sig4 = mat(eye(4)*Sigma[:4]) #构建对角矩阵 xformedItems = dataMat.T * U[:,:4] * Sig4.I #数据维度转换 for j in range(n): userRating = dataMat[user,j] if userRating == 0 or j==item: continue similarity = simMeas(xformedItems[item,:].T,\ xformedItems[j,:].T) print(’the %d and %d similarity is: %f’ % (item, j, similarity)) simTotal += similarity ratSimTotal += similarity * userRating if simTotal == 0: return 0 else: return ratSimTotal/simTotal通过计算待推荐商品与已推荐商品的相似度,并乘以该用户对已推荐商品的推荐分,来计算待推荐商品的推荐分。在文件recom.py,加入recommend函数#dataMat 用户与美食的矩阵#user 用户序号#N 推荐前N个商品#simMeas 相似度计算算法#estMethod 推荐分计算算法def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst): #找出user未评分的商品 unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items if len(unratedItems) == 0: return ‘you rated everything’ itemScores = [] #依次计算这些商品的推荐分 for item in unratedItems: estimatedScore = estMethod(dataMat, user, simMeas, item) itemScores.append((item, estimatedScore)) #返回前N个较好分的结果 return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]算法演示如果是本地编辑的文件,可以通过文件上传方式上传到服务器。新建noteBook演示加载算法模板数据展示为序号为2的用户推荐商品总结通常在计算相似度之前,我们需要确定是计算基于商品的相似度(上面的方式),还是计算基于用户的相似度。在现实情况下,我们要根据用户和商品的数据决定选择哪种计算方式。同时,在数据量变大时,我们通常需要先降维,在做商品推荐。部分代码参考《机器学习实战》,本篇文章主要介绍如何使用PAI-DSW实现算法实验。本文作者:伊逍阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 13, 2019 · 2 min · jiezi

协同过滤推荐中利用SVD提高推荐的效果

1.什么是SVD :SVD指的是奇异值分解 SVD SVD的物理意义2.利用Python实现SVDfrom numpy import linalg as la# Numpy有一个称为linalg的线性代数工具,其中svd计算方法如下U,Sigma,VT = la.svd(dataMat)3.利用SVD提高效率生产实际中的数据比较稀疏,在生产中不管是基于用户的相似度计算还是基于物品的相似度计算都需要较多的时间和很多的计算力,通过SVD可以将映射到低纬空间中去4.基于SVD的评估方法Python实现(参考自机器学习实战)def svdEst(dataMat, user, simMeas, item): n = shape(dataMat)[1] simTotal = 0.0; ratSimTotal = 0.0 U,Sigma,VT = la.svd(dataMat)# numpy 的svd计算 Sig4 = mat(eye(4)*Sigma[:4]) #numpy.eye() 生成对角矩阵 # 机器学习实战的P264中代码对应的公式推导 https://blog.csdn.net/appleyuchi/article/details/82913217 xformedItems = dataMat.T * U[:,:4] * Sig4.I for j in range(n): userRating = dataMat[user,j] if userRating == 0 or j==item: continue similarity = simMeas(xformedItems[item,:].T,\ xformedItems[j,:].T) print ’the %d and %d similarity is: %f’ % (item, j, similarity) simTotal += similarity ratSimTotal += similarity * userRating if simTotal == 0: return 0 else: return ratSimTotal/simTotal其中计算按照奇异值能到达总能量的90% 计算;dataMat.T U[:,:4] Sig4.I 的推导请参见:推导 ...

January 1, 2019 · 1 min · jiezi

基于对象特征的推荐

(本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用)在上一期基于协同过滤的的推荐场景中,我们介绍了如何通过PAI快速搭建一个基于协同过滤方案的推荐系统,这一节会介绍一些如何基于推荐对象特征的推荐方法。首先看下整个业务流程图,这是一个基于对象特征的推荐场景的通用流程:首先把数据导入Maxcompute,有监督的结构化数据接着做特征工程,在特征工程环节主要做一些数据的预处理以及特征的衍生,特征衍生的作用是扩充数据维度,使得数据能更大限度的表示业务特点接着把数据通过拆分分成两份,一份通过分类算法生成二分类模型,另一份数据对模型效果进行测试最后通过评估组件得到模型效果一、业务场景描述通过一份真实的电商数据的4、5月份做模型训练生成预测模型,通过6月份的购物数据对预测模型进行评估最终选择最优的模型部署为在线http服务供业务方调用。本次实验选用的是PAI-Studio作为实验平台,仅通过拖拽组件就可以快速实现一套基于对象特征的推荐系统。本实验的数据和完整业务流程已经内置在了PAI首页模板,开箱即用:二、数据集介绍数据源:本数据源为天池大赛提供数据,数据按时间分为两份,分别是7月份之前的购买行为数据和7月份之后的。 具体字段如下:字段名含义类型描述user_id用户编号string购物的用户IDitem_id物品编号string被购买物品的编号active_type购物行为string0表示点击,1表示购买,2表示收藏,3表示购物车active_date购物时间string购物发生的时间数据截图: 三、数据探索流程本次实验选用的是PAI-Studio作为实验平台,仅通过拖拽组件就可以快速实现一套基于协同过滤的推荐系统,并且支持自动调参以及模型一键部署的服务。实验流程图:(1)特征工程在特征工程的流程中是把最原始的只有4个字段的数据通过特种工程的方法进行数据维度的扩充。在推荐场景中有两个方面特征,一方面是所推荐的对象的特征,另一方面是被推荐对象的特征。在商品推荐这个案例中:被推荐对象为商品(item),扩充的维度为每个item被购买量、每个item被点击量、每个item被点击购买率(购买量除以点击率)推荐对象为用户(user),扩充的维度为每个user总的购买量、总的点击量、总的点击购买率(点击数除以购买率,可以得出每点击多少次购买一个产品,可以用来描述用户购物的果断性)最终数据由原始的4个字段变成了10个字段:(2)模型训练现在已经构建了一个大宽表,有了做完特征工程的结构化数据,现在就可以训练模型了。这个案例中选用了逻辑回归算法,在做模型训练过程中有一个痛点就是如何找到合适的参数,对于逻辑回归参数(如下图)而言,如何调整以下几个参数,使得模型训练能达到最好的效果是一个非常有挑战的任务。为了解决繁琐的调参工作带来的劳动量问题,PAI产品内置了AutoML引擎帮助调参,在页面上打开AutoML,只要设置下需要调参的算法的参数范围以及评估标准,后台引擎即可在最小的资源消耗下找到最合理的参数,详见:(3)模型评估模型评估模块是用预留的一部分未参与模型训练的数据评估模型质量,通常推荐场景都是二分类实验,可以使用混淆矩阵和二分类评估组件去评估结果。二分类评估:打开组件选择“图表”,会展示下图ROC曲线,其中蓝色区域的面积为AUC值,面积越大表示模型质量越高混淆矩阵:通过混淆矩阵可以确定具体的预测准确率、召回率、F1-Score等指标(4)模型在线部署模型生成后,如果效果也达到预期,可以使用PAI-EAS将模型一键部署为在线服务,通过http访问。点击画布上的“部署”按钮,选择“模型在线部署”功能,选择需要部署的模型。后续流程可以参考在线预测文档:https://help.aliyun.com/document_detail/92917.html部署成在线服务之后,模型服务可以通过http请求访问,这样就可以做到模型跟用户自身的业务结合,完成PAI模型训练和业务应用的打通。本文作者:傲海阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 12, 2018 · 1 min · jiezi