在以大数据、云计算、人工智能为代表的新一代信息技术的推动下, IT技术架构悄然变迁, 从传统“IOE架构”走向“互联网架构”。互联网架构所涉及的网元数、技术栈、服务数等元素成倍剧增,使得运维压力越来越大。这样的趋势下,运维管理模式从ITIL向DevOps演化,运维管理工具也发生了从ITOM、ITOA到AIOps的颠覆性变革。
AIOps作为一个全新的技术发展和应用方向,受到了行业内的一致关注,甚至有人认为其能够替代传统解决方案,使应用复杂的下一代技术成为可能。
本期“智汇华云”专栏为您带来“AIOps之动态阈值“的系列文章“AIOps之动态阈值—XGBoost模型详解”。
本期讲解人
上一期我们讲解了动态阈值中用到的SARIMA模型,用于预测指标动态阈值,从而检测异常。这一期给大家讲解动态阈值中用到的另一个算法——XGBoost。
目标函数 Objective Function
对于一个模型,我们需要定义一个目标函数来衡量模型的性能。目标函数会包含两个部分:训练损失(Training Loss)和正则项(Regularization Term):
其中L代表训练损失,代表正则项。训练损失是衡量我们的模型对于训练数据的预测性的,一般L会选取均方误差(MSE):
正则项控制了模型的复杂度,可以帮助我们避免过拟合。
决策树 Decision Tree
要理解XGBoost,首先要了解一下决策树,下图就是一个典型的决策树模型。
对于一个电脑游戏X,我们要预测这五人中哪些可能喜欢它,哪些可能不喜欢它。我们输入的特征有这五人的年龄、性别、职业等等。比如,针对年龄特征,我们觉得年龄小于20的人会喜欢这个电脑游戏X,于是我们可以根据年龄特征将五人分为两类。CART(Classification And Regression Trees)比普通的决策树更复杂些,在叶节点上,CART会给出一个具体的分数。一般来说,单个树不足以在实际中使用,我们会使用集成模型,集成模型会把多棵树的预测结果进行集成。
集成学习 Ensemble Learning
如果你随机向几千个人询问一个复杂的问题,然后汇总他们的回答,你往往会发现,这个汇总的回答比专家的答案要好,这被称为群体智慧。同样的,如果你聚合一组预测器的预测结果,得到的预测结果也比最好的单个预测器要好。
这是一个两棵树集成的例子,每棵树的预测分数加起来得到一个最后的结果,这个例子里,一个重要的事实就是两棵树试图互补。我们可以把这个模型写成:
K是树的数量,f是函数空间F中的一个函数,F是所有可能的CART的集合。优化的目标函数可以写成:
附加训练 Additive Training
对于训练树的参数,一次性学习所有树是很棘手的。我们可以使用附加策略:优化我们已经学习的树,然后每次加一个新的树。我们可以把在步骤t的预测值写成,我们得到:
哪棵树是我们在每一步想要的呢?很自然的,我们加上可以最优化目标函数的那一棵:
如果我们使用MSE作为我们的损失函数,那么目标函数就变为:
我们将它泰勒展开到二阶:
g和h被定义为:
移除所有常数之后,在步骤t时的目标函数变为:
这就是我们新的树的优化目标了,这样的优点是它只依赖于g和h。
模型复杂度
我们还需要定义树的复杂度,首先,我们把树的定义改进为:
w是叶节点的分数向量,q是将每个数据点分配到叶子的函数,T是树的数量。在XGBoost中,我们定义复杂度为:
我们可以把目标函数写成:
其中是被分配到第j个叶子的数据点的索引集合。在第二行,我们改变了求和公式的索引,因为在同一个叶子上的所有数据都有相同的分数。我们再定义
和
,压缩式子为:
求得最小值:
我们看一下这张图理解一下,给定一个树,我们把g和h放到他们所属的叶子上,用公式算出这个树有多好。这个分数有点像决策树中的不纯度,不仅如此,它还把模型复杂度考虑进去了。
学习树结构
理论上,我们把所有可能的树都算出来,然后选择最好的那一个。实际上这很棘手,所以我们尝试在树的每一层都优化一次。我们把一个叶子分为两个叶子时,它得到的分数是:
这个式子可以分解为1)新的左子叶的分数2)新的右子叶的分数3)原来叶子的分数4)新增叶子的正则系数。在这里很重要的是:如果增加的分数小于正则项,我们就不再分裂。这就是树模型中常用的剪枝技术。
梯度提升 Gradient Boosting
首先,在训练集拟合一个树,针对第一个预测期与真实值的残差,训练第二个树。然后针对第二个树的残差,训练第三个树,以此类推,集成所有树的预测,这就被称为梯度提升。
XGBoost (Extreme Gradient Boosting)
XGBoost就是这样一种超级快速、可扩展、支持分布式的梯度提升库。
通常有两种方法可以调整参数来控制XGBoost中的过拟合:
1. 第一个方法是直接控制模型的复杂度
- 包括max_depth,min_child_weight和gamma
2. 第二个方法就是增加随机性,使训练对于噪声的鲁棒性好
- 包括subsample, colsample_bytree
- 也可以减小学习率eta,当这么做的时候需要增加num_round
参考资料
1. https://xgboost.readthedocs.io/en/latest/
2. Hands-On Machine Learning with Scikit-Learn and TensorFlow Concepts, Tools, and Techniques to Build Intelligent Systems by Aurélien Géron