DataFoundation比赛总结
2018.3.20号左右,因为研究生的数据挖掘课程的老师要求我们集体参加一个比赛 ,所以在比赛参与时间、比赛难度和比赛类型的几种条件下,我们选择了2018平安产险数据建模大赛-驾驶行为预测驾驶风险比赛,这个比赛是由平安保险公司提供数据,借由DataFoundation和CCF联合平台举办的赛事。参加比赛一共两个月,因为是初次参加参赛,加上投入的时间不够,所以结果不是很好。但是这次经验是为了下个学期再参加比赛积累,所以特此总结一个整个比赛过程,反省一下。
比赛数据、比赛过程记录、比赛代码都已经上传到github 地址https://github.com/20130353/pingan_competition.git,方便随时回顾。
比赛中存在问题
- 没有验证线上和线下数据是否一致。
比赛最开始的时候,因为时间不够,临时分析了一下数据。但是这次比赛不一样的是,有线上和线下数据的区别,我们只分析了线下数据,完全没有考虑线上数据。作为数据分析人员,做比赛的时候我们必须要充分了解数据特性和数据分布,同时需要打比赛的时候要确定线上和线下数据是否一致。并针对结果进行不同的处理。当然很多时候线上数据和线下数据分布应该是一样的,因为线下数据是从线上数据中随机抽取的一部分。
- 没有找对正确的训练数据。
正如第一点所说,我们只分析了线下数据没有分析线上数据,但是事实上比赛方只是把线下数据作为测试用例,真正的训练数据和预测数据都在线上,所以我们一开始分析的只是测试用例,这对后面的数据挖掘完全没有用。
- 没有确定数据的范围和缺失。
没有确定数据的范围和缺失也意味着没有预处理,经过后来的预处理结果和没有预处理的结果对比,发现经过预处理的结果效果提议提升0.01。所以最开始还是要预处理。
- 预处理方式选择太多。
小组每个成员对于丢失数据的处理方式对不一样,每个人有每个人的道理,但是事实上训练数据达到百万级别,丢失数据和错误数据的比例很小,不同的预处理方式影响很小,所以没有必要考虑太复杂的预处理方式。同时考虑到这次比赛的平台计算要求,我们应该选择代价的方式处理数据。所以这个问题告诉我们,预处理的方式不一定只考虑最后结果,要在软件和硬件两方面的考虑下,选择最合适的方式。
- 代码写的太慢。
因为对python不熟,所以写代码非常慢,即使是有想法但是实现想法可能需要几天甚至是几个星期。
- 优化代码时想的太多。
因为比赛平台的硬件条件很差,所以对时间和内存要求很大,我们在优化代码方面耗时非常长,但是事实上是没有必要的,一方面我们可以直接从网上找最简单的方式优化代码,另一方方面可以直接问同学,毕竟我们是一个班参加比赛,大家遇到的问题差不多,为什么不直接请教同学从而快速解决问题呢?当时我想问同学时,同组成员觉得这是别的同学的辛苦劳动成果,担心人家是否会给我们,担心很多问题,但是我觉得这只是个比赛,同学直接就是相互学习,没有必要把竞争放到这里来,但是我仍然是在尝试了很久之后才问同学的,中间耽误了不少时间,所以我应该吸取教训。以求在最短时间内解决问题,比赛就是要在最短时间内找到最好的结果。
- 没有充分利用特征。
原始数据只提供了九个特征,所以我们得自己创造特征,我们找了很多资料创造了很多合理的特征,但是结果并不好,所以我们认为是特征的问题。但是有同学不断实践证明特征的结果搭配好的模型可以提醒效果。而我们从头到尾只使用了一种模型,遇到结果不好,我们就认为是特征不好,否定了这些特征,这样实际上浪费了这些特征的价值,同时也是浪费时间。
- 没有充分利用python的工具包。
详细地说就是眼界不够广,不知道很多现成的工具包,只知道sklearn的几个基本工具包,但是sklearn里的模型都是很旧的模型,效果也一般。最近很多的xgboost、lightBGM等模型,就用模型的默认值就可以取得很好的效果。
- 写的代码总是有问题。
感触很深的是代码写完之后经常是线下测试数据没有问题,但是线上就出错。写代码的时候完全没有想过线上是否可行,每次等待在线测试几个小时之后出bug了才知道,但是浪费几个小时的时间。这也反映出自己写代码的不严谨性,所以以后要多考虑看看在提交。
值得借鉴的博客
在作比赛的过程中参考了很多有意义的博客,在这里mark一下,为后面作比赛做准备。
博客中重点要看的是:
整套流程博客 https://blog.csdn.net/guoxinian/article/details/73740746
天池比赛经验总结 - https://segmentfault.com/a/1190000012084849
因为这两篇博客的都包含整个流程,对刚开始做比赛的同学来说,这个具有很大的指导意义。其中天池比赛经验的博客的实战意义更好。
剩下的就是一些常规博客。
- 十分钟搞定 - pandas https://www.cnblogs.com/chaosimple/p/4153083.html
- 正负相关分析博客 https://blog.csdn.net/kt513226724/article/details/79843073
- 基本信息可视化博客 https://blog.csdn.net/qq_24330285/article/details/80707504
- 缺失值处理 - https://blog.csdn.net/lujiandong1/article/details/52654703
- Xgboost 原理和实战 - https://blog.csdn.net/sinat_22594309/article/details/60957594
- Xgboost 原理 - https://blog.csdn.net/sinat_22594309/article/details/60957594
- Xgboost 调参过程 - http://www.cnblogs.com/harvey888/p/7203256.html
- Xgboost 调参过程 - https://blog.csdn.net/han_xiaoyang/article/details/5266539
- Xgboost 调参经验 - http://www.cnblogs.com/mfryf/p/6293814.html
- LGB 原理 - https://blog.csdn.net/niaolianjiulin/article/details/76584785
- LGB 参数速查 - https://blog.csdn.net/weiyongle1996/article/details/78446244
值得坚持的习惯
在比赛过程,我养成了记录文档的习惯,同时又将文档分成python学习记录文档、比赛过程记录两个文档,我觉得这样记录有助于帮助思考和记录过程,有时候因为研究生学业太忙一段时间没有做比赛就会忘记做到哪里了,需要话很长时间来回忆,有文档之后可以直接查文档,而且文档的时候会有源源不断的新想法冒出来,帮助扩展想法。
但是有个问题是,我是将比赛结果记录和想法记录记录写在一起的,有时候要看自己的比赛结果就很不方便,所以下次作比赛需要把想法和结果单独分开来写。
DataFoundation比赛总结的更多相关文章
- Livecoding.tv 现正举行iOS及Android App设计比赛
近日,Livecoding.tv, 一个为世界各地的程序员提供在线实时交流的平台,在其网站上发布了一篇通知, 宣布从4月15日至5月15日,会为iOS和Android的开发者举办一场本地移动app设计 ...
- 为什么我如此热爱这样一个比赛(转自vici)
为什么我如此的热爱这样一个比赛呢?因为它总能带给我一个目标,让我去努力实现它.因为可以看到胜利的希望,于是不断的去追逐.虽然其中的过程可能是比较艰辛的. 对于天才选手,作为天生的冠军,大概凭借天赋 ...
- HDU(1285)—确定比赛名次
/*最近都在复习期末了...好久没做题,都快没智商了*/ 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...
- 白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现
离去年“马尔可夫链进行彩票预测”已经一年了,同时我也计划了一个彩票数据框架的搭建,分析和预测的框架,会在今年逐步发表,拟定了一个目录,大家有什么样的意见和和问题,可以看看,留言我会在后面的文章中逐步改 ...
- [BZOJ3139][HNOI2013] 比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...
- hduoj 1285 确定比赛名次
http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- 排球比赛计分规则(P205页)
排球比赛计分规则: 1.SPEC的目标是什么?SPEC的目标不包括什么? 为了让大家更加了解排球比赛. 2.SPEC用户和典型场景是什么? 用户:运动员,观众,教练 场景:排球赛场 3.SPEC用到哪 ...
- HDU 1285 确定比赛排名 (数组实现 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) ...
- 确定比赛名次---HDU1285(拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意: 给你每场比赛的成绩,让你根据成绩把排名弄出来 分析: 本来我是用普通方法写的,然后就一直wa, ...
随机推荐
- LeetCode 725. Split Linked List in Parts(分隔链表)
题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度. 分析: (1)首先计算链表总长len (2)根据len得到分隔的链表长度要么为size, ...
- Python学习第十二课——json&pickle&XML模块&OS模块
json模块 import json dic={'name':'hanhan'} i=8 s='hello' l=[11,22] data=json.dumps(dic) #json.dumps() ...
- Hadoop基准测试(一)
测试对于验证系统的正确性.分析系统的性能来说非常重要,但往往容易被我们所忽视.为了能对系统有更全面的了解.能找到系统的瓶颈所在.能对系统性能做更好的改进,打算先从测试入手,学习Hadoop主要的测试手 ...
- 【PAT甲级】1027 Colors in Mars (20 分)
题意: 输入三个范围为0~168的整数,将它们从十三进制转化为十进制然后前缀#输出. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include& ...
- while (rs.next()) 与 if(rs.next())的区别
while (rs.next())是用来循环遍历结果集的. if(rs.next())是用来判断结果集是否有值,有值则执行if语句内代码块. 简而言之 while(rs.next()) 就是将rs全部 ...
- 在Centos 7.7下用minikube部署单节点kubernetes.
centos8 下用yum安装docker-ce会报错,说明docker-ce对centos8支持还不太好.所以在centos7.7下安装 先更新一下系统 yum update 安装 yum工具, ...
- SSM项目中,关于Test类中不能使用Autowired注入bean的问题
在测试类中使用AutoWired注解一直不能获取到Bean,调用方法时一直报空指针异常,我有在其他类中使用AutoWired试了下,发现能够生效.问题应该就是处在Test类中,后面找了半天终于找到问题 ...
- SqlCommand的ExecuteReader方法----转载
SqlCommand的ExecuteReader方法 原创 小道 2018-08-28 17:32:01 阅读 1353 次 评论 0 条 摘要: 用于执行查询语句,并返回一个DataReader ...
- android数据的四种存储方式之一——SharedPreference
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- 拦截指定数据、修改JS -- mitmproxy
mitmproxy 配置 mitmproxy源码:https://github.com/mitmproxy/mitmproxy mitmdump -q:屏蔽mitmdump默认的控制台日志,只显示自己 ...