kdd 2019 paper notes
文章太多,没法每篇都很详细写,一些看过的会在此处做一些简单的笔记作为记录。
AccuAir: Winning Solution to Air Quality Prediction for KDD Cup 2018
这次是kdd cup比赛空气质量预测第一名的方案。
背景
本次比赛中,空气质量预测主要面临以下问题:
- 空气污染受影响因素太多,如天气这种自然环境因素,交通污染这样的人为因素或者工业影响。
- 由于受因素复杂,空气质量随时间和地点的变化十分显著。
- 空气质量除了一些正常的波动,也会受到一些确定的因素影响而快速变动。
- 未知因素的影响。
本文提出模型总体结构如下

整体上是一个集成模型,包括LightGBM,spatial-temporal gated DNN和一个Seq2Seq的模型,其中LightGBM作为一个快速健壮的特征选择器,同时文中将LightGBM作为基线模型,设计了一个spatial-temporal gated DNN来反应时空关系的复杂影响,最终利用Seq2Seq模型根据历史信息预测。
DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks
背景
在在线学习的场景中,特征经常会同时存在稠密的连续特征和稀疏的离散类别值(文中称之为tabular input space),同时随着时间推移,特征权重可能会变化(online data generation,等同于concept drift),这两个问题会严重影响在线学习算法的质量,对于前者,虽然已经可以被一些高效的算法解决,如gbdt和nn,但是gbdt却很难动态应对数据改变的问题,nn在面对稠密的数据集时候,表现却不如gbdt。所以文中提出一个新的学习框架,DeepGBM,结合了nn和gbdt,主要分成两部分:
- CatNN,处理稀疏类别变量
- GBDT2NN,通过从gbdt中提取的知识来处理稠密连续变量
DeepGBM
CatNN部分,主要是根据类别特征来做embedding,在基本的embedding基础上,也考虑交叉特征,其输出分成两部分 \[ \begin{aligned} E_{V_i}(x_i)=&\text{embedding_lookup}(V_i,x_i)\\ y_\text{FM}(x)=&w_0+\langle \mathbf{w},\mathbf{x}\rangle+ \sum_{i=1}^d\sum_{j=i+1}^d\langle E_{V_i}(x_i), E_{V_j}(x_j)\rangle x_ix_j\\ y_\text{Deep}(x)=&\mathcal{N}\large([E_{V_1}(x_1)^\mathrm{T},\cdots,[E_{V_d}(x_d)^\mathrm{T}]^\mathrm{T};\theta)\\ y_\text{Cat}(x)=&y_\text{FM}(x)+y_\text{Deep}(x) \end{aligned} \] GBDT2NN部分主要考虑如何从gbdt学到知识,主要是学习gbdt对于特征的选择和特征的重要性(即数据的划分,树的结构)。对于单颗树,对于特征选择,直接采用tree学习到的特征,而非全部特征,而树的结构,则可以通过nn强大的拟合能力来学习,直接学习叶子结点结构,当成一个多分类的问题。

当有了叶子结点的映射之后,就可以根据叶子结点的预测值来构造nn近似tree模型的预测值了。对于多棵树,直接对每一颗树的叶子结点进行embedding,但这会造成维数太多(tree的数量=nn的数量,每棵树有\(L\)个叶子结点,最后embdding维度$ (|L|) $),所以在叶子结点的基础上,做叶子结点的embedding,此处包含两层关系,首先用叶结点的值去学习embdding,然后再把embedding作为结果,学习树的结构。

同时我们也需要降低nn的数量,所以对所有树进行随机分组,然后每一组学习一个网络,最终结果为所有nn求和 \[ y_\text{GBDT2NN}(x)=\sum_{j=1}^k y_{\mathbb{T}_j}(x) \]
训练
离线训练的时候,先用离线数据训练一个gbdt模型,然后构造叶子结点的embedding,最后end to end训练整个网络 \[ \hat{y}(x)=\sigma(w_1\times y_\text{GBDT2NN}(x) + w_2\times y_\text{Cat}(x)) \] 损失函数为 \[ \mathcal{L}_\text{offline}=\alpha \mathcal{L}''(\hat{y}(x),y)+\beta \sum_{j=1}^k \mathcal{L}^{\mathbb{T}_j} \] 其中后一项为在树的分组上,所对应多分类任务的交叉上损失。
在线更新的时候,只更新该损失函数的前项,后者embedding不更新。