阿里大数据推荐大赛经验总结
参赛队伍数:7276
S1: 成绩F1|排名 7.07%|205
S2换数据前: 成绩F1|排名 5.98%|21
S2换数据后(最终): 成绩F1|排名 6.02%|29
2、心路历程
首先谈谈报名参赛初衷:
1).主要想锻炼自己,想要积累一些推荐这个领域的实战经验,再加上刚好去年刚看了一些传统的经典的推荐算法的书籍,去年参与实验室的一个项目就是和推荐相关;
2).对阿里的云平台odps比较感兴趣,想体验一下,真实地触摸大数据体验大数据;
3).当时报名的时候希望能进Top50,能拿到明年阿里的校招的绿色通道.
第一赛季,和实验室同项目组的谷神和ycc一组,当时组队的时候对我们的期许都很高,但是因为各种各样的原因,三个人的参与程度都不是很高,交流也不多,S1的成绩并不是好,记得当时用了我用了师兄论文中的一个Baseline 的推荐算法,Top Sensitive Pagerank来实现,发现效果很差,后来和其他同学交流得知用规则就可以做得很高,后来基本就光想规则,没有思考模型思考算法层面的东西,所以S1感觉收获不大。最后一天,我们的队伍500多名,即将面临淘汰,因为这个比赛最吸引我的还是ODPS(阿里的云平台)的使用,就想继续玩玩,就抱大腿临时加入到小鱼他们队,才以至于有这之后的三个月S2的故事。
S2 队友小鱼很给力,又是个可爱漂亮的妹纸,她的总结在这里,诸多细节我就不再赘述。
3、4个月比赛中我做了些什么
1、平均每天的参与程度时间为4-5h左右,S2三个月共花了400+ h
2、了解和熟悉LR、RF、GBRT等算法的一些原理,以及这些算法的Python接口在ODPS中的调用
3、知道了机器学习在实战中的完整过程,从数据集Train和Test集的划分,过拟合,模型的选择,特征的抽取,正负样本的处理,采样方式(向上采样、向下采样),各种调参,特征的处理,y值处理,融合的方式都有了一个不一样的理解。
4、作为数据库方向的学生,说实话有些许惭愧,之前对普通关系型数据库最基本的SQL操作都不是很熟练,通过这个比赛对SQL已经基本掌握(包括Join,Union,Group By,Order By等)
5、重点了解了分布式odps的基本原理(其实就是Hadoop),对MapRedece有了更加深入的了解(包括任务分解合并的过程等),并且自己能够够独立地编写MapReduce程序来提取特征,通过这个比赛完成不重复代码的编写5000行+.
4、分享一些干货
A.整个模型建模过程,这里用了很早之前的LR模型(特征也是最普通的SQL暴力提取),整个流程其实是一样的
阿里大数据的任务就是根据用户4个月在天猫的行为日志,建立用户的品牌偏好,并预测他们在将来一个月内对品牌下商品的购买行为。考虑到S1过程中我们初步判断点击的数据只有最近的半个月影响较大,故我们最初的LR模型就采用半个月的数据作为一个时间周期,这里所说的对点击率做LR模型是指逻辑回归,也就是推荐系统中常见的分类问题,即9月份买或者不买的问题,买用1表示,不买用0表示。
TrainData准备:7.01-7.15(A)的点击数据作为feature,7.16-7.31(B)购买与否数据作为y,同时控制正负样本的比例,抽取A中的点击同时B中购买,同时随机抽样A中的点击但是B中未购买的样本(这种样本数量很多,需要对之随机抽样,可以使用Xlab中的随机抽样功能),控制正负样本的比例。将A的点击+B中的购买与否y构成完整的TrainData。
在构造TrainData的过程中,需要考虑时间衰减的因素,我们引入衰减因子,sum(1/(1+aipha*Days)).
TestData准备:8.01-8.15(C)之间所有购买的数据。
在虚拟机中,具体过程如下:
(1)计算A中所有点击visit_datetime距7.16时间间隔,用如下SQL代码执行:
(2)考虑时间衰减因子,group by同一个user_id对brand_id的总的clickValue,这里的alpha初步设置为0.8
(3)通过步骤1和步骤2已经生成了triandata中的点击数据,现在生成相对应的y为1数据样本:
抽取所有y=1的样本,利用Xlab填充y为NULL的样本的y值为0,随机采样y=0的样本,控制和y=1的比例接近(正负样本比例接近),将正负样本进行合并,最终生成完整的TrainData(user_id,brand_id,clickvalue,y)
(4)利用Xlab工具对完整的TrainData进行逻辑训练,生成训练的模型表。
(5)针对模型,在TestData(C)上上进行预测,产生训练结果表(包括调参)。
(6)对结果表按照提交格式进行提交数据。
B.通用多模型Ensemble过程
在推荐系统中,比较通用的多模型Ensemble过程应该是这样的,我们以阿里大数据推荐竞赛来具体理解一下。
将数据的前3个月的交互数据(其Label为第4个月的购买情况)划分为80%的数据作为Train,20%的数据作为Test。
1、80%的Train数据训练出Model_0,Model_1,Model_2…Model_i.
2、20%的Test中的前三个月交互数据(不包括Label)作为测试数据输入Train出来的各个Model_i,分别得到每一个Model_i的(u,b,probability_i).
3、将2中得到的test结果组成一个大的特征,(u,b,probability_0,probability_2…probability_i.label),其中Label来自Test中原本存在的Label,将这个数据重新训练(LR,RF,GBDT),产生EnsembleModel.
4、将后三个月的数据用Model_0,Model_1..训练得到相应的probability,将这些结果拼装成(u,b,probability_0,probability_2…probability_i)的形式,再用EnsembleModel再训练一次,得到最后的Probability,最后取TOPN进行提交
注意:在线上提交阶段,真正的是需要用100%的训练数据进行Model训练,但是考虑到比赛时间的限制,80%的数据进行训练的Model_i 可以作为线上直接使用。
C.在ODPS中运用SVD分解思路(虽然对于这次大赛效果很不好,最后也没有用上任何FM,但是对于我理解SVD还是有一些帮助,就随便写一点了)
由于odps中表格的列最大为1024,所以我们选取打分最高的top1000 brand作为svd分解估计的brand。
线下测试:
1、把gbrt结果y_val作为开始u和b之间的pro
2、svd分解,选出未交互的ub对,然后加上u特征和b特征,进行gbrt或者rf训练
3、得到数量较小的但是准确率较高未交互的ub属性。
SVD基本思路:
构建userNum*brandNum矩阵matrix,矩阵的初始值matrix(i,j)表示用户i对品牌j的相关度,值越大越表示该用户与品牌的相关度越大
[u,s,v]=matrix.svd(k)
取奇异值的前k个
讲分解的结果重新乘回去,得到新的矩阵,即可以得到某用户与brand未交互的相关度
result=u*s*v.transpose();
5、分享一些体会与收获
1、这比赛对我最大的收获应该是从比赛中重新找回自信吧,从宁大保研来浙大之后,可能没有完全适应浙大竞争激烈的环境,不管是在实验室科研上,还是生活中的种种都不是特别顺利,开始慢慢地怀疑自己,变得不像本科的时候那样的自信,通过比赛,重拾自信,重新上路。
2、参加这种比赛,选择靠谱队友很重要,队友之间的配合非常重要,对于我们最后能够取得Top30的成绩,我觉得我和队友小鱼之间的配合做的还不错,两个人的参与热情高,愿意花时间,小鱼主要负责前期的建模过程,利用SQL提取特征,以及后期的模型融合以及上交结果,而我主要负责在模型初期和小鱼讨论特征以及建模整个过程,最重要的工作主要是利用ODPS上的mapreduce代码的编写用来提取我们想要的特征。
3、信息的获取很重要,我们承认,至少是我承认,我们有没有非常厉害的创造创新的能力,我们的思路主要来自组内的交流以及和其他队伍的交流,我觉得我们这一点一开始就非常重视也做的还不错,但也有像实验室另一个同学所说的,这可能是不能超越其他强队的原因,我觉得他说的也非常有道理。而我更加认为偏向于当我们没有达到某一种高度成绩没有到达一定的程度就去做创新的东西很难,就比如这个比赛中应该是夺冠的Marvel,他做了未交互的ub部分预测,并且取得了意想不到的效果,但是你要想想,有多少支队伍尝试做过这部分工作,至少最终的top50都有做过吧,并且花的时间肯定都不少,都没有取得想要的好的结果。
4、比赛过程中代码的自动化非常重要,前期花了不少时间花在一些无谓的地方,现在回过头来想想可能觉得有些可惜,不过也有可能就是摸着石头过河吧。
5、比赛的笔记记录非常重要,因为这次比赛时间非常长,数据有非常多的版本,所以需要记录每一个version的算法、特征提交后的成绩等,要不然到后期根本搞不清楚。
6、关于比赛的一点小遗憾就是,最后的模型融合可能没做好,原因之一是前期花的时间也不是很多,没有划分Train和Test再次训练模型之间参数来Ensemble,现在想想有些许小遗憾。
7、这三个月,和队友,瞒着导师偷偷做阿里的大数据比赛,异常地艰辛,不敢在实验室激烈的讨论,这三个月生物钟完全乱掉,每天凌晨4点多钟起来看成绩,和小鱼互发短信简单分析成绩没提高的原因,抑或是分享成绩提高名次进步带来的快乐,特别是最后换数据之后,因为集群很卡,为了避开使用的高峰,凌晨起来跑程序,记得7.24-25那几天,晚上就只睡3-4个小时,比赛的激烈程度真是只有经历过的人才懂,这个比赛能够坚持下来并且取得不错的成绩真的很辛苦,从S2开始到结束起码创建了1000+张的表格了吧,我们每一份特征都用一个新的Label标识,起码20+吧,我想如果这三个多月没有小鱼的鼓励和帮助,我一个人是肯定坚持不下来的,这三个多月的付出,其中的酸甜苦辣真的只有自己经历过了才知道,现在想想一切都是那么值得。
转载请注明:数据分析 » 阿里大数据推荐大赛经验总结