数据挖掘实战,实时推荐系统实战

第一次参加数据挖掘比赛,虽然前面打过KDD CUP的比赛,而且类型都是差不多的,但是那次也只是分析了一下数据,然后用统计量做了一下填补而已。而这次我们要动真格的了,我们要用机器学习的模型去生成结果——大杀器Xgboost。至于Xgboost的厉害之处,我会在另一篇blog上写一下,据老师私下里给各个模型的排名,Xgboost除了在图像处理上略逊于深度学习,在其他领域上应该都是最厉害的模型了。


第一次提交结果。

第一天的时候,我们并没有去分析什么数据(其实以后也没怎么分析,我认为这也是我们犯下的一个很大的错误),而是直接去填了一个历史中位数,我当时并没有理解为什么要用这么个简单的中位数去填补结果,只是在第二天早上起来睡得懵懵地看了一眼线上结果,MAPE在0.4284,在当天排名中占25名。当时感觉还不错的,也没有在意什么别的东西,到了第二赛季的时候想了想,这么提交个中位数应该是为了获得一个MAPE标准,看看建模比这个统计量能提升多少。当时没有测试线下数据集的MAPE,也没有对提交有一个详细的日志,导致到了第二赛季刚开始时,很多问题找不到原因,想与第一赛季同样方法做出的结果做对比时却没有数据的尴尬。后来又对这个统计量做了一下优化,但是并没有提升多少,可见这种在KDD CUP上做起来效果还不错的方法在这次比赛上并不好。我觉得可能是这次比赛数据量比较大的原因吧,当数据量比较大时模型训练的就越完备,预测的也就越接近真实值,这是我的理解。


Xgboost建模。

由于有了之前用Sklearn中的liner-regression建模的经验,这次初次使用Xgboost建模并没有遇到多少的困难,只是Xgboost的训练集和测试集要求使用libsvm格式的文件,我尝试过把训练集和数据集做成libsvm文件的形式,但是出现了各种各样的格式问题。后来发现可以直接用numpy的二维数组导入。。。真的坑。

第一次建模没有采用任何的特征工程,也没有对数据采取任何的预处理,当时的数据纯净度还不是特别好。我们只用了历史中位数和路长两个特征,用了6月份6-7点的数据作为训练集,6月份8点的数据作为测试集来建模,最后的线上结果可以达到0.3540,相对于单纯的使用统计特征MAPE有了将近7%的提升,看来Xgboost果然名不虚传。但是刚刚开始做的时候,我建模的时候感觉特别别扭,因为感觉平时做建模的时候都不是这样做的,后来想了想,这样实际上是在历史中位数和真实值之间做了一个映射,而不是通过特征在历史数据和未来数据中建立映射,所以才会感到很别扭。


改变别扭。

在第二次建模时,我们采用了另一种方式,之前的建模方式是以时间为主要维度进行建模的,而第二次建模我们选择以日期为主要维度进行建模。这次我们选择了历史中位数,预测时间前两小时的旅行时间,路长这三个特征进行建模,最后的效果有了比较大的提升,在线上可以达到0.3273。之所以能够取得这样的提升,在后来我们考虑到了两个原因,第一个可能是在小时时间轴上数据的波动性比较强,第二个可能是因为采用这样的方式数据量比较少,所以我们在采用第二个方式建模时获得了较大的提高。在第二赛季时,我们又尝试过了基于更多特征的第一种建模方式,但是效果也比第二种建模方式差了百分之2,当时我们想可以用第一种模型预测出的结果作为第二种模型的特征,但是最后也没有实现。


猜你喜欢

转载自blog.51cto.com/13924610/2160380