有幸参加了天池客流预测的内部赛,内部赛比赛时间比较短,也没有很做复杂的工作,下面简单说一下比赛一些经验。
赛题理解:
赛题是“公交线路客流预测”,根据公交线路历史刷卡数据,预测不同线路6
点-21
点各时段的客流情况,其实就是预测每个时段刷卡的人数。这可以看做一个回归问题或者时间序列问题。
做比赛之前,最好对数据做一下分析,这样有助于数据清洗、抽取训练测试样本集等,有助于加深对问题的理解和后续建模。比赛中给出了200
万用户数据记录,包括用户公交卡的类别(根据此可以对人群进行划分,比如学生和成人等等),预测时可以考虑对每个用户建模、分人群建模或者总体建模等几种方式。另外需要注意预测时间为20150101-20150107
,中间包含节假日(元旦三天法定节假日),对于节假日的处理需要小心(节假日和工作日分别建模是一种很好的方法)。同时离线评估时测试集怎么取,能和线上预测最接近,也是一个值得考虑的问题。
平台使用经验:
平台主要是数据工作台和算法pai
平台,数据工作台可以写sql
语句进行一些数据拼接转换等工作,要掌握odps
内建函数的使用,比如row_number()
、regexp_extract()
等常用的;算法pai
工作台提供了一系列的基础处理和常用的算法,比如lr
、gbdt
等。
在使用中有时会出现刷不出工作台或者算法工作台新建实验后刷不出画布的情况,这个时候可以清一下缓存或者换一个浏览器试试。还有在数据工作台进行调度配置时,需要输入依赖的上游节点的,可以填入项目的根节点,项目的根节点一般是“你的项目名称_root
”,比如我的项目名称是prj_tianchi_6_16630
,根节点就是“prj_tianchi_6_16630_root
”。在拼接特征时,比如需要拼接7
天前的人流信息等,可以在job
参数内配置日期参数如${yyyymmdd-7}
表示7
天前的日期,将job
发布,在冒烟测试中选取业务日期,这样不需要自己去计算7
天前的日期是什么。
竞赛心得体会:
比赛时间短,但是也是遇到一些坑,主要在于特征。关于本赛题特征可以包括日期、星期、天气、线路、小时等几个方面,这里就不详细说了,大家能想到的特征估计有很多,提醒大家的一定要注意检查生成特征语句的正确性,注意特征不要太冗余、不要冲突(这个比赛中遇到过,大家要注意)。我们在比赛中还是将这个问题作为一个回归问题去处理的,由于时间有限,模型上没有做过多的尝试,大家可以多尝试不同的模型去评估效果。当每次训练完模型,利用大赛给出的偏差近似去大概评估模型的效果,大体上和线上指标一致。每次观察一下预测的趋势,这个还是很重要的,看一下是否和训练数据表现的趋势类似,这样有助于发现模型或者特征不合理的地方。
最后,希望大家比赛取得好成绩!
附:
mr
测试用例:
输入表:
t_nanxi_gd_line_hour_count
字段名:
line_name:STRING,deal_date:STRING,deal_hour:STRING,passenger_count:BIGINT
字段分别表示,线路名称,日期,小时,人流量
输出表:
t_nanxi_gd_line_hour_count_feature
字段名:
line_name:STRING,deal_date:STRING,deal_hour:STRING,passenger_count:BIGINT,last_week_passenger_count:BIGINT
字段分别表示,线路名称,日期,小时,人流量,上周本路线本时段的人流量
mapreduce
编写中出现的问题:
(1)
问题:通过 mvn clean package
命令编译项目,Run As -> Java Application
时出现class
找不到的情况,如下图。
解决方法:这时候可以mvn clean package
之后,再进行
mvn install
操作,然后再
run
试试。
(2)
问题:运行run
时出现java.lang.ArithmeticException: / by zero
的错误,如下图:
解决方法:这是由于ReduceTaskNum
默认设置为0
的缘故,在代码中设置一下ReduceTaskNum
,如下:
(3
)提交程序,配置configure
之后run
时报错:
解决方法:查看resources/META-INF/base.mapred.xml
里面的resourceName
是否重复和idePath
是否正确。
(4
)问题:local
模型下,Exceptionin thread "main" java.lang.RuntimeException:com.aliyun.odps.ReloadException: ODPS-0410051:Invalid credentials - accessKeyIdnot foundx
解决方法:注意检查输入输出表的schema
是否正确,需要在warehouse/local/
配置,样例与输入表样例一致。
(5
)问题:出现local
模型下运行正常,线上却老是提示格式无法转换的问题,比如text
无法转换为LongWritable
等,
解决方法:此种需要检查/test/src/main/resources/META-INF/base.mapred.xml
中mapOutputKey
和mapOutputValue
是否正确。
注意御膳房关于此字段的说明:
mapOutputKey -
非map only
任务必填。Map
过程输出的keyschema
,格式为 col1:type1,col2:type2,...,colN:typeN
mapOutputValue -
非map only
任务必填。Map
过程输出的valueschema
,格式为 col1:type1,col2:type2,...,colN:typeN