随身云数据挖掘竞赛解题思路
前阵子参加牛客网举办的数据挖掘竞赛,数据源源自中华万年历的“生活圈”数据,类似于朋友圈,用户可以发表各种帖子,也可以对帖子内容进行赞踩等行为。数据内容是用户11月份的帖子浏览记录,以及前27天对帖子的赞踩记录,共约8G。目标任务是根据用户11月份的浏览记录,以及前27天赞踩记录,挖掘出用户的个人喜好,然后预测用户对月末28,29,30这三天出现的帖子的赞踩行为。详细数据如下:
用户11月份浏览记录,记为A,内容为用户id,帖子id,用户对帖子的浏览次数和点击查看详情次数,数据量约为6g,分在了8个文件里。
帖子具体内容数据,记为B,内容为帖子id,帖子标题(可能为空),帖子内容;
用户11月份前27天赞踩记录,记为C,内容为用户id,帖子id,赞踩(用1/0表示)。
当时限于计算资源和自身能力不足,未能处理完全部数据,颇有遗憾,故想在放假前这段时间,利用hadoop试着处理下全部数据。
解决方案
此次竞赛要求参赛者在线提交28,29,30的预测数据,举办方利用真实数据进行比对,计算F1值进行排名。现在比赛结束,无法线上提交数据,由于举办方提供了前27天的赞踩行为数据,故自己将目标任务改为根据11月份前24天预测25,26,27日的赞踩行为,然后根据25,26,27日的真实数据计算F1值,线下判断模型优劣。
1) 赞/踩影响因素分析:
根据举办方提供的数据,赞踩影响因素可确定为帖子的内容及帖子浏览次数。明显,帖子内容为主要影响因素,更能体现用户个人喜好。限于时间关系,这里主要考虑帖子内容。解题大体思路就是对帖子内容进行关键词提取,构造用户喜好特征向量,然后在测试数据上计算帖子相似度,越相似越有相同喜好。
2) 我们要预测25,26,27日的赞踩行为,就得先提取出测试数据和训练数据以及真实数据。
测试数据:在数据集A中提取出25,26,27日用户帖子浏览记录。
训练数据:在数据集A提取前24天的浏览记录。
真实数据:在数据集C中提取出25,26,27日赞踩行为数据。
3) 帖子类型分析
帖子类型分为两种,长文本和短文本。长文本由于其文本够长,特征够多,故采用正常的分词方法就可以提取出特征。但是对于短文本,由于其口语化严重,特征稀疏,得做文本扩充处理。思路为对用户点赞(踩)的帖子进行汇总构建帖子集合,然后在这个集合上进行特征提取,表示用户喜好。
4) 帖子相似度匹配
训练数据里用户喜好特征向量构建好后,在测试数据进行相似度计算,采用余弦相似度计算,然后按相似度进行排名,取topK。
5) K值如何确定呢?提出点赞(踩)比概念。
假设当前用户点赞帖子共有20条,那么在这20条帖子提取出特征向量后,在用户历史帖子浏览记录中找寻与特征向量相似的帖子,假设有100条,那么点赞比就为20/100=1/5。那么在测试数据计算目标帖子相似性时假设有80条,那么认为其会对top16的帖子点赞,K=80*1/5。
6) F1值公式计算
对测试数据进行预测后,得与真实数据进行比对,算出F1值。比赛时这是举办方计算的,在这里得需要自己想怎么计算测试数据和真实数据的F1值。计算出正确率和召回率,目前还没有想这块。
7) 计算难度
由于数据集A是按照时间排序给出的浏览记录,要想得到某个用户这一个月的记录,得按用户进行排序。即使分成了8个文件,那对每个文件按用户进行排序后还要进行合并,6G的文件工作量会很大。
在用R进行提取关键字时,遇到一个问题,它可以对一个字符串提取关键字,例如“我爱北京天安门”,可以提取出来关键字“北京”“天安门”。可是当对文件的某一行进行关键字提取时出不来结果,即使文件的该行也改成了字符串格式。这个问题困挠了我好久,实在不行就试试用java的Ansj或者jcseg分词包。
实验步骤
1) 搭建R+hadoop环境,我在自己的电脑上搭建过hadoop环境,但是用的cygwin,没用虚拟机,但是我觉得过程差不多。搭建完全分布,再结合R估计得用2天时间。
2) 本地调试代码,成功后在hadoop上执行,目前不清楚的是R如何远程调用hadoop。大概需要5天时间。
3) 分析实验结果。大概需要1天时间。
预期效果
比赛排名第一的F1值约为0.2,希望我的方法结果也能接近0.2。