天池新人赛之新浪微博互动预测
最近参加了天池上的新人赛,把比赛的流程走了一遍,收获挺大。现把比赛思路简单记录一下,欢迎大家一起来讨论交流。
1. 对训练数据进行简单分析
拿到数据集,先对整个数据集做个简要分析,比如数据量大小、每种数据取值范围等,让自己对数据集有个大致认识。因此我对数据集简单分析可得到:训练数据共有122,5088条(仅三条内容有缺失值),涉及37251个用户,每个用户至少发一条博文,博文最多数量前十在4909~31015条。
2.划分训练集和测试集
第二步就是划分合理的训练集和测试集。 整个数据集的时间跨度为(2015-02-01至2015-07-31),我打算以三个月的数据为训练集,之后的一个月数据集为测试集。因此整个数据集可以划分为以下三个部分:
- 训练集一(674019):2015-02-01 ~ 2015-04-30 - 测试集一(188029):2015-05-01~2015-05-31
- 训练集二(621376):2015-03-01 ~ 2015-05-31 - 测试集二(178823):2015-06-01~2015-06-30
- 训练集三(573141):2015-04-01 ~ 2015-06-30 - 测试集三(184214):2015-07-01~2015-07-31
- 预测集(177923):2015-08-01~2015-08-31
3.特征工程
第三步是最为关键的,因此要找出最直观、最重要的特征。这里我从三个方面入手:用户特征、时间特征、博文特征。
3.1 用户特征
-最大评论数、点赞数、转发数
-最小评论数、点赞数、转发数
-平均评论数、点赞数、转发数
-最大评论/点赞率、转发/点赞率
-最小评论/点赞率、转发/点赞率
-平均评论/点赞率、转发/点赞率
-评论数、点赞数、转发数大于平均值的概率
3.2 时间特征
-是星期几
-是否周末
-是否是节假日
-发文时间段(分24个时间段)
3.3 博文特征
由于不会nlp,因此就只是使用jieba提取出现频率最高的20个关键字。
前1000个数据:cn,http,小伙伴,转发,PS,教程,分享,Photoshop,转给,大家,技巧,学习,设计,需要,微博,方法,效果,程序员,简单,doge。
前100个数据:小伙伴,转给,cn,http,Photoshop,分享,PS,教程,大家,技巧,需要,方法,效果,参考,学习,转发,设计,实用,利用,照片。
选用关键词:小伙伴、分享、转发、转给、教程、大家、技巧、方法、效果、学习、实用、简单、红包、免费、福利、奖。
- 是否含有“小伙伴、分享、转发、转给、教程、大家、技巧、方法、效果、学习、实用、简单、红包、免费、福利、 奖”等关键字眼(处理成含有关键字的数量)
- 是否有主题(微博内容中含有##)
- 是否@他人
- 是否是转发他人的微博(微博中含有“【】”)
4.模型
4.1 线性回归模型
先讨论不同训练集训练的线性回归模型的准确率情况:不同训练集训练的模型大致相似,对预测结果起决定性影响的是预测数据特征的准确性,因此如何保证预测数据的特征的准确性是至关重要的,尤其是对缺失值的处理。
现讨论缺失值如何处理问题:利用所有数据集进行预测有699个用户无法获得特征值,那么是用0来填充还是均值来填充效果更好?分析思路,对前几个训练集分析新增用户的函数值是趋于0还是趋于均值。
- 训练集一:3251条新数据,用0填充的准确率为 0.579239766082,用均值来填充的准确率为0.0178362573099
- 训练集二:9112条新数据,用0填充的准确率为 0.781565753953,用均值来填充的准确率为0.00817585807944
- 训练集三:5206条新数据,用0填充的准确率为 0.624848973017,用均值来填充的准确率为0.0299033427306
可见缺失值填充为0的效果显著,从现实意义上也很容易理解,若用户在前几个月没有数据则该用户很大可能是新用户,因此相应点赞数、评论数、转发数也很可能为0。
在训练模型的过程中,发现仅使用用户特征预测的准确率(28%左右)要高于用上所有特征的预测结果(26%左右),然后我就怀疑是不是我的特征提取的不合理。带着这个问题,我打开了SPSS分析软件进行相关性分析,结果表明:不存在某个特征变量与转发量、评论量、点赞量同时不相关,大部分特征变量都同时与转发量、评论量、点赞量相关。后来才知道,本题给出的评判标准并非准确率,而是一种关于相对准确的计算(后面会分析)。
利用用户特征进行线性拟合,提交结果系统给出的评判结果为:27.27373545%。
4.2 决策树回归
由于觉得决策时模型比较容易理解,然后我就尝试用决策树回归模型来预测该问题。通过对三个数据集调参发现,决策树的最大深度为20,最小划分样本和最小叶子样本数都为10,mse小于1(这些参数选择相对最优)。可最终提交结果系统给出的评判结果为:26.23863679% (20,10,10)、26.01225228%(20,10,5),效果还没有线性回归好,我崩溃了。。。不解为啥模型逼格上去了,预测结果竟然下来了。一边安慰自己“最简单的就是最好的”,一边分析原因,然后我把锅又推给了评判标准,接着就有了下面的搜索模型。
4.3 搜索模型
提取的特征工程不起作用?复杂模型预测效果不好?答案就是评判标准。然后我就按照网上这种思路:以评判标准为导向,对于每一个用户取使其评判值最高的数据。这里也是两种思路:
第一种是一层循环,仅循环该用户已出现的所有组合。
- 对测试集一进行测试的准确率结果:0.358746969504
- 对测试集二进行测试的准确率结果:0.359069119304
- 对测试集三进行测试的准确率结果:0.365967187456
提交结果系统给出的评判结果为:30.04590604% 。
第二种是三层循环,对转发数、评论数、点赞数分别从最小值循环到最大值。(由于代价太高,只能对部分数据使用此方法,而且步长也设置一个相对值),由于只针对有用的数据进行三重循环,因此没有测试线下数据的结果,提交结果系统给出的评判结果为:30.05774245%。
4.4 攻略进阶
我感觉搜索模型就是一种比赛的套路,对于实际工作没有参考价值,不过这个想法蛮有意思的。如果你想认认真真比赛,请参考:天池微博大赛攻略进阶。
天池新人赛之新浪微博互动预测
最近参加了天池上的新人赛,把比赛的流程走了一遍,收获挺大。现把比赛思路简单记录一下,欢迎大家一起来讨论交流。
1. 对训练数据进行简单分析
拿到数据集,先对整个数据集做个简要分析,比如数据量大小、每种数据取值范围等,让自己对数据集有个大致认识。因此我对数据集简单分析可得到:训练数据共有122,5088条(仅三条内容有缺失值),涉及37251个用户,每个用户至少发一条博文,博文最多数量前十在4909~31015条。
2.划分训练集和测试集
第二步就是划分合理的训练集和测试集。 整个数据集的时间跨度为(2015-02-01至2015-07-31),我打算以三个月的数据为训练集,之后的一个月数据集为测试集。因此整个数据集可以划分为以下三个部分:
- 训练集一(674019):2015-02-01 ~ 2015-04-30 - 测试集一(188029):2015-05-01~2015-05-31
- 训练集二(621376):2015-03-01 ~ 2015-05-31 - 测试集二(178823):2015-06-01~2015-06-30
- 训练集三(573141):2015-04-01 ~ 2015-06-30 - 测试集三(184214):2015-07-01~2015-07-31
- 预测集(177923):2015-08-01~2015-08-31
3.特征工程
第三步是最为关键的,因此要找出最直观、最重要的特征。这里我从三个方面入手:用户特征、时间特征、博文特征。
3.1 用户特征
-最大评论数、点赞数、转发数
-最小评论数、点赞数、转发数
-平均评论数、点赞数、转发数
-最大评论/点赞率、转发/点赞率
-最小评论/点赞率、转发/点赞率
-平均评论/点赞率、转发/点赞率
-评论数、点赞数、转发数大于平均值的概率
3.2 时间特征
-是星期几
-是否周末
-是否是节假日
-发文时间段(分24个时间段)
3.3 博文特征
由于不会nlp,因此就只是使用jieba提取出现频率最高的20个关键字。
前1000个数据:cn,http,小伙伴,转发,PS,教程,分享,Photoshop,转给,大家,技巧,学习,设计,需要,微博,方法,效果,程序员,简单,doge。
前100个数据:小伙伴,转给,cn,http,Photoshop,分享,PS,教程,大家,技巧,需要,方法,效果,参考,学习,转发,设计,实用,利用,照片。
选用关键词:小伙伴、分享、转发、转给、教程、大家、技巧、方法、效果、学习、实用、简单、红包、免费、福利、奖。
- 是否含有“小伙伴、分享、转发、转给、教程、大家、技巧、方法、效果、学习、实用、简单、红包、免费、福利、 奖”等关键字眼(处理成含有关键字的数量)
- 是否有主题(微博内容中含有##)
- 是否@他人
- 是否是转发他人的微博(微博中含有“【】”)
4.模型
4.1 线性回归模型
先讨论不同训练集训练的线性回归模型的准确率情况:不同训练集训练的模型大致相似,对预测结果起决定性影响的是预测数据特征的准确性,因此如何保证预测数据的特征的准确性是至关重要的,尤其是对缺失值的处理。
现讨论缺失值如何处理问题:利用所有数据集进行预测有699个用户无法获得特征值,那么是用0来填充还是均值来填充效果更好?分析思路,对前几个训练集分析新增用户的函数值是趋于0还是趋于均值。
- 训练集一:3251条新数据,用0填充的准确率为 0.579239766082,用均值来填充的准确率为0.0178362573099
- 训练集二:9112条新数据,用0填充的准确率为 0.781565753953,用均值来填充的准确率为0.00817585807944
- 训练集三:5206条新数据,用0填充的准确率为 0.624848973017,用均值来填充的准确率为0.0299033427306
可见缺失值填充为0的效果显著,从现实意义上也很容易理解,若用户在前几个月没有数据则该用户很大可能是新用户,因此相应点赞数、评论数、转发数也很可能为0。
在训练模型的过程中,发现仅使用用户特征预测的准确率(28%左右)要高于用上所有特征的预测结果(26%左右),然后我就怀疑是不是我的特征提取的不合理。带着这个问题,我打开了SPSS分析软件进行相关性分析,结果表明:不存在某个特征变量与转发量、评论量、点赞量同时不相关,大部分特征变量都同时与转发量、评论量、点赞量相关。后来才知道,本题给出的评判标准并非准确率,而是一种关于相对准确的计算(后面会分析)。
利用用户特征进行线性拟合,提交结果系统给出的评判结果为:27.27373545%。
4.2 决策树回归
由于觉得决策时模型比较容易理解,然后我就尝试用决策树回归模型来预测该问题。通过对三个数据集调参发现,决策树的最大深度为20,最小划分样本和最小叶子样本数都为10,mse小于1(这些参数选择相对最优)。可最终提交结果系统给出的评判结果为:26.23863679% (20,10,10)、26.01225228%(20,10,5),效果还没有线性回归好,我崩溃了。。。不解为啥模型逼格上去了,预测结果竟然下来了。一边安慰自己“最简单的就是最好的”,一边分析原因,然后我把锅又推给了评判标准,接着就有了下面的搜索模型。
4.3 搜索模型
提取的特征工程不起作用?复杂模型预测效果不好?答案就是评判标准。然后我就按照网上这种思路:以评判标准为导向,对于每一个用户取使其评判值最高的数据。这里也是两种思路:
第一种是一层循环,仅循环该用户已出现的所有组合。
- 对测试集一进行测试的准确率结果:0.358746969504
- 对测试集二进行测试的准确率结果:0.359069119304
- 对测试集三进行测试的准确率结果:0.365967187456
提交结果系统给出的评判结果为:30.04590604% 。
第二种是三层循环,对转发数、评论数、点赞数分别从最小值循环到最大值。(由于代价太高,只能对部分数据使用此方法,而且步长也设置一个相对值),由于只针对有用的数据进行三重循环,因此没有测试线下数据的结果,提交结果系统给出的评判结果为:30.05774245%。
4.4 攻略进阶
我感觉搜索模型就是一种比赛的套路,对于实际工作没有参考价值,不过这个想法蛮有意思的。如果你想认认真真比赛,请参考:天池微博大赛攻略进阶。