当前位置:   article > 正文

【机器学习项目实战】Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐_电子商务网站用户行为分析的实验目的

电子商务网站用户行为分析的实验目的

说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。

1.项目背景

      电子商务网站数量迅速上升,将电子商务网站浏览者变为实际消费者,满足消费者需求,通过不同形式提升消费者忠诚度是各电子商务网站面临的首要问题。在此背景下研究具有个性化特征的电子商务推荐服务具有重要意义。

      智能推荐服务是提高电子商务网站销售转化率的重要技术手段之一。它与传统的搜索技术有着重要的区别,智能推荐服务能够更加精准地提供信息,节省用户找寻信息的时间,提高找寻信息的准确度。通过建立智能推荐系统提高服务效率,帮助消费者节约时间成本,帮助企业制定有针对性的营销战略方案,促进企业长期、稳定、高速发展。

      本项目通过对用户访问的网页日志数据进行分析与处理,采用基于物品的协同过滤算法对处理后的数据进行建模分析,并应用模型实现智能推荐,进行个性化推荐,帮助用户更加便捷地获取信息。

2.项目目标

       某法律网站是某地一家电子商务类的大型法律资讯网站,致力于为用户提供丰富的法律信息与专业咨询服务,本项目主要是为律师与律师事务所提供互联网整合营销解决方案。

        随着企业经营水平的提高,其网站访问量逐步增加,随之而来的数据信息量也在大幅增长。带来的问题是用户在面对大量信息时无法快速获取需要的信息,使得信息使用效率降低。用户在浏览、搜寻想要的信息的过程中需要花费大量的时间,这种情况的出现造成了用户的不断流失,对企业造成巨大的损失。

       为了节省用户时间并帮助用户快速找到感兴趣的信息,利用网站海量的用户访问数据研究用户的兴趣偏好,分析用户的需求和行为,引导用户发现需求信息,将长尾网页准确地推荐给所需用户,帮助用户发现他们感兴趣但很难发现的网页信息。总而言之,智能推荐服务可以为用户提供个性化的服务、改善用户浏览体验、增加用户黏性、从而使用户与企业之间建立稳定的交互关系,实现客户链式反应增值。

3.项目流程说明

       随着互联网领域的电子商务、上线服务、线上交易等网络业务的普及,大量的信息聚集起来形成海量信息。用户想要从海量信息中快速准确地找到感兴趣的信息变得越来越困难,尤其在电子商务领域问题更加突出。信息过载的问题已经成为互联网技术中的一个重要难题,同时也催生出许多新技术。搜索引擎的诞生就是为了解决这个问题,用户输入关键词,搜索引擎就会返回给用户与输入的关键词相关的信息。但是在用户无法准确描述需求时,搜索引擎就无能为力了。

       与搜索引擎不同,推荐系统并不需要用户提供明确的需求,它是通过分析用户的历史行为,从而主动推荐给用户能够满足他们兴趣和需求的信息。因此,对于用户而言,推荐系统和搜索引擎是两个互补的工具。搜索引擎满足有明确需求的用户,而推荐系统能够帮助用户发现感兴趣的内容。在电子商务领域中,推荐技术可以起到以下作用:

  1. 帮助用户发现其感兴趣的物品,节省用户时间、提升用户体验。
  2. 提高用户对电子商务网站的忠诚度。推荐系统能够准确地发现用户的兴趣点,并将合适的资源推荐给用户,用户容易对该电子商务网站产生依赖,从而提升用户与网站之间的黏性。

为了解决上述问题,结合本项目提供的原始数据情况,可以分析如下内容:

  1. 按地域分析用户访问网站的时间、访问内容、访问次数等主题,了解用户的浏览行为和感兴趣的网页内容。
  2. 根据用户的访问记录对用户进行个性化推荐服务。

