华为软件在线测试2018,2018华为软件精英挑战赛——预测篇

先自报家门吧,我是来自成渝赛区的一支队伍,勉强进了全国总决赛,见识了其他赛区的各路神仙,大开眼界,被按在地上摩擦,最后拿了20多名,还是自己太弱了,惭愧惭愧。

因为代码所属权的问题,暂时无法公布源码,就简单总结下这次比赛的收获。

今年赛题实际上包含了两个问题,第一部分是根据虚拟机申请历史数据预测未来一定时间的数据(根据预测准确度评分),第二部分是将虚拟机预测的结果放置在特定的物理机中,使资源利用率最优(利用率公式在初赛、复赛、决赛略有不同)。详细赛题链接如下:赛题介绍。

复赛阶段的评分公式:

33598733798a?nomobile=yes

复赛阶段评分公式

前半部分是评估预测结果的准确度,后半部分是计算多维度资源利用率。

决赛阶段评分公式:

33598733798a?nomobile=yes

决赛阶段评分公式

前半部分相同,后半部分变成了利润率(考虑了虚拟机和物理机的价格)。

特征选择和预处理

特征选择

第一个问题就是特征选择,从预测结果的要求来看,预测未来几天(1到4周)不同虚拟机的申请数量,首先想到的是以天作为特征,方便将预测结果求和。接着考虑的问题是,不同虚拟机数据之间有没有相关性。先看看历史数据:

33598733798a?nomobile=yes

以天为单位的不同虚拟机的线下数据

实际上连趋势都看不出来,数据很离散,且有大量的零。那如果以周作为特征呢:

33598733798a?nomobile=yes

以周为单位的不同虚拟机的线下数据

似乎能看出一些虚拟机数量阶段性递增的趋势,但仍不明显,这也符合了实际情况中用户增多的现象。

从数据来看,和从实际问题考虑,可以认为不同虚拟机之间不具有很强相关性(因为一个客户不会频繁去更换购买虚拟机的种类),另一方面,可以认为平均工作日申请虚拟机的个数大于非工作日虚拟机的申请数(程序中进行了验证),因此可以将工作日的数据,和非工作日的数据区分开,这本质上还是以天为特征的。

预处理

首要的疑问是:到底需不需要预处理,其次是需要哪些预处理

在尝试了很多种预测模型之后,我的体会是,对于不同的预测模型需要不同的预处理或者不处理。

· 噪声处理

通过观察线下数据,确实存在着远远高于其他数据的点,那么考虑到先进行数据清洗。

首先是如何筛选出噪声点,我采用的第一种方法是3σ原则,有如下结论:假设历史数据是符合正太分布的,那么落在μ ± 3σ的概率为99.74%,那么落在这个范围之外的点,可以看作是噪声点。这本身就存在一个问题,实际数据未必符合正太分布,因为存在递增的趋势,因此,这是一种近似处理。

尝试的第二种方法是箱型图,之前没听过这种算法,学习了其他队伍的结果。大概的思路是先将数据排序,取出四分之一位置和四分之三位置的数据取差,再乘以一个系数(一般取3),在区间(Q3+3ΔQ, Q1-3ΔQ)之外的值被视为噪声,可以参考:WIKI-箱型图。

还有其他的方法,比如聚类方法:K-Distance等,大概了解,没有深究。

· 更新异常值

首先直接删除异常值是不客观的,因为这是一个时间序列,删除异常值就等价于在这个时间点上的数据为零,这和实际情况不符。最直接的想法是取均值,这是一种简单粗暴的方法,我觉得这种处理太粗糙,不能完全表达出数据的特点。

其次我一直用的方法是取前两个数据的均值代替异常值,这也符合时间序列的特点,算是一种“加权平均法”的思想。

还有其他的方法,比如用一次指数平滑或移动平均法将数据从头到尾平滑一遍,这样处理后的数据”非常好看“,但是感觉涂抹太过严重,失去了太多的细节,但这也是一种思路。

以上只是一些大概的思路,其中还有很多实现的细节,我就不一一解释了。

预测模型

线性回归LR

