一、前言
这个比赛是本人参加的第一个算法比赛,纯属学习,也算是体验了一下算法比赛是怎样一个流程。当然了成绩是很一般的,而且每每成绩有所提升总是因为一些大佬又提供了新的思路与代码。不过在这种实践中也学习了很多之前没了解过的知识,开了眼界。也要感谢实验室带我的各位师兄,体验不错,虽然很菜,下次还来。
二、比赛介绍
“消费者人群画像—信用智能评分”是由中国移动福建公司&新大陆科技集团举办的赛事,由中国移动福建公司提供包括客户的各类通信支出、欠费情况、出行情况、消费场所等丰富的多维度数据。参赛者通过分析建模,运用机器学习和深度学习算法,准确评估用户消费信用分值。
赛题链接:/competitions/337/details
三、比赛回顾
目前似乎还没有排名比较靠前的开源代码,那我就简单梳理一下这段时间来个人的学习历程,顺便整理学习资料,做一做总结。
1、数据分析
在确定参加这个比赛之后的第一件事便是学习python中的pandas模块。
pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
可以说pandas是这个比赛最基础的工具了,它为我们处理数据提供了非常便捷的途径。但本人在使用pandas时还是磕磕绊绊的,一方面是因为对他了解的不全面,一方面是因为一些处理方式在pandas中没看到,直到看别人的代码才直到还能这么用。查找资料一般都是从中文文档中查找,当然有时候偷懒也会直接百度某一操作,看看其他人是怎么处理的。
pandas中文文档:/
比赛的训练集与测试集均为50000条数据,共有28个特征,主要有数值类特征和布尔型特征两类,两个数据集表面上均无缺省值,但一些特应该是主办方已经经过填0处理了,比如年龄特征。
2、模型选择
一开始自己在测试时尝试了随机森林,svm和adaboost等模型,效果最好的是随机森林,但后面学习了其他大佬的代码后发现他们都是使用lightgbm和xgboost,所以也学着使用,虽然还不是特别清楚这两个模型,但应该是相对于传统的模型在训练速度,预测结果有了比较大的提升。
3、特征工程
说到特征工程,就不得不提一提刚开始豪情万丈构建的那200多个特征(当然大多都是两两四则运算出来的东西),测试了一下比只有原特征的数据集的准确度还是提升了一些的,还挺开心的,结果拿那些特征做了一份结果上交成绩差得不敢相信。果然靠蛮力还是不行的。
接下来的特征工程基本上都是学习着别人如何构建的了。首先是从其他比赛中学习,首先是在去年腾讯广告算法大赛中学习一些大佬是如何构建特征的,大致了解了一下特征工程是怎么回事。自己也尝试人工构建了四五个觉得可能有意义的特征,但是效果还是一般吧。然后是在github上找到了关于这个比赛的一些开源代码,在用户“renxingkai”的Credit_Score_Baseline中学习到了许多不错的特征。发现其中的比例特征还是比较少的,所以也尝试构建了一些比例特征,但是效果不怎样。
再后来看了一些周榜第一大佬的思路才注意到数据集是官方填零处理过的,主要是年龄特征,约有5%年龄为0的。自己的想法是将其他年龄不为零的用户作为训练集,将年龄为零的用户作为预测集来得出那些丢失的年龄。但是尝试了之后发现预测的正确率有点低,只有0.3,也想不到什么其他办法,所以最后采取的方法是将零替换成年龄中的众数。
4、模型提升
之前了解到的模型效果提升只有调参,通过这次比赛学习了其他的方法。
首先学习的是竞赛宝典中公众号“kaggle竞赛宝典”中“尘沙杰少”的文章《MSE+MAE提高回归精度的方法(消费者人群画像—信用智能评分为例)》,文章介绍将MAE和MSE结合的方法提高预测的精度。平方损失(MSE)的函数对于较大值的惩罚较大,而优化MAE的指标则比MSE更加注重较小值的优化,因此文章提出用MSE预测修正MAE预测值中较大值的方法,对预测结果起到了一定的提升作用。
然后是知乎的一篇文章《DCIC-消费者人群画像—信用智能评分_中期Baseline》,文章提到使用stacking对lightgbm和xgboost进行融合的方法,对模型融合我的理解是不同的模型可能对同一部分数据的训练结果是不一样的,对不同部分的数据采用效果较好的模型对结果进行修正,以达到提高效果的目的。想法是很不错的,但是应用到这个比赛的数据集中似乎效果不佳,因为单模型的lgb模型比融合模型后的结果是要更高的。目前还是等着比赛的优胜者们分享做法。
交叉验证。几乎在看到的有关代码中都用到了交叉验证的方法。交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法,该理论是由Seymour Geisser提出的。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。这个过程一直进行,直到所有的样本都被预报了一次而且仅被预报一次。把每个样本的预报误差平方加和,称为PRESS(predicted Error Sum of Squares)。
5、自己的尝试
作为一个小菜鸡在这个过程中还是头铁地进行了自己的一些尝试,虽然似乎大部分都莫得用。
一开始是前面有说到的特征工程的构建,一开始的想法是先构建足够多的特征,在模型中训练后再挑出重要性比较高的那些,但是没能得到一个好的结果,可能是由太多无用特征干扰了结果?
接下来是同样前面有提到的缺省值预测,想法感觉还是不错的,就是被预测的准确度劝退了。但还是没有放弃,(因为年龄是排第一的强特)我想着相同年龄段的人应该会有类似的行为,比如去商场的次数,通话的人数等,所以我把除年龄外的特征拿出来作为向量,计算向量的相似度,希望通过这个相似度提供年龄的判断,实验之后发现没什么规律可言,所以最后还是放弃了。
还有就是比赛快结束前几天看到了伪标签的方法,这种半监督的学习方法可以增强模型的鲁棒性。但尝试了之后发现正确率低的离谱,可能是自己方法错了吧。
唯一一个成功的尝试就是把上文模型提升中提到的MAE+MSE方法结合到github的代码Credit_Score_Baseline中,并只采用单模型进行预测,获得了0.0697的成绩,然后就没再提升过了。
五、总结
以上便是参加这个比赛的一个过程,学到还是不少的。也越来越感到自己学到的真的挺少的,而且也不系统,今后再接着努力吧
如果觉得《消费者人群画像—信用智能评分 比赛回顾》对你有帮助,请点赞、收藏,并留下你的观点哦!