4.项目步骤与流程

       为了帮助用户从海量的信息中快速发现感兴趣的网页,本项目主要采用协同过滤算法进行推荐,其推荐原理如图所示。

       由于用户访问网站的数据记录较多,若不进行分类处理直接采用协同过滤算法进行推荐,会存在以下问题:

  1. 数据量大说明物品数与用户数较多,在模型构建用户与物品的稀疏矩阵时,模型计算需要消耗大量的时间,并且会造成设备内存空间不足的问题。
  2. 不同的用户关注的信息不同,其推荐结果不能满足用户的个性化需求。

       为了避免上述问题,需要对用户访问记录进行分类处理与分析,如下图所示。在用户访问记录日志中,没有用户访问网页时间长短的记录,不能根据用户在网页的停留时间判断用户是否对浏览网页感兴趣。本项目采用基于用户浏览网页的类型的方法进行分类,然后对每个类型中的内容进行智能推荐。

        采用上述分析方法与思路,结合原始数据及分析目标,整体的网站智能推荐流程如图所示,主要步骤如下:

  1. 从系统中获取用户访问网站的原始记录。
  2. 分析用户访问内容、用户流失等。
  3. 对数据进行预处理,包含数据去重、数据变换等过程。
  4. 以用户访问html后缀的网页为关键条件,对数据进行处理。
  5. 对比多种推荐算法的效果,选择效果较好的模型。通过模型预测,获得推荐结果。

5.数据获取

       以用户的访问时间为条件,选择3个月内(2015年2月1日至2015年4月29日)用户的访问数据作为原始数据集。由于每个地区的用户访问习惯以及兴趣爱好存在差异性,因此抽取某地区的用户访问数据进行分析,其数据量总共有837450条,其中包括用户号、访问时间、来源网站、访问页面、页面标题、来源网页、标签、网页类别、关键词等。

      在数据抽取过程中,由于数据量较大且存储在数据库中,为了提高数据处理的效率,采取用Python读取数据库的操作方式。本项目用到的数据库为开源数据库(Mysql)。安装数据库后导入本项目的数据原始文件data.sql,然后可以利用Python对Mysql数据库进行连接以及其它相关操作。

       首先在Mysql中创建test数据库,然后把数据导入数据库,最后连接数据库并选取3个月内用户的访问数据,关键代码如下:

6.探索性数据分析

       原始数据集中包括用户号、访问时间、来源网站、访问页面、页面标题、来源网页、标签、网页类别和关键词等信息,需要对原始数据进行网页类型、点击次数、网页排名等各个维度的分布分析,了解用户浏览网页的行为及关注内容,获得数据内在的规律。

6.1分析网页类型

