本章通过对用户访问的网页日志数据进行分析与处理,采用基于物品的协同过滤算法对处理后的数据进行建模分析,并应用模型实现智能推荐,进行个性化推荐,帮助用户更加便捷地获取信息。
二、分析方法与过程
(一)分析步骤与流程
为了帮助用户从海量的信息中快速发现感兴趣的网页,本案例主要采用协同过滤算法进行推荐,其推荐原理如图所示。
本案例采用基于用户浏览网页的类型的方法进行分类,然后对每个类型中的内容进行智能推荐。采用上述分析方法与思路,结合原始数据及分析目标,整理的网站智能推荐流程如下图所示,主要步骤如下:
1)从系统中获取用户访问网站的原始记录。
2)分析用户访问内容、用户流失等。
3)对数据进行预处理,包含数据去重、数据变换等过程。
4)以用户访问html后缀的网页为关键条件,对数据进行处理。
5)对比多种推荐算法的效果,选择效果较好的模型。通过模型预测,获得推荐结果。
(二)数据抽取
首先在MySQL中创建test数据库,然后把表数据导入数据库,最后连接数据库并选取3个月内用户的访问数据,如以下代码所示。
1importos2importpandasaspd345#修改工作路径到指定文件夹6os.chdir("E:/大三下/数据分析/数据/第十一章")78#第一种连接方式9#fromsqlalchemyimportcreate_engine1011#engine=create_engine('mysql+pymysql://root:123@192.168.31.140:3306/test1charset=utf8')12#sql=pd.read_sql('all_gzdata',engine,chunksize=10000)1314#第二种连接方式15importpymysqlaspm1617con=pm.connect(host='localhost',user='root',password='123456',database='test1',charset='utf8')18data=pd.read_sql('select*fromall_gzdata',con=con)19con.close()#关闭连接2021#保存读取的数据22data.to_csv('E:/大三下/数据分析/数据/第十一章/all_gzdata.csv',index=False,encoding='utf-8')(三)数据探索分析
1、分析网页类型
对原始数据中用户点击的网页类型进行统计分析,如以下代码所示。
通过输出结果可以发现,浏览咨询内容页(101003)记录最多,其次是咨询列表页(101002)和咨询首页(101001)。初步分析可以得知用户都喜欢通过浏览问题的方式找到自己需要的信息,而不是以提问的方式或者查看长篇内容的方式寻找信息。
首先是网址中带有lawfirm关键字的对应律师事务所,其次是带有ask/exp、ask/online关键字的对应咨询经验和在线咨询页。大多数用户浏览网页的情况为咨询内容页、知识内容页、法规专题页、在线咨询页等,其中咨询内容页和知识内容页占比最高。对原始数据的网址中带“”的数据进行统计,如以下代码所示。
通过输出结果可以看出,网址中带有“”的记录一共有65492条,且不仅仅出现在其他类别中,同时也会出现在咨询内容页和知识内容页中,但在其他类型(1999001)中占比最高,可达到98.82%。因此需要进一步分析其类型内部的规律,如以下代码所示。
访问记录中有一部分用户并没有点击具体的网页,这类网页以“.html”后缀结尾,且大部分是目录网页,这样的用户可以称为“瞎逛”,漫无目的,总共有165654条记录,统计过程如以下代码所示。
综合以上分析,得到一些与分析目标无关数据的规则,记录这些规则有利于在数据清洗阶段对数据进行清洗操作。
2、分析网页点击次数
统计原始数据中用户浏览网页次数的情况,如以下代码所示。
根据统计结果可知,浏览一次的用户最多,占所有用户的58%左右。
分析浏览次数为一次的用户的行为,如以下代码。
1、删除不符合规则的网页
2、还原翻页网址
1#找出翻页和非翻页网址2index=[re.search('/\d+_\d+\.html',i)!=Noneforiininfo1.loc[:,'fullURL']]3index1=[i==Falseforiinindex]4info1_1=info1.loc[index,:]#带翻页网址5info1_2=info1.loc[index1,:]#无翻页网址6#将翻页网址还原7da=[re.sub('_\d+\.html','.html',str(i))foriininfo1_1.loc[:,'fullURL']]8info1_1.loc[:,'fullURL']=da9#翻页与非翻页网址合并10frames=[info1_1,info1_2]11info2=pd.concat(frames)12#或者13info2=pd.concat([info1_1,info1_2],axis=0)#默认为0,即行合并14#去重(realIP和fullURL两列相同)15info3=info2.drop_duplicates()16#将IP转换成字符型数据17info3.iloc[:,0]=[str(index)forindexininfo3.iloc[:,0]]18info3.iloc[:,1]=[str(index)forindexininfo3.iloc[:,1]]19len(info3)3、筛去浏览次数不满两次的用户
根据数据探索的结果可知,数据中存在大量仅浏览一次就跳出的用户,浏览次数在两次及以上的用户的浏览记录更适于推荐,而浏览次数仅一次的用户的浏览记录进入推荐模型会影响推荐模型的效果,因此需要筛去浏览次数不满两次的用户,如以下代码所示。
1#筛选满足一定浏览次数的IP2IP_count=info3['realIP'].value_counts()3#找出IP集合4IP=list(IP_count.index)5count=list(IP_count.values)6#统计每个IP的浏览次数,并存放进IP_count数据框中,第一列为IP,第二列为浏览次数7IP_count=pd.DataFrame({'IP':IP,'count':count})8#3.3筛选出浏览网址在n次以上的IP集合9n=210index=IP_count.loc[:,'count']>n11IP_index=IP_count.loc[index,'IP']4、划分数据集
将数据集按8:2的比例划分为训练集和测试集。
1#划分IP集合为训练集和测试集2index_tr=sample(range(0,len(IP_index)),int(len(IP_index)*0.8))#或者np.random.sample3index_te=[iforiinrange(0,len(IP_index))ifinotinindex_tr]4IP_tr=IP_index[index_tr]5IP_te=IP_index[index_te]6#将对应数据集划分为训练集和测试集7index_tr=[iinlist(IP_tr)foriininfo3.loc[:,'realIP']]8index_te=[iinlist(IP_te)foriininfo3.loc[:,'realIP']]9data_tr=info3.loc[index_tr,:]10data_te=info3.loc[index_te,:]11print(len(data_tr))12IP_tr=data_tr.iloc[:,0]#训练集IP13url_tr=data_tr.iloc[:,1]#训练集网址14IP_tr=list(set(IP_tr))#去重处理15url_tr=list(set(url_tr))#去重处理16len(url_tr)(五)构建智能推荐模型
1、模型构建
将训练集中的数据转换成0-1二元型数据,使用ItemCF算法对数据进行建模,并给出预测推荐结果。
2、模型评价
计算推荐结果的准确率、召回率和F1指标。
1importpandasaspd2#读取保存的推荐结果3Res=pd.read_csv('./tmp/Res.csv',keep_default_na=False,encoding='utf8')45#计算推荐准确率6Pre=round(sum(Res.loc[:,'T/F']=='True')/(len(Res.index)-sum(Res.loc[:,'T/F']=='NaN')),3)78print(Pre)910#计算推荐召回率11Rec=round(sum(Res.loc[:,'T/F']=='True')/(sum(Res.loc[:,'T/F']=='True')+sum(Res.loc[:,'T/F']=='NaN')),3)1213print(Rec)1415#计算F1指标16F1=round(2*Pre*Rec/(Pre+Rec),3)17print(F1)