线性回归很简单,很多人都很熟悉,是利用线性回归方程对自变量和因变量之间关系进行建模的一种回归分析,常用的求取线性回归方程的方法是最小二乘法,其中涉及到矩阵乘法、转置、求逆等运算,本来以为这部分会比较耗时,实际上计算量并不多。对于这种数据波动很大的情况,预测效果很一般。

33598733798a?nomobile=yes

线性回归方程

其次我还用了线性回归中的多项式回归,我的做法是将数据以周为特征,并累加前一个数据,这样就构成了一种数据明显的递增趋势,用三次多项式(三次多项式比较贴合构造的递增数据)拟合构造后的数据,将预测后的结果逆向处理即可。这是我早期尝试的比较有效的方法,进入过前十。此外去噪后的数据预测效果要比不去噪好很多。

平均法MA

平均法可以分为移动平均,加权平均等,移动平均的思路是取一段区间计算其均值,作为区间外下一个数据的预测值,然后依次加入一个新值(真实数据),移除区间里的第一个旧值,重新计算下一个预测值(预测数据)。

33598733798a?nomobile=yes

移动平均法

加权平均法是基于一个假设,认为每个历史数据对于未来数据的贡献不同。很容易理解,距离预测数据近的点对于预测结果的贡献度更大。

33598733798a?nomobile=yes

加权平均法

对于加权函数可以有多种选择,比如线性递减函数(从距预测数据最近数据起,向前递减,以下相同),递减幂函数,递减指数函数,递减高斯核函数等。(后面我还用到了加权的思想)

考虑到数据的递增趋势,在预测结果上可以乘以一个大于1的系数会更好,至于这个系数是多少,就很玄学了(可能大于2),而且不去噪的效果会更好(因垂丝汀)。

指数平滑ES

赛前完全不了解指数平滑,参考了很多资料,算是对指数平滑有了基本的认识。

指数平滑可以分为一次指数平滑、二次指数平滑、三次指数平滑(等价模型:Holt-Winter)

一次指数平滑类似与加权平均法,一般应用于直线型的数据。

二次指数平滑是在一次指数平滑的基础上,再进行一次平滑。

三次指数平滑是再二次指数平滑的基础上,再进行一次平滑,适用于具有季节性趋势的数据。

指数平滑的公式就省略了,有非常多的文章都有很详细的说明。

从比赛来看,二次指数平滑和三次指数平滑比较适用于实际数据(季节性不明显),其次,数据去噪对于指数平滑的影响很大,甚至可以增加去噪的力度。

还有一点,自动寻参,在这方面我做了很多的尝试。二次指数和三次指数都只有一个参数α,而Holt-Winter有三个(后来觉得过于麻烦,被放弃),那么对于不同的用例,如何找到最优的α?假如对于不同用例找到各自最好的参数,那么自动寻参的意义就很大,最核心的问题是如何评价一个参数的好坏?

我的思路是在0和1之间遍历α,建立一个评价函数,选择最优的α。评价函数计算方法如下:

1、选定初值:α = 0.001,sum = 0;

2、用7天的历史数据 (data[i]) 预测”未来7天“ (pred[i]),计算预测值和真实数据差的平方:sum += (pred[i] - data[i+1])²,累加求和;

3、是否到达最后一位历史数据,否则转4,是则转5;

4、将历史数据向后移动一位,转2;

5、sum则为此α的评价度,α += 0.001,转2;

6、选择评价度最小的alpha作为最优α。

补充:对于步骤2中的平方和是累加的,实际上就是每个评价度权值全为1,还有可以进一步改进的地方,按照加权平均法的思想,认为越靠近预测值的数据的评价度越重要,可以使用递减的加权函数给每个平方和加权。

其他

很可惜,有些模型没有尝试,比如ARIMA,而LSTM也没有更多的耐心改进,被轻易放弃。实际上对于短期预测和长期预测可以分开处理,神经网络模型作长期预测也许更合适。

另外,对于不同类型的虚拟机,可以使用不同的预测模型,虽然调参的工作量会大很多,但预测准确率必然更高,这些都是后话了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值