Python程序设计与实践大作业实验报告陆阳孙勇裘升明.docx
- 文档编号:4213433
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:18
- 大小:26.76KB
Python程序设计与实践大作业实验报告陆阳孙勇裘升明.docx
《Python程序设计与实践大作业实验报告陆阳孙勇裘升明.docx》由会员分享,可在线阅读,更多相关《Python程序设计与实践大作业实验报告陆阳孙勇裘升明.docx(18页珍藏版)》请在冰豆网上搜索。
Python程序设计与实践大作业实验报告陆阳孙勇裘升明
浙江工商大学计算机与信息工程学院
《Python程序设计与实践》大作业报告
专业:
计科
班级:
1404
学号:
1412190416、1412190415、1412190413
姓名:
陆阳,孙勇,裘昇明
指导教师:
蒲飞
2015年6月28日
题目介绍:
在真实的业务场景下,我们往往需要对所有商品的一个子集构建个性化推荐模型。
在完成这件任务的过程中,我们不仅需要利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据。
定义如下的符号:
U——用户集合
I——商品全集
P——商品子集,P ⊆ I
D——用户对商品全集的行为数据集合
那么我们的目标是利用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号还是不会购买任何商品。
贴关键代码
importtime
importpandasaspd
start=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_num
print'商品子集中商品类型数为:
',item_categories_num
print'商品子集中带geohash信息的商品个数为:
',item_geohash_num
print'用户数一共有:
',user_num
print'商品全集中商品个数为:
',item_full_num
print'商品全集中商品种类数数为:
',item_categories_full_num
print'商品全集中共有%d条行为记录'%(total_behavior_num)
print'消费行为记录中负正样本比为%d:
1'%(negative_num/positive_num)
print'一共耗时%f秒'%(end-start)
2、数据预处理
1重新整理时间
重新整理数据的时间,也就是Time字段,在数据统计分组中也提到过,因为原始数据的用户行为时间记录是从11月18日0时到12月18日23时,精确到小时级,为了方便数据集的划分,需要将用户行为时间数据整理为0-30天,以天为单位,即11月18日的time为0、11月19日的time为1,以此类推。
贴关键代码
importpandasaspd
fromdatetimeimport*
importtime
t0=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).days
returnint(datatime_delta)
df_train_user=pd.read_csv("tianchi_mobile_recommend_train_user.csv")
print"========================================\n"
print"时间转换进行中...\n"
df_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"时间转换结束!
\n"
print"转换时间共耗时%f秒"%(t1-t0)
2划分训练集和测试集
在分类问题中,模型需要经过训练集的学习,才能用于测试集,而训练集和测试集在形式上的区别在于前者有类别标签,后者则需要模型输出相应的类别标签。
这里的问题是依据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天的数据。
贴关键代码
importpandasaspd
fromdatetimeimport*
importtime
num=22
start=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.values
df_items=a
foriinrange(num):
print"划分训练集:
"+str(i)
j=i+10
ifj!
=31:
df_set=df_train_user[(df_train_user.time>=i)&(df_train_user.time 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 df_set.to_csv("data/"+"test.csv",index=False) end=time.time() print'训练集划分耗时%f秒'%(end-start) 3平衡正负样本 正负样本比例需从1: 100降为1: 10~1: 20之间。 贴关键代码 importpandasaspd importrandom importtime fromget_featuresimport* start=time.time() df_feature2=pd.DataFrame() j=10 forkinrange(20): i=j+k df_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)/lp>14: a=range(0,ln) slice=random.sample(a,lp*14)#lp*15 df_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-start) 3、特征提取 特征提取在数据挖掘中很重要,那么为什么它们那么重要呢? 之前提到过,要想输出测试集的类别标签,需要模型在训练集经过学习,那么模型在训练集上学习的是什么? 我们知道,在给模型输入数据的时候,实际上模型用到的都是特征(及其对应的类别标签),而特征就是用于描述为什么该样本的类别标签就是如此,在本赛题中即用于描述某用户为什么购买/不购买某商品。 比如,用户购买某商品的原因,是因为以前经常买,信得过,那么这里可以用“用户购买该商品的天数/用户访问该商品的天数”来刻画用户对该品牌的忠诚度。 当然,并不是单一的特征就能描述所有情况,通常来说,需要针对所有可能的情形进行考虑,从而深刻而全面地刻画用户购买/不购买商品的原因。 这样,模型才能真正学到其中的规律,从而在测试集表现优异。 而这一过程,就称之为特征工程。 显然,要做好特征工程,需要我们自身对“用户会否购买商品”这一业务具有较深刻的理解,即领域知识,并将其用模型可理解的方式表现出来,如何抽取特征? 1、统计用户在31天中的购买量、点击量、收藏量、加购物车次数、有操作记录的天数、发生购买的天数、点击转购买率等等,并以点击转购买率做升序/降序排序进行观察,可以发现点击量越高的,点击转购买率也往往越低,尤其点击量极高的用户,往往购买量为0。 由此可以考虑将用户购买量、点击转购买率等一系列特征用于描述用户是否会在未来一天发生购买。 2、统计用户从初次访问商品到最终购买商品的时间,可以发现绝大多数购买都是当天接触当天完成,越往后用户购买的可能性越低。 由此可以推测用户对商品的购买意愿是随着距离上次访问的时间拉长而衰减的,进而可以使用衰减函数来模拟该购买意愿。 一方面,利用领域知识对数据进行分析、实验验证。 另一方面,从分析的结果、实验的反馈来更新领域知识。 这是一个不断迭代的过程,需要成体系、且不断地完善。 以下仅供参考: (1)、基本统计类特征 A.销量(分割日期前1、2、3、4、5、10天) B.成交订单数(以同一天同一个用户为一个订单) C.购买人数 D.以上3类特征分别再针对点击、收藏、加购物车等进行统计 (2)、转化率类特征 A.销量/点击数 B.成交订单数/点击订单数 C.购买人数/点击人数 D.上述3个特征分别在针对收藏、购物车等操作进行统计 (3)、比值类特征 A.返客率(某周期内多次购买的用户数/总购买用户数) B.老客户率(3天【或其他周期7、15、30】前曾购买过且在前3天内再次购买的用户数/3天内总购买用户数) C.人均点击数、人均购买量、人均收藏量、人均加购物车量等 我们的做法: 1.用户所有行为总量 提取用户所有行为总量作为第一个特征,它是指每个用户对每个商品所有行为的总量,其中的所有行为包括点击行为、收藏行为、购物车行为、购买行为。 用户所有行为总量定义为前10天的用户行为数据中用户对商品全集的所有行为总量,包括点击量、收藏量、购物车量、购买量。 从用户所有行为总量中,可以得到用户对某商品产生的行为次数,从而推测出该用户对阿里巴巴移动电商平台的操作频率和忠诚度,以此做出合理的个性化推荐。 之所以选择前10天作为时间节点,是由于划分之后的每个训练集和测试集都以10天为单位。 2.点击量 定义数据集的每个用户对商品全集中的商品的点击行为的总和为点击量。 从点击量中,可以知道用户浏览了几次某商品,从而推测该用户对该商品的兴趣程度,为之后的模型训练以及最后的个性化推荐奠定一个良好基础。 其中,对点击量按10天、5天、3天、1天的时间来划分。 也就是关于点击量,按时间的不同提取的特征(U_click_sum10-U_click_sum1)有4个,分别是前10天的用户点击量、前5天的用户点击量、前3天的用户点击量、前1天的用户点击量。 之所以这样提取特征是由于之前划分的训练集是以10天为单位划分的,这样可以更清楚地分析用户在10天中点击量的分布情况,对后面的模型训练有很重要的作用。 3.收藏量 定义数据集的每个用户对商品全集中的商品的收藏行为的总和为收藏量。 这里可以从收藏行为推测用户对某商品的感兴趣程度,虽然收藏量不会大于点击量,但是收藏行为必定大于点击行为反映的用户感兴趣程度。 4.购物车量 定义数据集的每个用户对商品全集中的商品加入购物车行为的总数为购物车量。 这里可以从加入购物车行为直接推断用户对某商品感兴趣,虽然购物车量必定大幅度小于点击量和收藏量,但是加入购物车行为反映用户对某个商品感兴趣程度必定大于点击和收藏行为反映的感兴趣程度。 5.购买量 定义数据集的每个用户对商品全集中商品的购买行为的总数为购买量,或者说用户购买商品子集的商品数量为购买量。 这里可以从用户的购买行为直接推断为用户对某商品感兴趣,对个性化推荐有重要的意义。 点击 为了更清楚地看到购买量与点击量、收藏量、加购物车量的关系,对用户前10天的行为数据用散点图表示,以用户前10天的购买量为横坐标,其他三类行为是纵坐标,如图,可以看出用户点击量与其他的行为量相比明显大很多,而点击量越多的用户购买量就越少。 用户前10天的行为数据对比 6.点击/购买率 点击/购买率的计算公式就是点击量除以购买量,即发生多少次点击行为会有一次购买行为,也就是电子商务平台常说的转化率的倒数。 这个特征可以挖掘点击量和购买量之间的关系,可以预测出用户在点击后,何时会发生购买行为,更准确地为用户提供一个合理的个性化推荐。 这里还是按时间的不同提取4个特征(U_click/buy10-U_click/buy1),分别是前10天的点击/购买率、前5天的点击/购买率、前3天的点击/购买率、前1天的点击/购买率。 7.收藏/购买率 收藏/购买率的计算公式就是收藏量除以购买量,即发生多少次收藏行为会有一次购买行为。 这个特征可以挖掘收藏量和购买量之间的关系,可以预测出用户在收藏后,何时会发生购买行为,更准确地为用户提供一个合理的个性化推荐。 这里还是按时间的不同提取4个特征(U_collection/buy10-U_collection/buy1),分别是前10天的收藏/购买率、前5天的收藏/购买率、前3天的收藏/购买率、前1天的收藏/购买率。 与点击/购买率不同,该特征的取值范围可能在[0,1]之间,因为购买行为不一定要先收藏该商品,所以取值范围应该是大于等于0。 8.购物车/购买率 购物车/购买率的计算公式就是购物车量除以购买量,即发生多少次加入购物车行为会有一次购买行为。 这个特征可以挖掘购物车量和购买量之间的关系,可以预测出用户在加入购物车后,何时会发生购买行为,更准确地为用户提供一个合理的个性化推荐。 还是按时间的不同提取4个特征(U_car/buy10-U_car/buy1),分别是前10天的购物车/购买率、前5天的购物车/购买率、前3天的购物车/购买率、前1天的购物车/购买率。 该特征的取值范围与收藏/购买率相同,购买行为不一定要先加入购物车,所以它也应该是大于等于0。 9.商品销量 商品销量是指每个商品的销售量,与用户的购买行为有关,由购买了该商品的所有用户总量决定。 该特征直观地反映了某个商品基于销量上受喜爱程度,为训练模型以及个性化推荐提供了很好的参考。 还是按时间的不同提取4个特征(Item_sale10-Item_sale1),分别是前10天的商品销量、前5天的商品销量、前3天的商品销量、前1天的商品销量。 该特征的取值范围一定大于等于零。 10.成交订单量 成交订单量是指包含该商品的总成交订单的数量,与商品销量类似,不同的是同一笔订单中可能购买了多件该商品,那么此时商品销量大于1,而成交订单量却等于1。 该特征反映了用户对某个商品的购买次数,排除同一笔订单购买多件而使商品销量看起来较高的情况。 比如,用户购买牙刷时,一笔订单并不会只购买一个,通常会一起购买多个,那么牙刷的销量相比一般只购买一件的商品销量高很多。 通过成交订单量可以反映商品基于订单量受喜爱程度,提高了训练模型以及个性化推荐的准确性。 还是按时间的不同提取4个特征(I_order10-I_order1),分别是前10天的成交订单量、前5天的成交订单量、前3天的成交订单量、前1天的成交订单量。 该特征的取值范围一定大于等于零。 11.购买人数 购买人数是指购买该商品的用户总人数,与商品销量与成交订单相类似,不同的是同一个用户可能对该商品多次下单,也可能购买了多件该商品,那么此时成交订单量大于1,商品销量大于1,而购买人数却等于1。 该特征反映了某个商品的购买人数,排除同一个用户购买多次该商品的情况。 比如,用户购买生活用品就会出现多次下单和购买多件的情况。 通过购买人数可以真正反映商品基于用户受喜爱程度,很大程度地提高了训练模型以及个性化推荐的准确性。 还是按时间的不同提取4个特征(I_buyer10-I_buyer1),分别是前10天的购买人数、前5天的购买人数、前3天的购买人数、前1天的购买人数。 该特征的取值范围一定大于等于零。 12.是否加购物车 加入购物车的行为已经在前面做了一个详细地介绍和分析,其实在用户行为数据中,是否加入购物车也可以作为一个特征提取出来。 将是否加购物车的特征,定义为数据集的每个用户对商品全集中的商品是否发生加入购物车的行为。 这里还是按时间的不同提取5个特征(car5-car1),分别是倒数第5天是否加购物车、倒数第4天是否加购物车、倒数第3天是否加购物车、倒数第2天是否加购物车、倒数第1天是否加购物车。 之所以这样提取特征,是因为从用户在10天的倒数5天内是否会将某商品加入购物车,可以预测该用户在测试集中倒数5天内是否会发生加入购物车的行为。 该特征的取值范围一定为1或者0,其中1代表加购物车,0代表不加购物车。 13.是否购买 用户购买行为已经和加购物车行为一样在前面做了详细地介绍和分析,其实在用户行为数据中,是否购买也可以作为特征提取出来。 在本文中,将是否购买的特征,定义为数据集的每个用户对商品全集中的商品是否会发生购买行为。 这里还是按时间的不同提取5个特征(buy5-buy1),分别是倒数第5天是否购买、倒数第4天是否购买、倒数第3天是否购买、倒数第2天是否购买、倒数第1天是否购买。 之所以这样提取特征,是因为从用户在10天的倒数5天内是否会购买某商品,可以预测该用户在测试集中倒数5天内是否会发生购买行为。 该特征的取值范围一定为1或者0,其中1代表购买,0代表不购买。 14.累计的用户行为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 程序设计 实践 作业 实验 报告 陆阳孙勇裘升明