回复 第61楼 的 chengwh567:感谢理解。
对于test和train为何格式不同,我之前考虑了很久,才决定用现在的格式(虽然造成了误解)。很显然,train中包含的信息更加丰富,比如B和C在同一轮推荐给A,结果B获得了click而C没有。如果在后续推荐中,C被再次推荐给A(B未被重复推荐),且获得click。这种情况就说明,B与C相比,B对A更有吸引力。做推荐系统时,这种信息显然是有用的。
在test中仅仅给出B向A推荐的次(REC_TIMES)的原因是:由于test中与A对应的B只出现一次,更易于描述提交文件中每一行元素与候选会员B的对应关系。否则,如你所说,train中第1人共获得1190次推荐,而仅仅包含760余人,对应关系在做文字说明时比较困难,我前后改了几次,都不理想,以最终放弃而作罢。
显然从train可以得到类似于test格式的数据,举例说明如下。假设train中有数据行:
USER_ID_A USER_ID_B ROUND ACTION
A B1 1 rec
A B2 1 rec
A B2 1 click
A B3 1 rec
A B1 2 rec
A B3 2 rec
A B3 2 click
A B3 2 msg
则整合成类似test的格式数据如下(提供的test中去掉了最后一列,需要建模预测):
USER_ID_A USER_ID_B REC_TIMES ACTION
A B1 2 0
A B2 1 1
A B3 2 2
B1在前2轮均被推荐,因此REC_TIMES=2,但ACTION=0
B2仅在某轮被推荐过一次,获得click,因此REC_TIMES=1,ACTION=1
B3被两次推荐,先后获得click和msg,因此REC_TIMES=2,ACTION=2
需要说明的是,获得click的,在train中必于同一轮内占两行,一行标记rec,一行标记click
获得msg的,在train中必于同一轮内占三行,一行标记rec,一行标记click,一行标记msg。
这是因为,数据是基于推荐进行采集,一位会员点击或发信,对象都一定是系统推荐的。我们在采集数据时,去掉了那些会员通过搜索进行的交友数据。因此有高级action,必有低级action。
当然也有极少数例外(约170例),原因在于,本次数据采集的时间窗口为2010年12月1日—2011年2月28日。某些会员可能是在11月30日晚登录而获得推荐会员列表,却在12月1日凌晨才发生了click/msg,此时标记为rec的记录的时间戳在12月1日之前,因此没有包含在train中,因此只有click/msg,缺少rec。对于这些情况,test中的REC_TIMES一律置成2,因为REC_TIMES的平均值在1.7左右。这种情况很少出现,因此未在题目中进行说明。
如果你把test中第三列累加,会发现略少于信息汇总表中的550万,就是这个原因造成的。精力有限,未作说明,也不大可能影响建模。