AI比赛入门攻略(干货)
AI比赛入门攻略(干货)
我把比赛经验分成3部分:
天池比赛的参赛经验(比赛篇)
打比赛的大致套路(套路篇)
完成天池比赛需要哪些实用的工具(工具篇)
(比赛篇)
1.1问题分析(如何破题)
拿到赛题以后,第一步就是要破题,我们需要把该问题转化为相应的机器学习问题。最常见的机器学习问题类型有两类:
(一)回归问题
(二)分类问题(二分类、多分类、多标签)
比赛的第一步是要弄清楚问题的背景是什么和数据是什么,这部分可能会有些麻烦,但是如果想要走得远,避免落入陷阱,这一步是值得下大功夫的。
我们先来看一下比赛题目:
竞赛题目
电量预测是电力系统发电计划的重要组成部分,是对购电、发电、输电和电能分配等合理安排的必要前提,是电力系统经济运行的基础。因此,提高电量预测准确率具有重要意义。本次比赛期望参赛者基于给定的扬中市高新区的1000多家企业的历史用电量数据精准预测下一个月的每日总用电量**。探索用人工智能解决电力行业问题,鼓励参赛者尝试融合更多的数据构造特征,利用机器学习和深度学习等人工智能模型来创新性的解决电力预测这一难题。
同时,我们希望参赛者基于我们提供的数据,在预测用电量之外,做一些开放性的探索性分析,挖掘用电规律,找出异常,并给出一些建议,因此分别设立数据创新奖和最佳可视化奖,奖励有新颖发现和可视化效果突出的队伍。
从竞赛题目我们可以知道这次比赛是一个回归类的问题,是预测下一个月每日该地区的总用电量,其中有一条是鼓励选手自己构造特征。同时这个比赛挺有意思的主办方鼓励选手进行一些开放性的探索设立了数据创新奖和最佳可视化奖。
为了进一步理解和分析问题,我们需要阅读的是比赛的赛题描述和数据两个部分。
竞赛数据
本次竞赛主要数据源为企业用电量表Tianchi_power,我们抽取了扬中市高新区的1000多家企业的用电量(数据进行了脱敏),包括企业ID(匿名化处理),日期和用电量。具体字段如下表:
初赛注意事项( 复赛不允许数据上传下载,提供统一气象数据 )
在本次比赛中允许使用外部数据,但要求数据是免费提供的。如果参赛队伍有使用外部数据,则必须在复赛结束前向组委会提交数据来源及数据使用说明,组委会将评估数据使用的合理性,并判断是否违规。
参赛者可以参考其他外部数据,比如天气、经济数据,但是使用外部数据的时间范围必须在预测时间之前获取的数据。例如:要预测2016年9月每天的用电量,如使用天气数据,则只能使用2016年8月31日及以前的真实天气数据,2016年8月31日以后的真实天气数据认为在现实业务场景中无法获取,所以不可以使用,但是2016年8月31日做出的对9月的天气预测值可以使用。
tianchi_power表:
天气数据表:
数据的描述部分告诉了我们主办方的意图:主办方抽取了扬中市高新区的1454家企业的2015年1月1日-2016年8月31日每天用电量数据,包括企业ID,日期和用电量,根据这些因素来预测下一个月的用电量。此外主办方还在注意事项里提到了外部数据源的使用(天气数据 经济数据);通过对题意的理解我们基本确定研究的方向:通过对企业****ID 日期和用电量进行分析 自行构造特征构建模型来预测一个月的每日总用电量
分析:数据源只提供了三个属性特征和气数据,基本可以确定模型预测的影响因素不会超过这个范畴。
另外需要特别注意一下评价指标和时间线
评估指标
为防止过拟合,具体评分公式不完全公开,总得分为相对误差的函数,根据每日用电量预测值与真实值的相对误差,通过得分函数映射得到一个每天预测结果的得分,将一个月内的得分汇总,得到最终评分。误差与得分之间为单调递减的,即误差越小,得分越高,误差越大,得分越低。
1.2查找资料(善用天池技术圈 、天池论坛和检索工具)
技术圈里包含着官方的一些申明和通知,还有其他队伍的一些代码或者经验分享,从这里我们可以获取很多有用的信息。另外,一个比较容易忽略但又很重要的一点是要参考之前已经结束的比赛的经验,在这些比赛中也可能包含对这个比赛有用的信息。
比如在这次天池电力AI大赛中,本人就参考了之前天池一些回归类比赛的方案,给了我很大的启发。因为天池至今为止举行的比赛也很有限,我主要参考了《资金流入流出预测》,《广东大赛机场客流量的时空分布预测》,《生活大实惠:O2O优惠券使用预测》,《IJCAI-17 口碑商家客流量预测》这几个比赛的答辩PPT和视频,还有一些之前Kaggle比赛大神的代码和思路。基本上每一届天池比赛都会流出一些他们答辩的PPT和答辩视频可以供我们参考一下,里面有很多闪光的点子和方案足以启发思路,这些资料可以在天池论坛和公众号上找到。
还有一个重要的一点就是多和别人交流,多逛论坛,在这次比赛中我经常和一些队伍交流,有一个队推荐了我一本电力预测的书籍这对我研究问题很有帮助,还有就是多看一些别人的技术博客(CSDN等),一些和本次比赛相关的论文(最好就是之前有这种类似比赛的paper),这次比赛我刚开始用的模型是金融时间序列ARIAM,就经常去优矿这些股票预测的社区去逛,在里面我学到了小波变换和卡尔曼滤波这些算法。
1.3制定和调整解决方案(这是一个迭代的过程)
在这一步之前的准备可能要花好多时间,但是磨刀不误砍柴工,经过之前的准备大概对比赛有了初步的认识接下来就该制定自己的解决的方案啦。
深度学习还是传统方法:
通过调查和翻阅资料我们发现,深度学习容易过拟合而且通常数据量太小的话深度学习发挥的空间很小,结合前几届天池比赛的经验来看,大家还是以传统的机器学习方法为主,后来在第二季比赛数加平台上并没有给选手开通TensorFlow也可以看出此次比赛还是以传统方法为主。
按之前的设想我们分别尝试了以下模型:
1.ARIAM模型总体上预测电量
2.对企业ID分类后分别用ARIAM模型预测电量
3.GBDT模型总体上预测电量
4.XGB模型总体上预测电量
5.ARIAM模型结合小波变换建模
6.ARIAM模型结合卡尔曼滤波建模
7.均值模型与波动率模型
8.精细分类后分别进行XGB模型 均值模型 常数模型
模型评价标准主要采用这两个指标:
MAPE =
1.4结果的记录分析
实验结果的记录和保存很重要,这个是新手很容易忽略的一个环节,如果刚开始没注意好,到后面模型多起来的时候就容易手忙脚乱。
一般模型记录主要记录:
模型参数:模型类型,特征列表,模型参数(比如gbdt模型的树深,随机种子的取值等)
评价结果:K折交叉验证后的各个评价指标的数值。
以下是我们这次比赛记录:
只加日期特征 | 删除异常 | 添加天气 | |||
---|---|---|---|---|---|
平均绝对误差是 | 平均绝对误差是 | 平均绝对误差是 | |||
29048.04628 | 19234.30058 | 19616.16209 | |||
平均相对误差是 | 平均相对误差是 | 平均相对误差是 | |||
707.5369537 | 0.14236436 | 0.145975878 | |||
剩余平方和是 | 剩余平方和是 | 剩余平方和是 | |||
1.31E+12 | 4.39E+11 | 4.79E+11 | |||
回归平方和是 | 回归平方和是 | 回归平方和是 | |||
1.98E+12 | 1.37E+12 | 1.38E+12 | |||
总离平方和是 | 总离平方和是 | 总离平方和是 | |||
2.33E+12 | 1.30E+12 | 1.31E+12 | |||
相关指数是 | 相关指数是 | 相关指数是 | |||
0.435621793 | 0.662222445 | 0.635346302 |
(套路篇)
2.1数据分析
数据挖掘就是从数据中去挖掘我们想要的特征(即平常说的强特),然后应用这些特征便能达到预测的目的,我们需要通过人为的分析,发现数据中存在的特征和问题。我们在观察数据的过程中要注意这几个问题:
-
数据是否存在异常值和缺失值
-
是否存在正负样本不均衡的问题
-
数据是否存在周期性和相关性
-
数据的分布特征
2.1.1 统计分析
对于数值型变量,我们可以对数值型数据进行一些统计分析(例如min,max,mean,std等),可以用pandas进行统计:
record_date | sumPower | max | min | mean | std |
---|---|---|---|---|---|
2015/1/1 | 3026544 | 1924576 | 1589939 | 1757258 | 167318.5 |
2015/1/2 | 3065737 | 1978058 | 1924576 | 1951317 | 26741 |
2015/1/3 | 3125095 | 2012807 | 1978058 | 1995433 | 17374.5 |
2015/1/4 | 3186076 | 2057151 | 2012807 | 2034979 | 22172 |
2015/1/5 | 3246643 | 2129969 | 2057151 | 2093560 | 36409 |
2015/1/6 | 3305394 | 2215586 | 2129969 | 2172778 | 42808.5 |
2015/1/7 | 3344057 | 2345116 | 2215586 | 2280351 | 64765 |
2015/1/8 | 3378191 | 2617715 | 2345116 | 2481416 | 136299.5 |
2015/1/9 | 3397605 | 2906772 | 2617715 | 2762244 | 144528.5 |
2015/1/10 | 3468160 | 2906772 | 1675678 | 2291225 | 615547 |
2015/1/11 | 3498124 | 2900464 | 1675678 | 2288071 | 612393 |
2.1.2分布分析与对比分析
人是视觉动物,更容易接受一些图形化的表示,我们可以通过绘制图表来对数据进行分析,这样更方便我们观察和分析。
以这次电力比赛为例,下面是1454家企业的用电量分布图:
对比图:
周期性分析:
以赛题为例小企业用户用电规律关于2016.1.1对称
2.2数据预处理
主办方给我们的数据可能存在缺失值,异常值的情况,我们需要对数据进行清洗与加工,从而方便进行后续的工作。
2.2.1缺失值
对于缺失值我们常用的方法是插值法
-
均值插值
-
使用拉格朗日等插值法
-
把缺失值当做特征处理
例:在本次比赛中我们对数据进行检测发现有些ID某些日期数据是缺失的,我们尝试过拉格朗日插值和均值插值发现效果都不好,我采用的是均值插值进行微调,事先采集该企业ID缺失值当日前后3天的均值作为当前值。
2.2.2异常值
对于异常值我们主要考虑以下三种处理方式
-
删除异常
-
修正异常
-
作为特征处理
例:在本次比赛中我们对数据进行检测,我们发现在春节附近的时候用电量存在异常,还有许多用户某段时间用电量为1这些都是异常。在比赛的后期,我们先对不同的用户进行了分类然后逐一分析异常,尝试过删除和作为特征这两种发现。通过证明删除异常会更好,这一点可以联系一个模型的三元素也即样本 特征 和模型 样本的选取也是一门学问。
2.3特征工程
有一种说法是,特征决定了效果的上限,而不同模型只是以不同的方式或不同的程度来逼近这个上限,好的特征输入对于模型的效果至关重要(Garbage in, garbage out)。要做好特征工程,往往跟领域知识和对问题的理解程度有很大的关系。
2.3.1特征变换
对一些据有长尾分布的数据,我们需要进行对数变换(使其接近正态分布),使得模型(LR或者DNN)能更好的优化。需要注意的是Random Forest 和 GBDT 等模型对单调的函数变换不敏感,其原因在于树模型在求解分裂点的时候,只考虑排序分位点。
例:在本次比赛中初始使用的ARIMA模型从总体预测下一个月用电量时,我们发现只对数据进行一个简单的log(x)操作然后采用ARMA模型效果会比使用ARIMA效果好很多。
2.3.2 特征编码
对于离散的类别特征,往往需要进行必要的特征编码才能将其作为特征输入到模型中。常用的编码方式有OneHot编码。譬如对于性别这个特征(取值为男性和女性),使用这两种方式可以分别编码为{0,1}和{[1,0]。
例:比如本次比赛weekend和holiday这两个特征就简单的采用了onehot编码。
2.3.3特征映射
特征映射是一个需要经验和技巧的工作,可能需要极大的人力和物力来找一个适当的函数把线性不可分的特征映射成线性可分的特征。(注:找到的函数可能只对当前情境有效换一个场景就不行了 神经网络可以解决线性不可分的问题)
例:左图是线性不可分的,但是经过极坐标系变换就变成可分的了
2.3.4特征抽取
我们应该尽可能多地抽取特征,只要你认为某个特征对解决问题有帮助,它就可以成为一个特征。特征抽取需要不断迭代,是最为烧脑的环节,这是比赛取胜的关键,它值得你耗费大量的时间。
做特征抽取主要是依靠业务知识和个人的经验我的做法是:
-
做容易想到的
-
根据业务场景提取特征
-
根据经验产生特征
特征按类别主要分成这几类:
-
基础特征 例如性别 日期 年龄学历等
-
统计特征 统计的max min mean std等特征
-
组合特征 参考特征构造
-
其他模型产生的特征 例如通过深度学习产生新的特征
特征构造(即构造新属性):广义上讲,特征生成包括结合业务语义关联新的数据特征、或用算法构造新的训练数据特征。
举个例子:为了识别用电量异常用户我们构造线损率这个属性
*线损率=(供入电量-供出电量)/供入电量 100%
我们设置一个阈值线损率高于某个范围可以判定为异常用户。
狭义上也可包括综合两个或多个特征的交互作用而产生新的特征:
对于数值型特征可以通过线性组合、多项式组合来发现新的特征,可以尝试减,加乘法 除 或者与或操作,有时一些诡异交互可能会带来出其不意效果 。
例:比如在这次比赛中我的均值模型是LR 尝试Monthdistance和Dayofweek相加竟然可以提高成绩
关于特征穿越和Magic Feather:
大家在比赛过程中可能会遇到这种情况,在线下加入某个特征时线loss喜喜的提交了结果线上loss反而升高了,我们先不要急于丢弃这个特征,在这个时候我们应该思考这两件事:
1.这个特征是不是信息泄露了,比如我们使用了未来的数据来预测现在。能不能重新构造类似的特征来规避时间。
2.训练集有此特征,而测试集没有
例:比如在这次比赛中预测下一个月的用电量我使用了avgpower(当日企业平均用电量)这个特征,训练集有了这个属性,可是这个在测试集里是不可获取的,导致线下成绩好 线上成绩爆炸。
小技巧:
其实遇到这种穿越特征的问题我们可以采用一些小技巧来规避时间因素的影响来达到目的,在这次比赛中,我把avgpower差分了一个月(代表上个月当日企业平均用电量)这样就不会造成数据穿越的问题,线上成绩也有所提高,一般这种特征我们叫做Magic Feather
2.3.5特征选择
在做特征抽取的时候,我们是尽可能地抽取更多的Feature,但过多的Feature会造成冗余,容易过拟合等问题,因此我们要进行特征筛选。
特征选择的方法有很多,主要的特征筛选方法有:
-
相关度系数(Correlation coefficient),它主要是衡量两个变量之间的线性关系,数值在[-1.0, 1.0]区间中。数值越是接近0,两个变量越是线性不相关。但是数值为0,并不能说明两个变量不相关,只是线性不相关而已。
-
通过训练模型来筛选特征,比如Random Forest、GDBT、XGB,它们都可以输出特征的重要度,可以以此验证自己构造的特征好不好。
-
做试验通过试验对比来筛选特征,用试验结果说话(这种方法虽然麻烦单很有效 本次比赛数据量较小属性也不多因此我采用的这种方法)。
小技巧:
因为我们通常使用随机森林 GBDT 这种决策树类的算法,根据算法原理我们知道决策树更关注分裂节点的不纯度变化,根据这种算法的特征我们可以简单的通过 groupby(’feature’,’label’) 来看出特征的好坏程度,如果某个特征在不同的取值上,0和1的比例和平均比例相差很大,那么这个特征是有效的。
2.4 建模
2.4.1 模型选择
在处理好特征后,我们可以进行模型的训练了,训练完成后一定记得做好试验记录。机器学习模型有很多,建议均作尝试,不仅可以测试效果,还可以学习各种模型的使用技巧。很多模型都有回归和分类两个版本,常用模型有:KNN、SVM、Linear Model、GBDT,这些模型都已经有现成的工具(如scikit-learn、XGBoost、LightGBM等)可以供我们使用。
例:在这次比赛中我尝试使用了 线性回归、岭回归 、套索回归/LassoLars 、ElasticNet、支持向量回归/SVR、随机森林回归/Random Forest、 GBDT 和XGBoost,经过多次试验的结果对比,我们发现在这次比赛中效果XGBoost>GBDT> Random Forest>线性回归>岭回归> LassoLars 、ElasticNet>支持向量回归/SVR。
2.4.2 调参
在训练模型前,我们需要预设一些参数来确定模型结构(比如树的深度)和优化过程(比如学习率)这种参数被称为超参数,不同的参数会得到的模型效果也会不同(同时需要注意的一点是不要急于调参,可以先使用默认参数)。
例:我们可以采用贪心算法策略,先从对模型效果影响最大的超参数开始,设置超参的搜索空间(比如学习率的搜索空间为[0.001,0.1])通过一定的方法进行参数搜索(常用的参数搜索方法有Grid Search,Random Search),确定好最优参数后,对模型效果影响第二大的超参数开始进行参数搜索以此类推直到所有的参数调整完毕。
2.5 模型验证
在Test数据集label未知的情况下,我们需要自己构造测试数据来验证模型的优劣,我们可以把Train Data分割成Train Set和Valid Set两部分,Train Set用于训练,Valid Set用于验证(大部分比赛已经划分好Train Set和Valid Set)
简单分割(一般数据量很大的话采用此方法):
将Train Data按一定方法分成两份,比如随机取其中70%的数据作为Train Set,剩下30%作为Valid Set,每次都固定地用这两份数据分别训练模型和验证模型。这种做法的缺点很明显,它没有用到整个训练数据,所以验证效果会有偏差。
K折交叉验证:
K折交叉验证是将整个训练数据随机的分成K等份,训练K次,每次取其中的K-1份作为Train Set,留出1份作为Valid Set,K一般选在3~10之间不过我们通常选择k取3,5或者10。我们可以用K个模型得分的mean和std,来评判模型得好坏(mean体现模型的能力,std体现模型是否容易过拟合),并且用K-fold的验证结果通常会比较可靠。
2.6 模型集成
有一种说法是”Feature为主,Ensemble为后”,Feature决定了模型效果的上限,而Ensemble让你更接近这个上限。Ensemble讲究“好而不同”,不同的模型是从不同的数据空间角度和数据结构角度来观测数据的,它们学习到的侧重面是不一样的,相关性低的模型通常融合效果会更好一些。
目前常见的Ensemble方法有Bagging、Boosting、Stacking和Blending。
(工具篇)
3工欲善其事,必先利其器
xgboost是大规模并行boosted tree的工具,它是目前比较好的开源boosted tree工具包,比常见的工具包快10倍以上,在数据科学方面,大量的比赛选手选用它进行数据挖掘比赛。LightGBM 是微软开源的一款梯度 boosting 框架,使用基于学习算法的决策树。速度比xgboost快不少,精度与xgboost不相上下,但易用性和特性相比xgboost还有待提高
还有一些常用的工具:
SQL server 2008 | 数据量较大的话处理数据会很方便。
Excel | 小批量数据量的可视化分析会很方便。
Numpy | 必用的科学计算基础包,底层由C实现,计算速度快。
Pandas | 提供了高性能、易用的数据结构及数据分析工具。
scikit-learn | 机器学习Python包 ,包含了大部分的机器学习算法。
XGBoost/LightGBM | Gradient Boosting 算法的两种实现框架。
最后大家觉得有帮助的话欢迎点赞和关注哦(^o^)/~
- 点赞
- 收藏
- 关注作者
评论(0)