版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算广告学实验报告实验题目:Projectl:Movierecommendedsystem.实验内容来自1682部电影943位用户的100000条评分数据。每个用户都至少评价过20部电孽。用户和项从1开始连续编号,数据被随机排序。数据格式是一个制表符分隔的列表:userid|itemid|rating|timestampo数据已经被抽样分割为train文件和test文件。多次重复抽样得到ul.train-u5.train和ul.test〜u5.test,以进行交叉验证。ul.test-u5.test数据不重叠。每个作为输入的train文件得到一个推荐结果文件ui.res(i=1...5)数据格式:userid(制表符)itemid为每个用户推荐的条数不限。提供了test文件,可自行测试结果Fl值,按F1值的高低评价推荐结果的好坏。.实验准备.弄清题意,了解数据集构成及含义。.查阅书籍资料,了解推荐系统和数据挖掘方面的相关内容。.在PC机上下载安装R语言,并学习R语言的基本操作。.实验方法.整体思路:通过预测某位用户U0对某部电影M0的评分,分为0-5分,将评分较高的电影推荐给用户。首先,选择用户U0已经给出评分的n部电影,并获取这些电影的ID,分别为Ml-Mn;接着,找出对电影M0已经进行过评分的m位用户,并获取这些用户的ID,分别为Ul-Um;然后,利用以上获取的三组ID,构造训练集data_train和测试集data」est,结构如下所示:7F分电影ID待评分电影已知评分电影用 二^;M0Ml Mn待评分用户U0测试集(data_test_y)测试集(data_test_x)已知评分用户U1Un训练集(data_train_y)训练集(data_train_x)最后,将相应的训练集与测试集按顺序放入knn()函数,即可预测出用户U0对电影M0的评分值。.knn()函数基本格式:knn(train,test,cl,k=l,1=0,prob二FALSE,use.all=TRUE)knn()函数默认选择欧氏距离来寻找所需的K的最近样本,在可变参数中,train和test参数分别代表训练集和测试集;cl用来放置训练集中已知类别样本的类别取值;k为控制最近邻域大小的参数;1设置得到确切判别结果所需满足的最少票数。prob控制输出“胜出”类别的得票比例,比如k=10时,若其中有8个属于类别1,2个属于类别2,类别1则为“胜出”类别,且prob取TRUE时,可输出该待判样本所对应的prob值为8/10=0.8;use.all用于选择再出现“结点”时的处理方式,所谓结点即指距离待判样本第K近的已知样本不止一个,比如己知样本i和j与待判样本n的距离相等,都刚好第K近,那么当useall默认取TRUE时就将i和j都纳入判别过程,这时n的K近邻就有K+1个样本,若use.all取FALSE,则R软件会在i与j中随机选出一个以保证K近邻中刚好有K个样本。knn()函数需要加载class软件包才可以运行。.数据集信息>setwd(nF://R//R-3.2.0//DATA2n)>data=read.table(nul.basen)>head(data);dim(data)VIV2V311152 12 3VIV2V311152 12 313 414 31536 17 4VIV2V311152 12 313 4VIV2V311152 12 313 414 31536 17 4V4874965758876893171878542960876893119889751712875071561[1]80000>1这里我们使用ul.base为例,通过使用R我们将数据集ul.base读入,将其命名为data,并查看数据的基本信息,数据集data共有4个变量,正如前面所介绍的分别为用户ID、电影ID、评分及时间戳,共计8万条数据,评分分别为1-5。.数据预处理我们先将data数据集的第四列时间戳去掉,并将其他三列命名data=data[F-4]names(data)=c(nuseridnrnitemidnrnratingn)head(data);dim(data)useriditemidrating111512 3在进行构造实验所需数据集之前,我们先要提高data数据集的质量。首先,data数据集没有缺失值问题。为了排除一些噪声数据的干扰,我们将数据集中电影ID观看条目总数低于10条(包括10)的相关行删除。>head(data);dim(data)useriditeiEldrating111521233134414351536174[1]774563这时data数据集里就剩下77456条数据了。还考虑过同一用户对同一电影多次打分的情况,将其取平均值并只留下这一条信息,处理过后发现和直接观察的一样并没有存在这样的情况。.MovieLens_KNN函数的编写>MovieLens_KNN(Userid=lrItemid=6rn=50rK=10)MovieLens_KNN函数用来预测某一用户对某部影片的评分,共有4个参数,Userid和Itemid即为所要预测的用户ID,即U0和电影ID,即MO;n为我们选择的预测的用户U0已经给出评分电影的个数;K为kNN算法中的参与判别最近邻样本的个数。按照整体思路,我们先来分别获取U0、M0及Ml-Mn。对应于代码中,我
们得到sub表示待预测用户U0在数据集中各条信息所在的行标签;sub_n表示随机抽出的n个U0已评分电影Ml-Mn的行标签;known_itemid表示U0已评分电影Ml-Mn的电影ID;unknown_itemid表示待预测电影M0的ID。+sub=which(data$userid==Userid)+if(length(sub)>=n)sub_n=sample(subrn)+if(length(sub)<n)sub_n=sample(sub,length(sub))+known_itemid=data$itemid[sub_n]+un]cnown_iteniid=Iteniid接着我们我出已经对电影MO做出评分的用户,即Ul-Um,将这m位用户的ID存于user中。+un)cnown_sub=which(data$itemid-un)cnown_iteniid)+user=data$userid[unknown_sub[-1]]然后我们开始构造data_all数据集,data_all是根据原始数据集data以及参数设定值在函数中新构造出的数据集,它的结构和上面给出的训练集data_train和测试集datajest,结构相同。最终放入knn()函数中的训练集和测试集都来自于该data_all数据集。data_all数强集的部分图如下:$'data_all:Tuseridunknownitemld6itemld95itemld28iteirild220itemld1091234567zc1711234567zc17176181198486524537035二2452O40:'00031r\0,j00003r\3Jj0j300r\50二0301r\第一行数据为待评分用户(图中用户ID为1)、待评分电影的实际评分(图中电影ID为6,若未观看过待预测的话原始得分自然为0)以及待评分用户看过的50部电影的评分值。从第二行开始,就是对待评分电影(ID为6)已经进行评分的m位用户的相应信息。根据data.all的结构进行构造:设置data_all的行列数,对所有值初始为0,将各变量进行命名,对userid变量进行赋值:+data_all=matrix(0r1+length(user),2+length(known__item±d))+data_all=data・frame(data_all)+names(data_all)=c(nuseridnrpaste(r,unknown_itemid_n,Itemid)zpaste(nitemid_n$+item=c(unknown_iteniicirknown_izemid)+data_all$userid=c(Useridruser)对data_all数据集的主体部分进行赋值,通过两层循环实现。这里有一点要考虑到的是并不是我们所选出的对电影M0已评分的m位用户都对Ml-Mn这n部电影全都做出了评分。所有data_all数据集中的部分数据存在缺失,所以使用一条if判断语句,仅对data_all中有相应取值的位置赋值,缺失的位置取0。+for(iin1:nrow(data_all))+{+ data_temp=data[which(data$userid==data_all$userid[i])r]+for(jin1:length(item))+ {if(sum(as.numeric(data_temp$iteinid=item[j]))!=0)+{data_all[ifj+1]=data_tenLp$rating[which(data_temp$iteniid==itenL[jJ)]}+}}根据data_alL从中分割出用户knn()函数参数设置的训练集与测试集。+data_test_x=data_all[1,c(-1,-2)]+data_test_y=data_all[1,2]+data_train_x=data_all[-1,c(一1,-2)]+data_train_y=data_all[-1,2]最后,将相应的部分放入knn()函数中,并将MovieLens_KNN()中参数K的值赋给knn()函数的参数k。+fit=knn(data_train_xfdata_test_xfcl=data_train_yFJc=K).获取数据集中存在的用户ID和电影ID我们使用两层循环对每个用户对每部电影进行预测得分,将未打过分,即真实得分为0,预测得分较高的电影推荐给用户。为了提高预测的准确度并降低不必要的推荐,我们要获取data数据集中存在的用户ID和电影ID。在经过删减处理后的data数据集中,用户ID仍是连续的,这在一定程度上给我们提供了便利,但是电影ID就不是了。针对data数据集中不存在的电影我们是不予以推荐的。user_data=data[-2]user_data=user_data[order(user_data[[1]])Fuser_data=data[-2]user_data=user_data[order(user_data[[1]])F]y=unique(user_data[f1])sub=rep(0rlength(y))for(iin1:length(y))+sub[i]=which(user_data[f1]—y[i])[1]user_data=user_data[subf]head(user_data);dim(user_data)useridrating1 1 5136 2 4176 3 4204 4 4218 5 3309 6 4943 2>user_data[943rl][1]943Item_data=data[-1]Item_data=Item_data[order(Item_data[[1]])f]y=unique(Item_data[F1])sub=rep(0rlength(y))for(iin1:length(y))+sub[i]=which(Iteni_data[,l]=y[i])[1]Item_data=Item_data[subf]head(Item_data);dim(Item_data)itemidrating1 52 33 44 35 31461 6 5[1]1046 2>Item_data[1046f1][1]1483通过将数据集data按userid或itemid进行排序,并按其获得唯一性。这里将用户ID存于变量usejdata中,共有943行数据,最后一行的用户ID也为943,证明其是连续的,可以从1开始一直运行到943。将电影ID存于变量item_data中,共有1046行数据,最后一行的电影ID也为1483,证明其不是连续的,存在不应推荐的电影ID要跳过,就不需要从1开始一直不断运行到1483,避免预测不存在的电影。.获取每个用户看过电影的最大和最小ID为了进一步提高推荐的准确性和降低推荐的数量,由于这里的data数据集的特殊性,用户观看的电影存在最大值和最小值,并且电影ID具有一定的连续性或者相差不远。按用户ID和电影ID从小到大排序,可以将推荐缩小到这个范围左右。但对于其他情况(如天池大数据竞赛)可能不太适用,就需要对所有电影(或其他)进行预测打分进行推荐。A=data[order(data[[1]]A=data[order(data[[1]]F-data[[2]])F]y=unique(A[r1])sub=rep(0flength(y))for(iin1:length(y))+sub[i]=which(A[rl]=y[i])[1]itemMax=A[subf]head(itenil*Iax);dim(itenil-Iax)A=datay=unique(A[F1])sub=rep(0flength(y))for(iin1:length(y))+sub[i]=which[k[r1]=y[i])[1]itemMin=A[subf]head(iteniMin);dim(iteml-Iin)useriditemidrating135127121752311520333553217436253085456141865392[1]9433useriditeirJ.drating11151362141763181420441142185213309614[1]943 3比如用户ID为3的用户,最小的电影ID为181,我们就从181开始之后对电影进行预测得分然后进行推荐。不考虑181之前的,虽然也可能会遗漏一些电影,但是只是一点点,相比可能会多预测推荐的条目,这一点牺牲是值得的。.构造结果集通过对某一用户和某一电影使用(例如)MovieLens_KNN(Userid=l,Itemid=6,n=50,K=10)函数来进行评分预测,选择合适的参数n和K来获取较好的预测情况。在真实得分为。(意味着该用户没有看过这个电影)和预测得分较高的情况下,将对应的用户ID和电影ID添加到结果集中。4.实验结果ul.base推荐结果与ul.test进行比较:D:\计算广告学、评分程序》jaua-jareua.jarul.testul.resprecision:6.6383657Zrecall:51.370003ZFlscore:0.11757368D:\计算广告学、评■分程序》jaua-jareua.jarul.testul<2>.resprecision:8.653105Zrecall:12.91ZFlscore:0.10361364图中ul.res是将预测得分为4分和5分的结果都写入结果集,致使结果集较大,条目较多,所以召回率较高。ul(2).res是只将预测得分为5分的结果写入结果集,精确度和召回率比较接近。但因为前者的F1得分更高,所以就使用前者作为最终结果。但是之后的u2.base,u3.base,u4.base,u5,base用户数量比ul.base翻了一番,所以将预测得分为4分和5分的电影都推荐的话,会造成推荐数目太多,精确度和召回率相差悬殊。所以最终使用预测得分为5分的电影进行推荐。u2.base推荐结果与u2.test进行比较:D:\计算广告学、评分程序》jaua-jareua.jaru2.testu2.resprecision:7.014284zrecall:12.08zFlscore:0.08875174u3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年及未来5年市场数据中国高硼硅玻璃管行业发展前景预测及投资战略咨询报告
- 2027届高三数学一轮复习课件:第八章 高考热点10 轨迹问题
- 北京职业规划价格参考
- 2026年4月福建厦门市产品质量监督检验院简化程序招聘事业单位专业技术岗位人员1人笔试模拟试题及答案解析
- 安徽就业指导方案
- 硝酸铵结晶造粒工持续改进水平考核试卷含答案
- 手工火焰切割工安全操作强化考核试卷含答案
- 2026年及未来5年市场数据中国嵌入式咖啡机行业发展运行现状及发展趋势预测报告
- 2026年福建晋园发展集团有限责任公司公开招聘工作人员考试备考试题及答案解析
- 摩托车成车装调工安全应急竞赛考核试卷含答案
- 龙湖集团批量精装交付标准(可编辑版)
- 2026时政热点考试卷及答案
- GB/T 46918.2-2025微细气泡技术水中微细气泡分散体系气体含量的测量方法第2部分:氢气含量
- 蛋糕店人员培训制度
- 2025年北京市海淀区中考化学真题
- 2025年东北大学强基笔试试题及答案
- 2024年淮阴师范学院辅导员考试笔试真题汇编附答案
- 中华人民共和国危险化学品安全法解读
- DB32∕T 5111-2025 普通国省道基础设施三维数字化采集技术规范
- 石材幕墙干挂维修工程方案
- 水库工程施工进度计划管理模板
评论
0/150
提交评论