当前位置: 首页 > 后端技术 > Python

原理+代码|手把手教你用Python实现智能推荐算法

时间:2023-03-26 16:37:14 Python

来源:EarlyPython作者:Carrot推荐系统将成为未来十年最重要的变革社交网站将由推荐系统驱动---JohnRiedl明尼苏达大学教授01前言智能推荐与一般营销完全不同。后者是以向客户销售产品为最终目的;而智能推荐则以“客户需求”为导向,为客户带来价值。常见的比如淘宝的“Youmayalsolike”和亚马逊的“Userswhoboughtthisproductalsobought”就是例子。本文将详细介绍如何使用Python实现智能推荐算法,分为两部分:详细原理介绍Python代码实战02常见推荐系统及算法推荐系统常见分类有:基于应用领域:电商/社交交友等基于设计思路的推荐:基于协同过滤的推荐等基于使用数据:基于用户标签的推荐等“竞腾”合作构建用户画像和标签图谱常见的推荐算法有:本文将重点介绍最容易理解也非常经典的常用的基于关联规则的购物篮推荐。商品的相关性分析对于提高商品的生命力,挖掘消费者的购买力,促进销售的最大化都有很大的帮助。其建模理念是:同时购买的物品的模式反映了客户的需求模式,适用场景:无需个性化定制的场景;有销售记录的产品,推荐给老客户;包装设计和产品放置。03购物篮介绍Q:什么是购物篮?主要应用场景是什么?答:单个顾客一次购买的商品组合称为购物篮,是某位顾客本次的消费收据。常见场景:超市货架布局:互补互斥;包装设计。Q:购物篮的常用算法?答:不考虑购物顺序的常用算法:关联规则。购物篮分析实际上是一种因果分析。关联规则实际上是一种非常方便的发现两种商品之间关系的算法。相互促进的关系是指两者呈正相关关系,可以作为互补产品。比如豆瓣酱和大葱一起卖最好吃。替代品的概念是,如果我买了这个,我就不必再买另一个了。考虑购物的顺序:顺序模型。它主要用于电子商务。比如你今天把这个商品加入购物车,过几天再把另一个商品加入购物车,这是有先后顺序的。但很多实体店因为没有实名认证,无法记录用户的消费订单。问题:求补互斥对布局有什么用?答:根据关联规则计算商品之间的关联关系后,可能会发现商品之间存在三种关系:强关联、弱关联和排斥。每个清醒都有自己相应的布局。强关联:关联度的取值视实际情况而定,不同行业、业态不同。将相关性强的产品一起展示会增加双方的销售额。双向关联的产品在展示位置允许的情况下应该关联展示,即A产品旁边有B,B产品旁边必须有A,比如常见的剃须膏和剃须刀,男士发油和造型梳子;对于那些单向相关的产品,您只需要在相关产品旁边显示相关产品。例如,在一大瓶可乐旁边放一个纸杯,但不要在纸杯旁边放一大瓶可乐。毕竟,购买大可乐的消费者很可能需要纸杯,而购买纸杯的顾客再次购买大可乐的可能性较小。弱关联:可以尝试将关联度低的产品放在一起,分析关联度是否发生了变化。如果关联度明显增加,说明原来的弱关联可能是显示器造成的。排他关系:是指两种商品基本不会出现在同一张购物单上,这样的商品尽量不要放在一起展示。基于购物篮信息的商品相关性分析并不局限于上述三种关系,它们仅代表商品相关性分析的一个方面(可信度)。一个全面系统的商品关联分析,必须有三度的概念,包括支持度、可信度和推广度。04关联规则直接根据三个关联度定义的概念会很难理解,尤其是可信度和提升度中“谁对谁”的问题。其实可以换个角度看:规则X的支持度=规则X的交易??数/交易总数。理解:支持表示规则X是否通用。规则X的置信度(A??→B)=规则X的交易??次数/商品B在规则X中的交易次数。再次购买产品B。为了便于理解这些规则,我们用下面五个购物篮的例子来练习一下。不难发现,支持度的分母是5,也就是购物篮的个数,分子是选择这条规则中同时出现的所有商品。篮筐的次数。以A->D为例,有2个篮子同时包含A和D,交易总数(篮子总数)为5,所以规则A->D的支持度为2/5;装有商品A的篮子数量为3,而这三个篮子中,有两个装有商品D,因此该规则的置信度(可信度)为2/3。关于关联规则,我想补充以下两个问题:Q:只看support和confidence靠谱吗?答:我们来看一个案例:食堂卖米。1000条煮饭记录中,有800人次买米饭,600人次买牛肉,400人次一起买。然后我们可以得出规则(beef->Rice)Support=P(Beef&Rice)=400/1000=0.40;Confidence=P(Rice|Beef)=400/600=0.67Confidence和support都很高,但是它使得向买牛肉的人推荐米饭有意义吗?显然这没有任何意义。因为用户无条件购买米饭的概率:P(rice)=800/1000=0.8,已经大于在购买牛肉的前提下购买米饭的概率(0.67)。毕竟大米比牛肉好卖。这种情况引出lift的概念:lift=confidence/unconditionalprobability=0.67/0.8。当规则X(A→B)的推广度为n时:如果将B推荐给已经购买了A的客户,则该客户购买B的概率约为TA自然购买B的概率的n×100%。生活感悟:消费者通常很少单独购买桌角防撞海绵。他们可能只是偶尔或当他们的孩子遇到他们时才想到购买。如果我们在桌子(书桌、餐桌)的成功下单页面添加桌角防撞海绵推荐,可以大大增加防撞海绵的销量。这也符合我们通过畅销产品来推广相对不畅销产品的目的。问题:除了公式的含义,三个关联度(support,confidence,lift)之间有什么关系吗?答:可以这样理解:支持度代表这组相关产品的份额是否足够大。(客户购买后推荐)总比没用好(客户自然购买)。因此,1.0是提升程度的分界值。以刚才买米饭为例,不难理解,这种向买过牛肉的用户推荐米饭的风骚操作,推广度小于1。另外,两个置信度高的产品(假设100%表示它们总是成对出现),但如果支持度低(即份额低),那么对整体销量的提升也不会很大。05基于Apriori算法的Python实战由于Apriori等算法的研究已经非常成熟,我们在实战中使用Python时不需要一步步计算,直接调用已有的函数即可。主要是了解其背后的原理,以及不同算法的使用场景,比较优劣。探索性分析先导入相关库,进行数据探索性分析importpandasaspdimportnumpyasnpdf=pd.read_csv('bike_data.csv',encoding='gbk')df.info();df.head()数据参数说明OrderNumber:客户昵称LineNumber:采购订单,比如前三行分别代表同一客户购买的三款产品的订单Model:产品名称接下来我们看一下productprint(f"数据集中有{df['Model'].nunique()}种产品")model_names=df['Model'].unique()print("产品名称为:")#5aredisplayedinonelineforiinrange(0,len(model_names),5):print(model_names[i:i+5])让我们来看看这15个最畅销的产品,然后做一些简单的可视化top_15=grouped.sort_values(by='count',ascending=False).head(15)plt.figure(figsize=(8,6))sns.barplot(data=top_15,x='count',y='model')plt.grid(True)使用Apriori算法求解关联规则首先生成一个购物篮,并将同一客户购买的所有商品放入同一个购物篮,需要使用pipinstallApriori安装提前,然后我们使用Apriori包中的dataconvert函数。下面是需要传入的参数,说明arulesdata:Dataset--DataFrametidvar:"Classificationindex",即划分购物篮的标准。在本例中,它基于客户的OrderNumber——对象类型itemvar:要放入购物篮的内容。本例将数据集中的item,即Model列,放入basket--objectTypedata_type:默认选择'inverted',库中提供。注意:需要注意传入参数的类型,只要正确,直接套用也不难。importAprioriasapri#需要等待一段时间baskets=apri.dataconvert(arulesdata=df,tidvar='OrderNumber',itemvar='Model',data_type='inverted')#返回的购物篮是一个大列表,大列表中的每个小列表代表一个篮子#购物篮的个数刚好等于numberofcustomersinthedatasetQuantitytype(baskets),len(baskets)==df['OrderNumber'].nunique()#(list,True)现在查看前五个购物篮中的商品,现在生成关联规则.根据排列组合,我们可以知道这些交易会有21255×21254÷2那么多的关联规则,首先要满足支持度的要求,如果太小,直接删除,支持度degree可以根据关联规则的数量进行调整。如果关联规则较少,可以根据实际情况调整放宽支持要求。相关参数说明:+minSupport:最小支持度阈值+minConf:最小置信度阈值+minlen:最小规则长度+maxlen:最大规则长度,一般2就够了这里minSupport或minConf设置的越低,规则越多生成的计算越多,结果越大说明:以结果第一行为例+lhs:称为左手定则,通俗理解为用户购买的产品-山地车内胎+rhs:叫做右手定则,通俗理解是根据用户购买某产品后推荐的Anotherproduct-llmountainbiketire+support:support,山地车内胎和ll山地车外胎的概率同时出现在一个shoppingreceipt+confidence:confidence,boughtmountainbikeinnertubes的前提下,同时购买llmountaintires的概率+lift:如果你reco向购买过山地车内胎的客户推荐ll山地胎,该客户购买ll山地胎的概率大约是该客户自然购买ll山地胎的400%,即高出300%以上!现在我们筛选互补和互斥,代码如下#互补品#提升度首先要大于1,然后排序选择你要研究的前n个hubu=result[result['lift']>1].sort_values(by='lift',ascending=False).head(20)#Mutexhuchi=result[result['lift']<1].sort_values(by='lift',ascending=True).head(20)hubu.head(5)#结果也是合理的。让我们简要分析一下结果。不要期望每条规则都有意义,而是要结合商业思维。例如,赛道自行车和运动水壶相互排斥是很正常的。轻巧,为什么要水瓶……比如山地车配赛车公路车的运动头盔……互斥品成对出现!基于关联规则结果推荐产品需要结合业务需求,以获得最大的营销响应?--看置信度,越高越好销售最大化?--看推广程度,越高越好,用户没有消费过,我们向他推荐产品?#注意数据类型,frozenset,需要反汇编result['lhs'][1],type(result['lhs'][1])#(frozenset({'mountainbikeinnertube'}),frozenset)获得最高的目标营销响应率一位新客户刚刚订购了山地车英奇。如果他想获得最高的营销响应率,他应该在他的支付成功页面上推荐最多的产品是什么?目标:获得最高的营销响应率并最大化整体销售额。如果一个新客户刚刚下单了山地车产品,如果他想最大化整体销量,那么他应该在他的支付成功页面推荐什么产品呢?目标:销量最大化重申推广度通俗含义:推广度是相对于自然购买的,A对B的推广度理解为4.0如下:向购买A的用户推荐B,然后用户购买B的Probability是用户单独购买B的概率的400%(即自然购买)如果将B推荐给已经购买过A的用户,则用户购买B的概率比用户购买B的概率高300%单独购买B(即自然购买)%!用户没有消费,给他推荐了某款产品。最后总结一下,基于关联规则的Apriori算法是智能推荐领域最经典的应用之一。客户的数量和产生的数据,所以一般情况下最后都是采用混合推荐。至于更深层次的顺序模型和协同过滤,几乎没有人用Python或R来实现。大多使用Spark等分布式框架,后续会出相关文章。