比赛背景
2016年, 教育部高等学校计算机类专业教学指导委员会、教育部高等学校软件工程专业教学指导委员会、教育部高等学校大学计算机课程教学指导委员会、全国高等学校计算机教育研究会联合创办了“中国高校计算机大赛”(China Collegiate Computing Contest,简称C4),第五届(2020年)“中国高校计算机大赛”继续由全国高等学校计算机教育研究会主办。大数据挑战赛是其中的一项重要赛事,在2018年被选入全国普通高校学科竞赛排行榜,获得社会各界的高度关注和广泛好评。
2020中国高校计算机大赛——华为云大数据挑战赛(以下简称“大赛”)是由清华大学、中国人工智能学会和华为技术有限公司联合举办,华为云和北京信息科学与技术国家研究中心提供支持,以企业真实场景和实际数据为基础,面向全球开放的高端算法竞赛。大赛旨在通过竞技的方式,提升人们对数据分析与处理的算法研究与技术应用能力,探索大数据的核心科学与技术问题,尝试创新大数据技术,推动大数据的产学研用。
赛题信息
比赛链接
正式赛题——船运到达时间预测
在企业全球化业务体系中,海运物流作为其最重要的一项支撑。其中,船运公司会和数据供应公司进行合作,对运输用的船通过GPS进行定位以监控船的位置;在运输管理的过程中,货物到达目的港的时间是非常重要的一项数据,那么需要通过船运的历史数据构建模型,对目的港到达时间进行预测,预测时间简称为ETA(estimated time of arrival),目的港到达时间预测为ARRIVAL_ETA。
本次大赛提供历史运单GPS数据、历史运单事件数据、港口坐标数据,预测货物运单的到达时间,对应“历史运单事件”数据中EVENT_CODE字段值为ARRIVAL AT PORT时EVENT_CONVOLUTION_DATE的时间值。
数据集与评价指标
本次比赛是预测货物到达目的港口时间ETA(Estimate time of arrival),采取的评估标准为MSE,即ARRIVAL AT PORT预测时间ETA与真实时间ATA的差距的平方和。
主办方提供四类数据:历史运单GPS数据,测试运单数据,港口坐标数据以及历史运单事件数据。因为最后一类数据是人工录入的,所以误差较大,在整个比赛过程中并未使用。
数据量大小:训练集约1.5亿条GPS数据,运单数量约几万条
测试集约几万条GPS数据,有200多条运单数量
难点
1、数据集来自华为实际业务,所以数据十分的脏乱
2、数据集有1.5亿条,对配置要求较高
3、对于一些运单,它并不只是从起点到终点的航线,可能中转了很多国家地点,导致预测的难度提升
4、对于船运来说,可能会存在塞港,停港,使得船运到达时间不可预测
5、赛题并没有给定标签,所以需要自己打标
数据预处理
这次比赛的数据并不是传统的时序问题,即过去预测未来。但数据的测试集的时间也在训练集之内,所以是单一时序问题。
这次的比赛由于是华为的工业数据集,数据集非常的脏,如订单重复:因为训练集中有很多是同一时刻同一船运的不同订单,所以gps数据的信息是相同的,我们只需保留一条数据最多的;路由缺失、经纬度异常、速度航向异常,同时数据集又非常庞大,所以数据清洗是这次比赛的关键。除了一些基本的去重,删除离群点,删除缺失值多的行列之外。还要把船的航运轨迹在世界地图上画出来,我使用的是python的一个库叫geopandas。
通过画图可以看出,有些运单实际开往的目的地和标签上的目的地并不相同,以及有些运单开到一半,它的GPS数据就丢失了,有些航线非常的稀疏,有些航线并没有按照正常轨迹执行,这些异常的数据都可以进行删除。
通过观察发现,有些运单速度已经为0,即已经到达目的港口,但是方向在不断变化,推测可能是在港口不断调整船向以便入港,根据官方的解释说明,这种情况已经算到港,所以可以删除运单尾部速度为0的数据。
特征构造
特征的构造方式有很多,在比赛过程中我也尝试了非常多的特征,例如根据速度和时间差可以计算出加速度,根据时间是否在疫情期间可以作为一个特征,时间本身的年月日也可以单独作为特征,目的地的港口国家也可以作为一个特征等等。对非数值型的特征可以进行labelEnconder编码, 同时根据两点的经纬度可以构造出距离的特征,距离这个特征和label的相关系数非常高,可以说是强特了。实际也证明这个特征对模型的预测非常有帮助。
距离的计算公式的函数为:
import numpy as np
def distance(LatA,LatB,LonA,LonB):
EARTH_RADIUS = 6378.137 # 千米
def rad(d):
return d * np.pi/ 180.0
s=0
radLatA = rad(LatA)
radLatB = rad(LatB)
a = radLatA-radLatB
b = rad(LonA)-rad(LonB)
s= 2 * np.arcsin(np.sqrt(np.power(np.sin(a / 2),2)+ np.cos(radLatA) * np.cos(radLatB)*np.power(np.sin(b / 2),2)))
s=s* EARTH_RADIUS
# 保留两位小数
s = np.round(s * 100)/100
s = s * 1000 # 转换成m
return s
模型预测
建模的方法有两种,一对运单进行建模,可以很容易将轨迹特征融入模型,但某条运单如果预测偏差大,对结果影响很大。对采样点进行建模,可以对预测结果进行平均,能使预测误差较稳定,我使用的是后一种方法。同时这个比赛标签需要自己给定,我给定的标签是当前GPS点的时间减去出发点的时间差作为便签。
因为是比赛,所以为了提升分数,所以我选择对训练集中和测试集轨迹相似的样本做训练,虽然这样做会影响模型的泛化性,但确实可以提升分数。
预测的模型我使用的目前最比赛很普遍使用的lightGBM5折交叉验证,当然其他的模型如XGBoost,随机森林,神经网络等我也都有过尝试,但是效果并不是很理想。同时,因为评价指标是MSE,即均方误差,所以模型融合是非常有必要的,我选择的是把根据一个运单的第一条数据和最后一条数据分别去预测然后把结果融合,当然融合的方法有很多种,事实证明,模型融合能显著的提高分数
总结
该大数据挑战赛由教育部指导委员会,华为,清华大学联合举办,数据集有1.5亿条,赛题是华为船运到港时间预测,训练集中给出了从华为开往世界各地运单GPS数据,如经纬度,时间,起始点和目的地,路由等。测试集则是一部分刚出发的GPS数据点。根据这些数据预测这个运单到达的时间。
因为是华为的工业的数据集,所以数据非常的脏乱,存在订单重复,经纬度异常,路由缺失等问题,而且数据量也非常的大,所以数据清洗是这次比赛的关键。除了基本的去重,处理缺失值等基本数据预处理方法外,还可以把整个轨迹航线进行可视化,然后找到一些轨迹异常的运单进行处理。同时有些运单速度为0,且经纬度已经到达目的地,但仍然存在数据,可以把运单尾部速度为0的运单都删除。
特征的构造尝试了很多,如国家特征,时间特征,加速度特征,疫情特征,其中有一个特征是用经纬度公式算出距离,这个特征与label相关系数极高,可以作为强特。
模型构造既可以用运单进行建模,可以很容易将轨迹特征融入模型,但某条运单如果预测偏差大,对结果影响很大。也可以以每个GPS数据点进行建模,可以对预测结果进行平均,能使预测误差较稳定,我选择了后面一种方法。
模型我使用的很经典的lightGBM进行5折交叉验证。其他的XGBoost,随机森林,神经网络效果并不理想。最后,我用几个lightGBM分别对测试集的第一个数据点和最后一个数据点进行预测,然后进行模型融合,以为评分规则是MSE,所以模型融合能很好的提升分数。
感想
通过这次比赛学习到了很多数据挖掘的知识,从群里清华北大等985高校的本科生,研究生大佬中也受益匪浅。作为一个大二的本科生第一次参加这种高端的大数据竞赛,进入了在1491支队伍中进入前20名,已经感觉十分满意了。