对原始数据中用户点击的网页类型进行统计分析,关键代码如下:

 网页类型统计:

        通过上表可以发现,点击与咨询相关(网页类型为101,http://www.****.cn/ask/)的记录占了49.16%,其他类型(网页类型为199占比24%左右,知识相关(网页类型为107,http://www.****.cn/info/)占比22%左右。

       根据统计结果对用户点击的网页类型进行排名,依次为咨询相关、知识相关、其他方面的网页、法规(类型为301)、律师相关(类型为102)等。然后进一步对咨询类别内部进行统计分析,关键代码如下:

知识类型内部统计如下表:

        通过上表可以发现,浏览咨询内容页(101003)记录最多,其次是咨询列表页(101002)和咨询页(101001)。初步分析可以得知用户都喜欢通过浏览问题的方式找到自己需要的信息,而不是以提问的方式或者查看长篇内容的方式寻找信息

       首先是网址中带有lawfirm关键字的对应律师事务所,其次是带有ask/exp、ask/online关键字的对应咨询经验和在线咨询页。大多数用户浏览网页的情况为咨询内容页、知识内容页、法规专题页、在线咨询页,其中咨询内容页和知识内容页占比最高。

对原始数据的网址中带有”?”的数据进行统计,关键代码如下:

带”?”字符网址类型统计表:

        通过上表可以看出,网址中带有”?”的记录一共有65492条,且不仅仅出现在其他类别中,同时也会出现在咨询内容页和知识内容页中,但在其他类型(1999001)中占比最高,可达到98.82%。因此需要进一步分析其他类型内部的规律,关键代码如下: 

      通过上表可以看出,在1999001类型中,标题为”快车-律师助手”这类信息占比为77.09%,这类页面是律师的登录页面。标题为”咨询发布成功”类信息占比为8.07%,这类网页是自动跳转页面。其他类型的页面大部分为http://www.***.cn/ask/question_3814988.html?&from=androidqq类型的网页。根据业务了解该网页为被分享过的网页,这类网页需要对其进行处理,处理方式为截取网址中”?”前面的网址并还原网址类型。

       在采取截取网址”?”前面网址的处理过程中发现,快搜网址中的类型混杂,不能直接处理。考虑其数据集占比较小,所以在数据处理环节对这部分数据进行删除。同时分析其他类型的网址得出,不包含主网址和关键字的网址有359条记录,http://www.baidu.com/link?。

       访问记录中有一部分用户并没有点击具体的网页,这类网页以”.html”后缀结尾,且大部分是目录网页,这样的用户可以称为”瞎逛”,漫无目的,总共有165654条记录,关键代码如下:

无目的浏览用户点击分析:

       通过上表可以看出,小部分网页类型是与知识、咨询相关的,大部分网页类型是与地区、律师和事务所相关的,这类用户可能是找律师服务的,也可能是”瞎逛”的。

   综合以上分析,得到一些与分析目标无关数据的规则,记录这些规则有利于在数据清洗阶段对数据进行清洗操作。

  1. 咨询发布成功页面。
  2. 中间类型网页(带有midques_关键字)。
  3. 网址中带有”?”类型,无法还原其本身类型的快搜网页。
  4. 重复数据(同一时间同一用户,访问相同网页)。
  5. 其他类别的数据(主网址不包含关键字)。
  6. 无点击”.html”行为的用户记录。
  7. 律师的行为记录(通过快手-律师助手判断)。

6.2分析网页点击次数

统计原始数据中用户浏览网页次数的情况,关键代码如下: 

统计结果如下表所示,浏览一次的用户最多,占所有用户的58%左右。

分析浏览次数为一次的用户,关键代码如下:

 浏览一次的用户的分析行为:

        从上表可以看出,问题咨询页占比为77.76%,知识页占比为14.74%,这些记录均是通过搜索引擎进入的。由此分析得出两种可能:

  1. 用户为流失用户,在问题咨询与知识页面上没有找到相关的需要。
  2. 用户找到其需要的信息,因此直接退出。

      综合这些情况,将点击一次的用户行为定义为网页的跳出率。为了降低网页的跳出率,就需要对这些网页进行针对用户的个性化推荐,以帮助用户发现其感兴趣的网页或者需要的网页。

统计浏览次数为一次的用户浏览的网页的总浏览次数,关键代码如下:

点击一次用户浏览网页统计:

       从上表可以看出,排名靠前的都是知识与咨询页面,由此猜测大量用户的关注点在知识或咨询方面上。

7.数据预处理

       本项目通过数据探索发现知识类王爷的额浏览次数在全部类型的网页中占比较高,仅次于资讯类和其他类。而知识类网页中的婚姻类网页是较为热门的网页,故本项目选取婚姻类网页进入模型进行推荐。

       当对原始数据进行探索分析时,发现存在与分析目标无关的数据和不符合建模输入要求的数据,即构建模型需要预处理的数据,需要对此类数据进行数据清洗、数据去重、数据变换以及特征选取等操作,以使数据满足构建推荐系统模型的输入要求。

通过以下4个步骤对数据进行预处理,其流程如下图所示。

  1. 清除通过数据清洗将数据探索分析过程中发现的与目标无关的数据。
  2. 识别翻页的网址,并对其进行还原,然后对用户访问的网页进行去重操作。
  3. 筛选掉浏览网页次数不满两次的用户。

将数据集划分为训练集与测试集。

7.1删除不符合规则的网页

       通过分析原始数发现,不符合规则的网页包括中间页面的网址、咨询发布成功页面、律师登录助手页面等,需要对其进行处理删除,关键代码如下:

结果如下:

       清洗后数据仍然存在大量的目录网页(可理解为用户浏览信息的路径),这类网页不但对构建推荐系统没有作用,反而会影响推荐结果的准确性,同样需要处理。

7.2还原翻页网址

       本项目主要对知识相关的网页类型数据进行分析。处理翻页情况最直接的办法使将翻页的网址删掉,但是用户通过搜索引擎进入网站的,访问入口不一定是原始网页,采取删除方法会损失大量有效数据,影响推荐结果。因此对该类网页的处理方式是:首先识别翻页的网址,然后对翻页的网址进行还原,最后针对每个用户访问的网页进行去重操作,关键代码如下:

结果如下:

7.3筛选浏览次数不满两次的用户

        根据数据探索的结果可知,数据中存在大量仅浏览一次就跳出的用户,浏览次数在两次及以上的用户的浏览记录更适于推荐,而浏览次数仅一次的用户的浏览记录进入推荐模型会影响推荐模型的效果,因此需要筛选去除浏览次数不满两次的用户,关键代码如下:

 结果如下:

7.4划分数据集

  将数据集按8:2的比例划分为训练集和测试集,关键代码如下:

 结果如下:

8.构建智能推荐模型

       推荐系统是解决信息过载的有效手段,也是电子商务服务提供商提供个性化服务的重要信息工具。在实际构造推荐系统时,并不是采用单一的某种推荐方法进行推荐。在大部分推荐系统都会结合多种推荐方法将推荐结果进行组合,最后得出最优的推荐结果。在组合推荐结果时,可以采用串行或者并行的方法。

8.1基于物品的协同过滤算法的基本概念

       本项目基于物品的协同过滤系统的一般处理过程,分析用户与物品的数据集,通过用户对物品的浏览与否(喜好)找到相似的物品,然后根据用户的历史喜好,推荐相似的物品给目标用户。下图是基于物品的协同过滤推荐系统图:

从图中可知

用户1喜欢物品A和物品C;

用户2喜欢物品A、物品B和物品C;

用户3喜欢物品A。

      从这些用户的历史喜好可以得出物品A和物品C时比较类似的,喜欢物品A的人都喜欢物品C,基于这个数据可以推断用户3很有可能也喜欢物品C,所以系统会将物品C体检给用户3。

    根据协同过滤的处理过程可知,基于物品的协同过滤算法(简称ItemCF算法)主要分为2个步骤:

  1. 计算物品之间的相似度。
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表。

       其中,关于物品相似度计算的方法有夹角余弦、杰卡德(Jaccard)相似系数和相关系数等。

       将用户对某一个物品的喜好或者评分作为一个向量,例如,所有用户对物品1的评分或者喜好程度表示为A1=(x11,x21,x31,…xn1),所有用户对物品M的评分或者喜好程度表示为Am=(x1m,x2m,x3m,…xnm),其中m为物品,n为用户数。采用下述几种方法计算两个物品之间的相似度,其计算公式如下表所示。由于用户的行为是二元选择(0-1型),因此本项目在计算物品相似度的过程中采用杰卡德相似系数法。 

在协同过滤系统中发现用户存在多种行为方式,如是否浏览网页,是否有购买、评论、评分、点赞等行为,若采用统一的方式表示所有行为是困难的,因此只对具体的分析目标进行具体表示。本项目原始数据只记录了用户访问网站的浏览行为,所以用户的行为是浏览网页与否,不存在购买、评分和评论等用户行为。

计算各个物品之间的相似度之后,即可构成一个物品之间的相似度矩阵,如下表所示。通过相似度矩阵,推荐算法会给用户推荐与其物品最相似的K个的物品。

相似度矩阵

       如下公式度量了推荐算法中用户对所有物品的感兴趣程度。其中R代表了用户对物品的兴趣,sim代表了所有物品之间的相似度,P为用户对物品感兴趣的程度。由于本项目中用户的浏览行为是二元选择(是与否),所以用户对物品的兴趣R矩阵只存在0和1.

       推荐系统是根据物品的相似度以及用户的历史行为对用户的兴趣度进行预测并推荐的,在评价模型的时候一般是将数据集划分成训练集和测试集两部分。模型通过在训练集的数据上进行训练学习得到推荐模型,然后在测试集上数据进行模型预测,最终统计出相应的评测指标来评价模型预测效果的好与坏。

       模型的评测采用的方法是交叉验证法。交叉验证法即将用户行为数据按照均匀分布随机分成M份(本项目M取10),挑选一份作为测试集,将剩下的M-1份作为训练集。然后在训练集上建立模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。为了保证评测指标不是过拟合的结果,需要进行M次实验,并且每次都使用不同的测试集。最后将M次实验测出的评测指标的平均值作为最终的评测指标。

       基于协同过滤推荐算法主要包括两个部分:基于用户的协同过滤推荐和基于物品的协同过滤推荐。结合实际的情况分析判断,选择基于用户的协同过滤推荐算法进行推荐,构建模型的流程如下图所示: 

         其中训练集与测试集是通过交叉验证的方法划分后的数据集。通过协同过滤算法的原理可知,在建立推荐系统时,建模的数据量越大越能消除数据中的随机性,得到的推荐结果越好。其弊端在于数据量越大模型建立以及模型计算耗时越久。

8.2基于物品的协同过滤算法的优缺点

基于物品的协同过滤算法的优缺点如下所示;

(1)优点

      可以离线完成相似度步骤,降低了在线计算量,提高了推荐效率;并利用用户的历史行为给用户做推荐解释,结果容易让客户信服。

(2)缺点  

       现有的协同过滤算法没有充分利用到用户间的差别,使计算得到的相似度不够准确,导致影响了推荐精度;此外,用户的兴趣是随着时间不断变化的,算法可能对用户新点击兴趣的敏感性较低,缺少一定的实时推荐,从而影响了推荐质量。

基于物品的协同过滤适用于物品数明显小于用户数的情形,如果物品数很多,会导致计算物品相似度矩阵代价巨大。

8.3模型构建

       将训练集中的数据转换成0-1二元型数据,使用ItemCF算法对数据进行建模,并给出预测推荐结果,关键代码如下:

       通过基于协同过滤算法构建的推荐系统,婚姻知识类网址得到了针对每个用户的推荐,部分结果如下表所示:

        从上表可知,根据用户访问的相关网址对用户进行推荐。但是其推荐结果存在”NaN”的情况。这种情况是由于当前的数据集中,访问该网址的只有单独一个用户,因此在协同过滤算法中计算它与其他物品的相似度为0,所以就出现了无法推荐的情况。一般出现这样的情况,在实际中可以考虑使用其他非个性化的推荐方法进行推荐,例如,基于关键字、相似行为的用户进行推荐等。

9.模型评价  

       推荐系统的评价一般可以从以下几个方面整体进行考虑。

1)用户、物品提供者、提供推荐系统网站。

