Getmax 团队:KDD CUP 2018 两冠一亚团队解题思路
AI 科技评论按:今年 KDD CUP 设立三项大奖,分别为 General Track、Last Ten-Day Prediction Track 以及 Second 24-Hour Prediction Track,从不同维度奖励表现突出的团队。由罗志鹏,胡可,黄坚强组成的 Getmax 团队,在这三项大奖中获得一项亚军、两项冠军的成绩,是唯一包揽三项大奖的团队。去年该团队成员带领的 Convolution 团队也包揽了 KDD CUP 2017 的双料冠军。
AI 科技评论也在去年对该团队进行了技术分享报道。
KDD Cup 是由 ACM 的数据挖掘及知识发现专委会(SIGKDD)主办的数据挖掘研究领域的国际顶级赛事,从 1997 年以来每年举办一次。每届都吸引众多工业界以及学术界的选手,有数据挖掘领域「奥运会」之称。
KDD Cup 2018 题目为空气质量预测, 由主办方提供中国北京和英国伦敦的天气数据,选手需要以此来预测未来 48 小时内 PM2.5/PM10/O3 浓度。本次赛题本身对应对恶劣环境、改善人类生存有着重要意义,而问题本身则有数据规律性弱,易突变,时间序列以及空间拓扑关系建模等挑战。
近日,在 AI 研习社公开课上,Getmax 团队就分享了 KDD CUP 2018 两冠一亚团队解题思路,本次分享主要对空气质量问题的重点、难点进行针对性的特征设计与深度学习模型优化。公开课回放视频网址:http://www.mooc.ai/open/course/530
分享人介绍
罗志鹏:微软 Bing 搜索广告算法工程师,北京大学软件工程专业硕士,专注于深度学习技术在 NLP,广告相关性匹配,CTR 预估等方面的研究及应用。
黄坚强:北京大学软件工程专业硕士在读,擅长特征工程、自然语言处理、深度学习。
胡可:阿里妈妈搜索直通车团队算法专家,硕士毕业于香港中文大学机器学习方向,工作技术方向为深度学习与广告算法。
团队具备丰富的机器学习在工业界与比赛的应用经验。团队成员曾获得 CIKM 2018 冠军,KDD CUP 2017 双料冠军,Kaggle Outbrain Click Prediction 冠军,微博热度预测冠军,上海 BOT 大数据应用大赛冠军等。
分享主题:KDD CUP 2018 两冠一亚团队解题思路
分享提纲:
• 空气质量问题理解及建模设计
• 特征工程
• 深度学习模型优化
• 模型融合
AI 研习社将其分享内容整理如下:
今天我们团队要跟大家分享的是 KDD Cup 2018 的解决方案。先介绍一下我们 Getmax 团队,团队队长罗志鹏,是微软 Bing 搜索广告算法工程师,北京大学软件工程专业硕士。我是黄坚强,目前北京大学软件工程专业硕士在读。胡可是妈妈搜索直通车团队算法专家,硕士毕业于香港中文大学机器学习方向。
我们团队拥有丰富的机器学习在工业界及竞赛的应用经验,此前曾在 CIKM Cup 2018、KDD Cup 2017、Kaggle Outbrain Click Prediction 等比赛均获得冠军。
今年 KDD 2018 总共设置了三项大奖,我们获得了两项冠军、一项亚军的成绩,是唯一一个包揽三项大奖的团队。
我们团队将从以下 4 各方面来分享本届 KDD 大赛的经验。
竞赛的第一步就是对问题做相应的调研——对于问题以及数据的具体理解是建模的基础,所以我们先对本次KDD大赛的问题进行理解和分析。
首先介绍一下 KDD Cup 2018 的背景。在本次大赛中,主办方提供了空气质量、天气的历史数据以及未来两天的天气预报数据。我们需要预测北京和伦敦 48 个站点、未来 48 个小时的 PM2.5/PM10/O3 浓度。本次大赛所使用的评价函数是 SMAPE:
该评价函数是在 Norm-1 的 MAE 评价函数基础上,除以预测值与真实值的平均值。使用该评估函数能有效防止在空气质量问题特有的异常值对整体分数的影响,比如说当空气质量突变到一个很大的值时,分母项可以相对削弱该影响。
接下来讲一下数据。空气质量的指标包括 PM2.5、PM 10、03。天气数据的字段包括温度、气压、湿度、风速和风向等。其中天气预报数据的字段与天气数据的字段相同,但不同之处在于天气预报仅仅提供了训练集最后一个月的数据。
这些天气的数据都以网格的形式给出,即地图的经纬度通过网格进行划分,北京总共能提供 600 多个网格点,伦敦能提供 800 多个网格点,在空间维度挖掘潜力很大。据了解,现有的工业界以及学术界主要通过统计学、时间序列等来进行建模,基于机器学习尤其是深度学习建模的探索处于相对初级的阶段。
本次大赛的难点在以下方面:
第一,数据存在噪声和不稳定性,空气质量规律性弱,浓度经常变化很快。
第二,时间序列的建模难度相当高:需要对未来 48 个小时的每一个小时进行预测。对于时间较长的状态建模以及序列间依赖关系的建模带来很大挑战。
第三,空间拓扑模型:需要对两个城市共几百个站点做预测。不同站点之间的浓度有较大区别,变化趋势不太一致而又具有一定的相关性。
经过数据分析,我们发现北京 PM2.5 的空气质量浓度变化相当剧烈,这是北京奥体中心从 2 月到 5 月的浓度变化值,其最低值能到 10 ,最高值能到350,而且往往在数小时内就能产生巨大的变化,建模难度较大。
那么时间序列如何建模呢?我们用这张 PPT 来进行说明,整张 PPT 代表着我们现在能获取的时间序列数据,从 17 年 1 月 1 号到 18 年 4 月左右,然后以圈进行划定。这里我们假设 N 等于 3,那么左边的时间数据就相当于从 17 年 1 月 1 号到 17 年 1 月 3 号,右边就是 4 号到 5 号总共48个小时。因为常用的预测模型只有一个,所以我们需要将 48 个小时滑动拆分为 48 个样本,那么每个小时的空气质量就是其中一个样本的标签,由一个 flag 特征来标识是第几个序列。这样,就可以把时间序列预测问题转化为传统的单目标回归问题。
我们要在前 N 天的数据中提取特征来构建训练集,所以滑动一圈就能产生 48 个样本,总共就能产生 86 万个样本。然后,我们可以取最后 15 天左右来做验证集,由于时间序列数据不符合独立同分布,并不适合做多交叉验证。并且因为本赛题中不同城市受空气质量影响的因素各不相同,分布差异较大,所以我们对北京的 PM2.5、PM 10、03 以及伦敦的 PM2.5、PM 10 这五个指标构建五个模型。
接着我们介绍一下特征工程。特征往往能决定模型的上限,要进行特征工程,我们首先要构建一个 Baseline 模型,在此基础上,才能进行特征的有效性验证。
GBDT 模型由于其稳定性及其对噪音的不明显性等优点,适用于特征工程的验证。我们采用每个站点过去 72 小时的空气质量特征、离站点最近网格点的过去 72 小时的天气特征来构建 Baseline 模型。
这个是 Baseline 模型的预测效果图,从图中可以看出,仅仅使用这些特征并不能很好地反映真实值的趋势。
在 Baseline 模型的基础上,我们对空气质量、天气数据进行相关性分析,我们发现 73.7% 的空气质量的变化与风速、风向的变化相关联。于是我们考虑在 GBDT 模型的基础上引入天气预报特征,但是天气预报特征仅从 2018 年 4 月 10 号开始提供,缺乏了一年多的数据——如何填补缺失的天气预报数据是一个关键点。
通常,使用填补缺失值的方法是使用平均值和默认值,但是这些方法都不能产生很好的效果。因此,我们采用了真实天气来填补天气预报的缺失值,然而这又产生了一个新的问题——因为天气预报真实天气的分布比较不一致,容易导致训练的过度拟合,因而我们考虑尝试采用迁移学习去解决这个问题。
我们对真实天气的训练集采取预训练,对天气预报的训练集采取再训练的方式来构建模型。然而经实验发现,天气预报只有最后一个月的数据,并不能很好地覆盖所有的天气分布,所以这个模型的效果在未来的预测不稳定。
最终我们对天气引入了高斯噪声,使用高斯分布去估计真实天气与天气预报的均值及方差,并且对每个小时都进行参数估计,以得到更准确的高斯噪声。另外,我们还使用分箱平滑进一步去缓解天气预报与真实值的分布不一致性问题。
在缓解了不一致问题后,我们认为进一步提升空间在于从单点的挖掘扩展为多点的挖掘。因为天气预报提供的网格数据点多,数据信息量巨大,挖掘空间很大,所以我们进一步进行天气预报数据的特征挖掘。我们对每个站点附近八个方位最近的网格点的天气进行特征、空气质量特,这样可以使得统计更充分并且稳定。同时考虑到空气具有较大的流动性,城市乃至城市以外的较大范围的地点都在未来时间段互相存在一定影响,所以我们对整个城市经纬度跨度较大的 12 个网格进行天气预报特征的提取,并使用这些天气预报特征来构建我们最终的模型。
经过对比,我们发现这张图显示的就是北京奥体中心站 5 月 28 号和 29 号的预测图,该天凌晨有沙尘暴,导致 PM2.5 的浓度增大,后来天气持续变好,在 4 个小时内,PM2.5 值从 160 左右降到 30 再降到 10 左右,空气质量的突变非常剧烈。我们的 Baseline 模型预测是这条橙线,最终模型预测是这条绿线,相对于橙线更加接近真实值(蓝线)。因而,最终模型更能准确反映空气真实值的趋势。
我们使用了6 批特征,包括一些基础的特征如未来第几个小时、哪个站点或者一些时间特征、空气质量的特征、历史天气的统计,而最重要的是天气质量、空间拓扑的特征。同时,我们也对一些历史变化的特征进行提取,比如统计 PM2.5 最大值和最小值的时间间隔。
最终,我们构建的模型需要进一步选择特征,以缩写模型的运行时间。我们通过 GBDT 的分裂的特征增益所选择的特征的重要性来进行特征选择,最后从 2027 个特征中选择了 885 个特征来构建最终模型。由于特征之间出现冲突,所以我们采用类似于随机生成的 Bagging 做法,对特征进行了分组,对每一组特征都构建一个模型,然后对每个模型的预测值采取加权融合的方式来构建最终模型。也同时在特征工程有瓶颈时进入了下一个阶段——多模型的构建。
接下来由我们的队长罗志鹏来介绍深度模型的优化。(罗志鹏:)下面介绍我们主要的两个神经网络模型。
神经网络模型也有非常强的非线性交互能力,由于我们前面开始做的时候用到 GBDT 模型,DNN 模型实际上与 GBDT 模型具有非常大的差异性。后期使用 DNN模型做融合的时候,能得到最大的提升。
GBDT 模型在时间和空间层面上的表达能力并不充分。在时间层面上,每个样本的特征基本上都比较相似,所以我们给这些特征加了一个标识位,对未来 48 个小时,用 0 到 47 来进行标识。同时,由于主要历史信息特征比如历史空气质量、天气预报占了比较大的特征比例,我们得到的一些与时间相关的天气预报特征的结果差异性比较小,并跟真实值的差异比较大。此外,我们也发现 0 到 47 这个时间特征的重要性也特别高。
在空间上,伦敦有 13 个站点,北京有 35 个站点,我们也对其进行数字编码,但是表达能力有限。
接下来介绍一下我们的 DNN 模型。
左边的这个 Dense 特征是我们 GBDT 所用的特征。提特征的时候,需要注意的是,我们首先要进行标准化,常规标准化方式就是在整个训练集上统计均值和标准差。我们发现这个数据集缺失点的分布不一样——填充缺失部分,分布点差距很大,因此我们在做标准化的时候进行了一些特殊操作:首先统计均值和标准差,忽视空值;做完标准化操作,再把空值进行填充;之后,再对异常值进行一些处理,对小于 0.3 和大于 0.3 的值进行拆解,把范围缩到 3 和 -3 之间。对于缺失值,也用专门的标示位进行表达,然后我们把它 concat 起来,得到整体的特征标准。
如果仅用左边介绍的 Dense 特征,我们得到的结果会非常相近,就是 0 到 47 小时的结果会在某个值之间波动,但是彼此间的差异不会很大。我们在后面进行模型的优化时,加入了时间和空间信息联合建模的优化。
我们来看一下模型的右边部分。首先对小时(Hour)即 0 到 47,进行 Embedding,得到时间的表达;Station 部分,同样对北京 35个,伦敦 13个进行 Embedding,再做非线性变换,这个有×的圆圈部分代表元素层,它将时间和空间的信息融合起来变成时空信息,再经过全连接,再经过 σ,这部分就得到时空门限(Gate),即时间和空间的信息整合。这个门限用来控制左边主体模型结构的信息通过,这样预测出来的结果差异性会比较大。这个时间和空间的联合建模优化不仅提高了精度,而且与树模型有较大的差异性。
我们这里用到的激活函数是 B-swish。这个激活函数是由 Google 提出来的,大家可以看一下该函数的图,它其实是一个不饱和、光滑、非单调性、有下界无上界的函数。相关的 tanh 函数和 sigmoid 函数,它们图形的两端比较平,极值容易趋向于 0,会影响效果。另外,Relu 函数有很多变种,这些变种在实验中能得到比较好的效果,但相比较而言,B-swish 函数无论怎么调都能达到比较优的结果,这个也在很多实验中得到了证实,大家可以尝试一下。
下面讲一下 RNN 模型,它是一个序列的预测,为一个序列模型。GBDT 和 DNN 都不是序列模型,它们预测一个站点的未来 48 小时,需要预测 48 次,序列也是 4 8个样本量,比较大的,差异主要体现在与时间相关的天气预报上。
而 RNN 模型会一次性预测 48 个小时的结果,这样训练的数据会小很多,但是它后面预测的某个小时的结果跟前面的结果有一定的关联,所以 RNN 很适合用来解决时间序列的问题。
接下来,我讲一下这个模型结构。
首先,前面的 Encoder 其实跟普通的 Encoder 模型很像,其主体用的都是 GRU,速度会比较快。Encoder 的输入主要为历史天气预报、空气质量信息。
Decoder 模型与常规 Decoder模型的差异比较大,输入的是天气预报、时间和 Station Embedding,同时会把上一个预测结果加入到每个时间部的输入。比如说 Y1 在输出的时候会把输出结果连接到下一个时间部,第一个 T1 的时间部为一个增势值的输入,而当前空气质量的指标,后面的时间部是没有增值的,这就是拿预测结果作为下一个时间部的输入。
我们发现这个时间序列模型有时候并不是很不稳定。我们在序列之间加入了正则化。大家可以看一下这个公式:
h(t)是当前状况,h(t-1)是上个时态的状态,我们对这两个值的差值做了二方次,得到一个规则化的操作,公式的最左边有个 β,它是用来平衡规则化的,预测也会变得更稳定些。
我们采用 Cocob 优化器 ,它没有学习率,所以我们不需要调节显示率。另外,我们也做过一些测试,在这个任务上,这个优化器确实优于其他优化器。当然在一些 Paper 上也做过关于这个优化器的实验,将其跟常见的而优化器做了一些对比,也表明它确实很不错。
最后,由胡可讲一下模型融合与总结部分。
当几个单模型都调整到一个相对比较好的状态的时候,我们要开始想怎么把这几个单模型进行融合。通用的融合方式有 Begging、Boosting、Staking,综合考虑模型的表达能力和模型具有一定的可扩展性(相当于可以加入更多的基模型)后,我们采用了一个两级的 Staking 结构。
第一级的模型,就是刚刚所介绍的 GBDT 以及 DNN、RNN 两种神经网络模型,而我们这个staking模型,分为两级。
第一级中,会对前面的训练数据进行一年左右的训练,并将最后两天作为一个预测时间,这样能让线下和线上的预测天数保持一致。而这样也有一个问题,即因为测试集只有两天,数据量会比较小。因此,我们采用滑窗的方式来扩大测试集的个数:以两天为一个单位向前滑,第一个集合相当于以最后两天作为它的测试集,第二个是以倒数第三、四天作为其测试集,同理滑动多个集合,就可以利用上它们分别预测的值,比如说 GBDT 有一个预测值,这个值就作为特征 1,DNN 有一个预测值,这个值就作为特征 2,然后再把几个集合做拼接,作为第二级融合的训练特征值。这个特征就是第一级模型的预测值,然后 label 就是它本身的数据 label。
第二级模型选型中,我们一开始尝试使用 GBDT 模型,发现空气质量数据具有较强的不稳定性,而 GBDT这种非线性模型容易引起过拟合。所以之后我们就采用了一个线性模型——Linear Regression,我们把第一级的预测模型作为特征,去进行第二级模型的训练。
为了提高线性模型的表达能力,我们还采用了两种优化方式:
第一个优化是基于约束的线性模型,背后的假设是第一层模型的预测均值切合真实值,因而第二层模型不影响它们的预测均值。
第二个优化是基于人工先验引入一个非线性模型,把预测结果按照时间以及空间的多维度划分。我们发现不同模型在不同时间内表现形式是不一样的,比如,有的模型在比较短的时间更擅长预测,有的模型在 40 小时后更擅长,因此在不同的时间段分别建模以提高模型的表达能力。相当于在 48 个小时里,分别训练了 48 个基于约束的线性模型。我们考虑到了过拟合与欠拟合的平衡,在线性模型中基于人工先验引入了非线性。
在这个融合框架的第一级模型构建,它的构建有多种方式。我们从特征、模型两个角度进行构建:模型,指采用 DNN、RNN 这两种方式去建模时的时间和空间的拓扑关系。在特征层面,有些特征如天气预报具有不稳定性,所以我们在模型中去掉天气预报特征,而对于拓扑结构,我们也在 DNN 进行了一定的删改,并且在不同模型中分别放入长时间特征、短时间特征,这样就可以产生比较强的模型差异性。
模型的精度是S2S(RNN)>GBDT>DNN,融合大概有千分之七的提升,这是相对比较显著的。主要得益于神经网络模型与树模型有比较强的差异性,这是模型产生收益的基础。
这个过程中,我们也有一些想做而没时间做的工作:
一是对于地理位置的拓扑建模。其实我们在 DNN 进行地理数据操作之后,也想用 CNN 进行拓扑空间建模。
二是我们自身提供了一个五年的数据,但由于时间关系,我们没有时间去采用。其实我们可以从这个统计分析中看到,这种空气质量具有比较强的周期性,比如在夏天的时候,雾霾频率低,在三、四月份比较高。在这五年中,我们其实可以捕捉到基于月、季节的周期性,把这种周期性特征和五年的数据一起进行建模,应该也会有增度的收益。
三是深入做一个天气预报的误差估计模型。我们天气预报之前用的高斯噪声,假设不同小时,它的误差是不一样的,但影响误差的因素并不单是不同的时间段,包括最近时间的一次误差、最近发生突变情况的时间间隔和天气状况。如果我们深入,还可以做一个天气预报的误差估计模型。
这是关于我们整个迭代过程的总结:
第一步,对问题的理解,并且先从特征、数据的角度,去挖掘重要的信号量。我们发现比较重要的信号是天气预报数据,因而将其作为一个关键的信号去进行细致的特征工程。
第二步,不同于通过特征工程来表达业务问题,我们尽量从模型角度进行优化,比如针对不同的时间与空间的信息表达,在 DNN 等模型上设计了时间和空间的单元,从而在更多的角度去建模时间序列和空间拓扑问题,与之前特征工程的工作形成很好的补充。
第三步相当于把特征和模型这两个角度的关键求解模型进行融合,这是基于一个约束的线性模型的融合框架。
所以我们认为对于问题的理解是基础,而对于关键信息细致的特征工程,以及针对问题特点对于时间与空间的深度学习建模是后期优化的关键。
以上就是本期嘉宾的全部分享内容。更多公开课视频请到 AI 研习社社区观看(长按扫描下方二维码)。关注微信公众号:AI 研习社(okweiwu),可获取最新公开课直播时间预告。