Python程序设计与实践大作业实验报告陆阳孙勇裘升明

  • 格式:docx
  • 大小:29.48 KB
  • 文档页数:20

浙江工商大学计算机与信息工程学院《Python程序设计与实践》大作业报告专业:计科班级: 1404学号:、、姓名:陆阳,孙勇,裘昇明指导教师:蒲飞2015 年 6 月 28 日题目介绍:在真实的业务场景下,我们往往需要对所有商品的一个子集构建个性化推荐模型。

在完成这件任务的过程中,我们不仅需要利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据。

定义如下的符号:U——用户集合I——商品全集P——商品子集,P ⊆ ID——用户对商品全集的行为数据集合那么我们的目标是利用D来构造U中用户对P中商品的推荐模型。

数据说明:竞赛数据包含两个部分。

第一部分是用户在商品全集上的移动端行为数据(D),表名为tianchi_mobile_recommend_train_user,包含如下字段:第二个部分是商品子集(P),表名为tianchi_mobile_recommend_train_item,包含如下字段:训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。

参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。

大作业报告内容包括以下几个部分1、数据分组统计:可统计有多少用户、商品、商品类别等信息,甚至每天各种行为的统计数。

如图:还有,在给出的用户行为数据中,有些用户在整个11-18日至12-18日对商品有浏览行为记录,但是从未产生过购买行为,这些用户会否在12月19号购买商品实难预测,因此,我们去除这些无购买行为的用户信息,认为这些用户在12月19号还是不会购买任何商品。

贴关键代码import timeimport pandas as pdstart=time.time()df_items=pd.read_csv("tianchi_mobile_recommend_train_item.csv")df_items2=pd.read_csv("tianchi_mobile_recommend_train_user.csv")df_items3=pd.DataFrame()df_items4=pd.DataFrame()df_items5=pd.DataFrame()df_items3=df_items["item_id"].drop_duplicates()df_items4=df_items["item_category"].drop_duplicates()df_items5=df_items[df_items.item_geohash.notnull()]df_items5=df_items5["item_id"].drop_duplicates()df_items6=df_items2["user_id"].drop_duplicates()df_items7=df_items2["item_id"].drop_duplicates()df_items8=df_items2["item_category"].drop_duplicates()total_behavior_num=len(df_items2)df_items9=df_items2[df_items2.behavior_type==4]df_items10=df_items2[df_items2.behavior_type!=4]positive_num=len(df_items9)negative_num=len(df_items10)item_num=len(df_items3)item_categories_num=len(df_items4)item_geohash_num=len(df_items5)user_num=len(df_items6)item_full_num=len(df_items7)item_categories_full_num=len(df_items8)end=time.time()print '商品子集中商品个数为:',item_numprint '商品子集中商品类型数为:',item_categories_numprint '商品子集中带geohash信息的商品个数为:',item_geohash_numprint '用户数一共有:',user_numprint '商品全集中商品个数为:',item_full_numprint '商品全集中商品种类数数为:',item_categories_full_numprint '商品全集中共有%d条行为记录' %(total_behavior_num)print '消费行为记录中负正样本比为%d:1' %(negative_num/positive_num)print '一共耗时%f秒' %(end-start)2、数据预处理⑴重新整理时间重新整理数据的时间,也就是Time字段,在数据统计分组中也提到过,因为原始数据的用户行为时间记录是从11月18日0时到12月18日23时,精确到小时级,为了方便数据集的划分,需要将用户行为时间数据整理为0-30天,以天为单位,即11月18日的time为0、11月19日的time为1,以此类推。

贴关键代码import pandas as pdfrom datetime import *import timet0=time.time()begin_time=datetime(2014,11,18,0,0)def trans_time(str_time):entry_time=datetime.strptime(str_time,"%Y-%m-%d %H")datatime_delta=(entry_time-begin_time).daysreturn int(datatime_delta)df_train_user=pd.read_csv("tianchi_mobile_recommend_train_user.csv")print "========================================\n"print "时间转换进行中 ...\n"df_train_user.to_csv("train_trans_time.csv",index=False)t1=time.time()print "时间转换结束!\n"print "转换时间共耗时%f秒" %(t1-t0)⑵划分训练集和测试集在分类问题中,模型需要经过训练集的学习,才能用于测试集,而训练集和测试集在形式上的区别在于前者有类别标签,后者则需要模型输出相应的类别标签。

这里的问题是依据31天的用户操作记录预测第32天的购买情况,所以通常来说,训练集的构建需要利用31天的数据,而其相应的类别标签如何标注在训练集中?这个与你如何划分训练集和测试集有关;而测试集的构建则可用到31天的完整数据。

下面举个例子,用于解释训练集和测试集的具体表现形式。

训练集样本示例测试集样本示例训练集样本示例中的user_id, brand_id(item_id)用于表示唯一的样本id,而特征feature_1, feature_2则用31天的数据构建而来。

本次比赛中,我们划分训练集和测试集所用的分割日期是每10天。

第0-9天为一个训练集,用第10天的数据给第0-9天数据添加类别标签。

第1-10天为一个训练集,用第11天的数据给第1-10天数据添加类别标签,依次类推,…,最后是第20-29天为一个训练集,用第30天的数据给第20-29天数据添加类别标签。

测试集为第21-30天的数据。

贴关键代码import pandas as pdfrom datetime import *import timenum=22start=time.time()df_train_user=pd.read_csv("train_trans_time_process.csv")df_items=pd.read_csv("tianchi_mobile_recommend_train_item.csv")df_items=df_items.item_id.drop_duplicates()a=pd.DataFrame()a["item_id"]=df_items.valuesdf_items=afor i in range(num):print "划分训练集:"+str(i)j=i+10if j!=31:df_set=df_train_user[(df_train_user.time>=i) & (df_train_user.time<j)]df_set.to_csv("data/"+str(j)+".csv",index=False)df_test=df_train_user[(df_train_user.time==j) & (df_train_user.behavior_type==4)][["user_id","item_id"]]df_test=df_test.drop_duplicates()df_test=pd.merge(left=df_test,right=df_items,how="inner").drop_duplicates() df_test.to_csv("data/"+"result"+str(j)+".csv",index=False)else:df_set=df_train_user[(df_train_user.time>=i)&(df_train_user.time<j)] df_set.to_csv("data/"+"test.csv",index=False)end=time.time()print '训练集划分耗时%f秒' %(end-start)⑶平衡正负样本正负样本比例需从1:100降为1:10~1:20之间。