2)好的推荐系统能够满足用户的需求,推荐其感兴趣的物品。并且在推荐的物品中,不能全部都是热门物品,同时也需要用户反馈意见以帮助完善其推荐系统。

       因此,好的推荐系统不仅能预测用户的行为,而且能帮助用户发现可能会感兴趣但却不易被发现的物品;同时,推荐系统还应该帮助商家将长尾中的好商品发掘出来,推荐给可能会对它们感兴趣的用户。

       在实际应用中,评测推荐系统对三方的影响是比不可少的。其评测指标主要来源于如下3种评测推荐效果的实验方法,即离线测试、用户调查和在线实验。

(1)离线测试

       离线测试是通过从实际系统中提取数据集,然后采用各种推荐算法对其进行测试,以获取各个算法的评测指标。这种实验方法的好处是不需要真实用户参与。

      注意:离线测试的指标和实际商业指标存在差距,比如预测准确率和用户满意度之间就存在很大差别,高预测准确率不等于高用户满意度。所以当推荐系统投入实际应用之前,需要利用测试的推荐系统进行用户调查。

(2)用户调查  

       用户调查是利用测试的推荐系统调查真实用户,观察并记录他们的行为,并让他们回答一些相关的问题。通过分析用户的行为和他们反馈的结果,判断测试推荐系统的好坏。

