浙江工商大学计算机与信息工程学院《Python程序设计与实践》大作业报告专业:计科班级:1404学号:1412190416、1412190415、1412190413姓名:陆阳,孙勇,裘昇明指导教师:蒲飞2015年6月28日题目介绍:在真实的业务场景下,我们往往需要对所有商品的一个子集构建个性化推荐模型。在完成这件任务的过程中,我们不仅需要利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据。定义如下的符号:U——用户集合I——商品全集P——商品子集,P⊆ID——用户对商品全集的行为数据集合那么我们的目标是利用D来构造U中用户对P中商品的推荐模型。数据说明:竞赛数据包含两个部分。第一部分是用户在商品全集上的移动端行为数据(D),表名为tianchi_mobile_recommend_train_user,包含如下字段:字段字段说明提取说明user_id用户标识抽样&字段脱敏item_id商品标识字段脱敏behavior_type用户对商品的行为类型包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。user_geohash用户位置的空间标识,可以为空由经纬度通过保密的算法生成item_category商品分类标识字段脱敏time行为时间精确到小时级别第二个部分是商品子集(P),表名为tianchi_mobile_recommend_train_item,包含如下字段:字段字段说明提取说明item_id商品标识抽样&字段脱敏item_geohash商品位置的空间标识,可以为空由经纬度通过保密的算法生成item_category商品分类标识字段脱敏训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。大作业报告内容包括以下几个部分1、数据分组统计:可统计有多少用户、商品、商品类别等信息,甚至每天各种行为的统计数。如图:还有,在给出的用户行为数据中,有些用户在整个11-18日至12-18日对商品有浏览行为记录,但是从未产生过购买行为,这些用户会否在12月19号购买商品实难预测,因此,我们去除这些无购买行为的用户信息,认为这些用户在12月19号还是不会购买任何商品。贴关键代码importtimeimportpandasaspdstart=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,以此类推。贴关键代码importpandasaspdfromdatetimeimport*importtimet0=time.time()begin_time=datetime(2014,11,18,0,0)deftrans_time(str_time):entry_time=datetime.strptime(str_time,%Y-%m-%d%H)datatime_delta=(entry_time-begin_time).daysreturnint(datatime_delta)df_train_user=pd.read_csv(tianchi_mobile_recommend_train_user.csv)print========================================\nprint时间转换进行中...\ndf_train_user.time=df_train_user.time.map(lambdax:trans_time(x))df_train_user.to_csv(train_trans_time.csv,index=False)t1=time.time()print时间转换结束!\nprint转换时间共耗时%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天的数据。贴关键代码importpandasaspdfromdatetimeimport*importtimenum=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=aforiinrange(num):print划分训练集:+str(i)j=i+10ifj!=31:df_set=df_train_user[(df_train_user.time=i)&(df_train_user.timej)]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.timej)]df_set.to_csv(data/+test.csv,index=False)end=time.time()print'训练集划分耗时%f秒'%(end-start)⑶平衡正负样本正负样本比例需从1:100降为1:10~1:20之间。贴关键代码importpandasaspdimportrandomimporttimefromget_featuresimport*start=time.time()df_feature2=pd.DataFrame()j=10forkinrange(20):i=j+kdf_feature=pd.read_csv(data_features/train+str(i)+.csv)df_feature_p=df_feature[df_feature.tag==1]df_feature_n=df_feature[df_feature.tag==0]lp=len(df_feature_p)ln=len(df_feature_n)iffloat(ln)/lp14:a=range(0,ln)slice=random.sample(a,lp*14)#lp*15df_feature_n=df_feature_n.iloc[slice]df_feature=pd.concat([df_feature_p,df_feature_n],ignore_index=True)df_feature2=pd.concat([df_feature,df_feature2])df_feature2.to_csv(features/train_feature.csv,index=False)end=time.time()print'对训练集抽样耗时%f秒'%(end-