2019华为开发者大赛,SoftCOM通信智能(NAIE)赛道获奖方案分享
大赛依托于NAIE平台,从导入数据、特征操作、模型训练,到模型打包与验证,全流程开发算法模型。从琅琊榜上的提交记录可以看到,大家平时学业繁重或是工作繁忙,只能熬夜编码,周末更是黄金时间。除了参赛选手,还有平台团队的陪伴,随时解决大家的疑问。大赛过程中每一个关于平台使用的问题,都会得到及时反馈并有效解决,这一点相信每一位参赛选手都深有体会。所以,文章开始我要向平台团队每一位夜以继日的耕耘者致敬。希望平台越来越棒,这样一个平台也必然越来越棒!
区别于Kaggle等AI赛事,这个比赛是我参加过最接近真实业务的AI算法设计大赛。比如大赛测试集的设置,需要选手考虑到模型部署在新环境、或者环境变化的情况下,面对陌生数据的问题。这并不是仅仅是一个‘刷榜游戏‘。从决赛答辩也能看出,评委们很关注方案的实用价值。这点很SoftCOM~
赛题信息
选手需要基于NAIE云服务平台,并利用ICT网络AI模型开发工具和模型效果可视化仿真服务,各自开发一套可应用于数据中心能耗优化场景的AI模型。
赛题传送门
赛题理解
- 数据和目标
- 评价指标
数据探索
- 理解数据
首先需要结合DC仿真服务平台理解冷却系统的基本工作原理、理解数据集各个特征的物理含义.
DC仿真服务平台传送门
通过简单的数据分析可以完成最基本的数据处理,例如过滤掉定值列等操作。
-
数据质量评估
接下来,分析对比给定数据集与测试集的数据分布,来做数据质量评估。
红色代表测试数据分布,绿色是给定的训练集。通过各个特征分布曲线以及散点矩阵,可以看到数据存在分布窄,多样化不高的问题。 -
陌生数据识别
针对数据存在分布较窄的问题,我们想到实际应用时,模型也应该能认识陌生数据才行。模型训练得好,并不能说明模型已经学习到了实际的物理规律,所以我们采用高斯过程回归来对测试集做一个评估:分析预测方差(σ)大小。
设定σ阈值将测试数据划分为低方差数据和高方差数据(陌生数据)。
模型实际部署时,每次有预测任务到来,便可以先识别数据是否为陌生数据,这样模型输出不仅仅能给出一个预测值,还能输出不确定度信息,间接反映模型是否已经学习到了实际的物理规律、预测效果可靠否。
对于比赛本身而言,我们可以直接利用高斯过程回归的结果,对全部测试集做划分,结果如下:
红色+ 低方差的test1(2000条)
绿色+ 高方差的陌生数据test2(2070条) -
DC采样
陌生数据test2难以预测,这也时实际应用可能遇到的情况,比如当模型在新环境部署的冷启动阶段,必然会面临陌生数据问题。如果没有自动的数据识别、模型的不良表现会反应到整个系统。解决问题的办法就是通过识别陌生数据、收集陌生数据,并尽快构建一个适应新环境的模型、增量在线学习更新模型,让预测模型具有自适应性。
回到比赛,主办方提供200次DC采样的机会,来增强数据,以解决原始数据分布窄的问题。如何让这200条DC数据最大化反应目标数据的分布特点是DC采样的关键。我们采用Affinity Propagation 聚类算法和k-means聚类算法,先后从局部到整体在高方差数据分布下确定了200个比较合适的采样点。
红色+ 融入DC采样数据后的的训练数据(做过下采样)
绿色+ test测试数据
可以看到融入DC采样数据后的训练数据与测试数据的特征分布比较一致,散点覆盖较好。以一个简单的回归预测模型作为Baseline,DC采样前后成绩有了一个明显的提升。
特征工程
- 中间变量
• 引入三个中间变量:LTPower,LDBPower,LQBPower(冷塔总功率、冷冻泵总功率、冷却泵总功率)
分析给定数据中的中间变量,可以构造如下三个中间变量:LTPower,LDBPower,LQBPower(冷塔总功率、冷冻泵总功率、冷却泵总功率),三者相加结果正是最终预测的目标CoolingPower。
这样的变量引入实际是对原始问题的解耦,更有利于分析特征与输出间潜在的相关性,比如室外温、湿度等环境变量主要是影响冷塔功率,进而影响CoolingPower.
-
构造新特征
• sqrt_CHWSRPressDiffset:压差开平方
• humidityRatio-kg/kg:绝对湿度
• OutsideWBTemp:湿球温度
• 各种温差:温度单位的特征做差构造多个特征组合,CTSTempSet-OutsideWBTemp…
• coolingDegrees:如果OutsideWBTemp > 0,则coolingDegrees=OutsideWBTemp,否则coolingDegrees = 0.
• OutsideWBTemp/CTSTempSet:室外湿球温度/冷塔出水温度 -
时间相关信息的尝试
室外干球温度在一天内的波动范围等特点,不符合物理规律。后来和主办方求证时间戳是作为区分数据的唯一标识,当作索引。
尽管这样,还是有一定规律(模式)可以挖掘。
后文提及得自回归矫正模型增加上述时间信息,预测效果小许提升,提升原因应该是时间信息引入相当于对某些特征、数据集进行了特殊的加权,预测时候注意力集中在时间相近的训练数据。
模型介绍
-
模型训练涉及的数据集划分
-
Model1(树回归+神经网络)
上图从左到右,呈现的是从输入到输出数据流。圆柱代表数据、方框代表算法模型、虚线代表训练、实线表示输入和预测的数据流。其中,白色数据表示有实际值标签的数据;黑色数据表示待预测的无标签数据;灰色数据表示有标签数据,但是标签是模型的预测值。
先来看Baseline1模型,实际就是分别针对高方差数据和低方差数据的采样数据df_sampleForTest1、df_sampleForTest2分别训练一个树回归模型,得到有标签的测试集df_test1_labeled、df_test2_labeled,合并得到子模型输出:df_test_baseline1.
接下来的自回归校正模型1是将Baseline1的输出df_test_baseline1(带标签)作为原始数据。利用KNN算法从中抽取距离DC数据较近的部分数据作为回归网络的训练集。再一次利用KNN抽取距离DC数据比较远的数据作为待校正的数据(测试集)。通过一个简单的神经网络实现对部分数据的校正,得到Baseline1的校正网络输出df_test_baseline1_adjusted。
Baseline2是在全集范围直接训练一个树回归模型,预测全部测试集得到子模型输出df_test_baseline2;同自回归校正网络1思想一致,自回归校正网络2是对Baseline2模型输出做一个回归校正。
最后将四部分的输出做一个简单的均值融合便可以得到Model1的结果,模型sMAPE稳定在1.2左右。
-
Model2 (Transfer Learning Model)
Model1主体结构本质上是基于分类回归树集成的算法,所以也会有一些先天缺陷:当训练数据的特征都集中在一个区间内,而测试数据偏离该区间较大时会出现不能拟合的情况,根本原因是因为分类回归树对于某一个叶子节点上的数据的目标值是采取该叶子节点的目标值均值做梯度提升最终确定预测值的。
如果一个新的预测的数据的特征在训练数据集的特征的空间范围外附近,模型表现必然不佳,这也就是我们所说的‘死记硬背’。
区别于分类回归树算法,我们的第二个思路是神经网络模型,基本结构如下图:
基于原始数据的下采样融合DC数据预训练一个神经网络模型DNN。对于低方差数据这个模型可以直接给出一个可靠的预测值得到df_test1_DNN。针对高方差数据,我们起初想法是基于DC数据直接训练一个模型,用于预测test2,不过DC数据量200条不足以支撑训练一个DNN预测模型。
所以,借鉴迁移学习中的fine-tuning,将前面的预训练模型DNN前n层冻结,用DC数据训练最后k层的参数.这样模型会有一个针对性的微调适应DC数据,DC数据代表test的分布,所以理论上是会有一个不错的结果df_test2_finetune.合并test1和test2的预测结果得到Model2的输出df_tets_transfer。
模型得分水平不及Model1:
不过数据可视化会发现结果与Model1数据分布区别较大,这样的两个结果做融合,结果必然会有提升。 所以又有了下面的模型融合。 -
模型融合
融合的思想如上图,比较好理解。通过不同的几组参数可以分别训练得到多个Model1和多个Model2预测结果,所有预测结果做均值融合得到最终提交的输出文件。
前面提过这不仅是一个刷榜游戏,所以我们并不建议生成太多模型,Model1、Moedel2各取一个结果即可,不然训练时间将成倍增长,换来得收益并不大。简单的融合可以得到如下得分。
问题总结
我们在做fine-tuning网络训练调试的过程中,很大概率会出现不收敛的情况,初步分析应给是预训练网络深度不够,前面n层并没有提取到较好的‘特征’,所以fine-tuning阶段较难收敛。当预训练网络前n层恰好提取到了比较合适的‘特征’,fine-tuning便直接收敛的比较好,最终我们用的fine-tuning模型也时选取较好的一个模型。
Model2的目的是构建一个弥补树回归缺陷的DNN,fine-tuning是一个优选方案,保守方案是一个DNN。