(3)在线测试  

       在线测试,顾名思义就是直接将系统投入到实际应用中,通过不同的评测指标比较不同的推荐算法的结果,比如点击率、跳出率等。

       由于本案中的模型是采用离线的数据集构建的,因此在模型评价阶段采用离线测试的方法获取评价指标。在电子商务网站中,用户只有二元选择,如喜欢与不喜欢、浏览与否等。针对这种类中的数据预测,就要使用分类准确度,其中,评测指标有准确率(P,precesion),它表示用户对一个被推荐产品感兴趣的可能性;召回率(R,recall)表示一个用户喜欢的产品被推荐的概率;F1指标表示综合考虑准确度与召回率因素,以便更好地评价算法的优劣。准确率、召回率和F1指标的计算公式如下表所示:

  其中相关的指标说明如下表所示:

  计算推荐结果的准确率、召回率和F1指标,关键代码如下:

 分类评测指标结果:

 

       由于本项目采用的是最基本的协同过滤算法进行建模,因此得出的模型结果也是一个初步的效果,在实际应用的过程中要结合业务进行分析,对模型进行进一步改造。一般情况下,最热门的物品往往具有较高的”相似性”。比如热门的网址,访问各类网页的大部分人都会进行访问,在计算物品相似度的过程中,就可以知道各类网页都和某些热门的网址有关。因此处理热门网址的方法如下:

  1. 在计算相似度的过程中,可以加强对热门网址的惩罚,降低其权重,比如对相似度平均化或对数化等方法。
  2. 将推荐结果中的热门网址进行过滤,推荐其他网址,将热门网址以热门排行榜的形式进行推荐,如下表所示。

        在协同过滤推荐过程中,两个物品相似是因为它们共同出现在很多用户的兴趣列表中,也可以说是每个用户的兴趣列表都对这两个物品的相似度产生贡献。但并不是每个用户的贡献度都相同。通常不活跃的用户要么是新用户,要么是只来过网站一两次的老用户。而在实际分析中,一般认为新用户倾向于浏览热门物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户则会逐渐开始浏览冷门物品。因此可以说,活跃用户对物品相似度的贡献应该小于不活跃的用户。所以在改进相似度的过程中,取用户活跃度对数的倒数作为分子,即本项目中相似度的公式如下:

       然而在实际应用中,为了尽量提高推荐的准确率,还会将基于物品的相似度矩阵按最大值归一化,不仅可以增加推荐的准确度,还可以提高推荐的覆盖率和多样性。由于本项目的推荐是针对某一类数据进行推荐的,因此不存在类间的多样性。

      当然,除了个性化推荐列表,还有另一个重要的推荐应用,就是相关推荐列表。有过网购经历的用户都知道,当你在电子商务平台上购买一件上商品时,它会在商品信息下面展示相关的商品。一种是包含购买了这个商品的用户也经常购买的其它商品;这两种相关推荐列表的区别是使用了不同用户行为计算物品的相似性。

  1. # 注意:获取一次sql对象就需要重新访问一下数据库
  2. sql = pd.read_sql(sql=sql_cmd, con=db, chunksize=10000) # 分块读取数据库信息
  3. counts4 = [page199(i) for i in sql] # 逐块统计
  4. # 本次机器学习项目实战所需的资料,项目资源如下:
  5. 链接:https://pan.baidu.com/s/1lWRYx6gBOgKe_XEipt3LKA
  6. 提取码:48vw
  7. counts4 = pd.concat(counts4)
  8. d1 = counts4['type'].value_counts()
  9. print('*************d1******************')
  10. print(d1)
  11. d2 = counts4[counts4['type'] == u'其他']
  12. print('*************d2******************')
  13. print(d2)
  14. # 求各个部分的占比并保存数据
  15. df1_ = pd.DataFrame(d1)
  16. df1_['perc'] = df1_['type'] / df1_['type'].sum() * 100
  17. df1_.sort_values(by='type', ascending=False, inplace=True)
  18. print('*************df1_******************')
  19. print(df1_)
  20. def xiaguang(i): # 自定义统计函数
  21. j = i.loc[(i['fullURL'].str.contains('\.html')) == False,
  22. ['fullURL', 'fullURLId', 'pageTitle']]
  23. return j
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/290276
推荐阅读
相关标签
  

闽ICP备14008679号