由于租户对ECS实例(虚拟机,VM)请求的行为具有一定规律,可以通过对历史ECS实例请求的分析,预测到未来一段时间的ECS实例请求,然后对预测的请求分配资源,这样可以找到一个接近最优的分配策略,实现资源最大化利用,同时也能参考预测的结果制定云数据中心的建设计划。
赛题分为预测与分配两个部分。我们队伍初赛拿到杭夏赛区第十,复赛尽力了没能进决赛。
赛题给的练习数据虚拟机的申请量其实没什么规律可循,以下是1号虚拟机两个月的折线图
预测的难点:
- 数据无明显规律
- 噪点
- 特征信息少
数据去噪方面我们尝试了箱线图和Grubbs,效果还不错。对于异常值,我们采用的是填补均值、中位数等填补方式,而不是删除。原因是数据少的情况下,删除异常值会丢失精度,异常值往往是过高的值,我们对其进行平滑即可。实际尝试后也验证了这个想法,删除异常值会导致预测结果变差。
预测主要尝试了以下几个方法
这是天池口碑流量预测冠军的一个方法。简单思路是以常数去做回归,找到一个值在训练样本中的损失函数最小,将这个值作为接下来的待测天的预测值,这里的损失函数直接使用赛题给的损失函数即可。由于赛题给的数据量小,捕捉不到特别的特征,这个方法效果在比赛中虽然单模型最好,但没有思考出更多权重系数和优化的方法,比较遗憾。
效果较差,一、二、三次指数平滑中二次平滑的效果相对较好,数据不稳定使用指数平滑效果并不好,模型也不够健壮,主要在于调整平滑参数。我在实践中尝试对训练数据进行切分,使用 RMSE 去选取最好的平滑参数,结果有些许提升,但模型的适用性有限,效果并不太好。
自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model),这是时序预测中比较常见的方法。在模型的使用过程中需要根据时间序列的自相关函数、偏自相关函数等对序列的平稳性进行判别;而对于非平稳序列一般都需要通过差分处理将其转换成平稳序列(ARIMA);对得到的平稳序列进行建模以确定最佳模型(AR、MA、ARMA或者ARIMA)。
ARIMA 模型在预测中效果波动大,不同的差分值也对模型影响较大,对差分,p,q 系数进行一系列调整后,模型提升有限,最后没用采用。
既然每个虚拟机的规律性难以捕捉,那么我们换一个思路,去捕获所有需要预测的虚拟机申请量的走势,然后按照不同虚拟机历史的申请量比例进行分配。这样的思路在复赛尝试后能够一定程度提分。
其它尝试做法还有线性回归、取平均值、平移前预测周期等等。时间跨度太小,样本量也就过小,也就没有去尝试更复杂一点地机器学习模型,我们最后的预测采用的是不同模型的加权结果。
一开始使用了背包模型,后来使用了粒子群算法,提升明显。对于还资源利用率不满的物理机又进行了进一步填补操作,使得物理机资源利用率基本能达到比较高的分数,在预测不那么准的情况下,提升明显。复赛中出现三种物理机的情况,做法是按虚拟机的CPU和内存的比例进行物理机的分配即可。
这个比赛还是比较花时间的,题目给的练习数据和真正的线上评测数据相差较大,难度进一步提升,只能通过线上每天100次地不断提交反馈来进行修正。预测方面尝试了一些模型,但是对原始数据的处理不够细,应该更多地去思考原始数据层面的分析处理。分配方面由于使用了三维数组,导致空间比较大,线上运行会出现用例出错况。后来使用 Byte 去存储,也还是会出现问题,这对比赛结果也有一定影响。比赛后期,大部分队伍都开始针对虚拟机甚至用例进行参数调整,模型不够健壮的缺点就体现出来了,这样调整提升也变得些许无聊。预测部分能提升的还是很多的,没能进决赛还是有点遗憾,还要继续修炼。
- preliminary: 初赛代码
- sdk-java:复赛代码