本文共 2310 字,大约阅读时间需要 7 分钟。
为子模型的预测函数,每个即是一棵树。
函数空间 即树的搜索空间。其中q为每棵树的结构,q将 域 中每个样本对应到唯一的叶节点上,最终产生T个叶节点, 则是该叶节点对应的权重,w即从节点到权重的映射(权重即叶节点的值)。 每个 对应一个独立的树结构q和该树每个叶节点的权重w。 (这里树结构是指每个分裂点和对应的分裂值)。 可以看做一个分段函数,q对应的不同的分段,w对应的为该分段的值, 即分段到值的映射。 对我们的预测函数 ,目标函数为: 从公式1中可以看出,对于最终的预测函数 ,其参数为一个个的函数 ,因为参数为函数,所以 无法使用传统的优化方法在欧氏空间中进行优化,而是采用了加法模型来进行训练。 boost的思想是将一系列弱分类器串行的组合起来,在前面的分类器的基础上迭代的优化新的分类器。 首先我们对所有的数据默认预测一个固定值 (对应xgboost中参数base_score,注意并不等于base_score,而是经过Sigmoid函数映射后的值),在此基础上根据该预测值与真实y值的损失 ,建立第一棵树 ,之后每次迭代时都是根据 其之前所有树做出的预测之和与真实y值的损失来建立新树。 也就是每次迭代建树时用新树 来优化前一个树的损失 。为第t棵树对第i个样本做出的预测。我们每次添加新树的时候,要优化的目标函数为上一个树产生的损失。
因此我们建立第t棵树时有损失函数: 为新建的这棵树做出的预测, 为之前所有的树预测值之和, 即是新建了当前这棵树后模型做出的预测值,求其与真实值 之间的损失(注意这里是损失不是残差,这里的 可以是log_loss, mse等)。 泰勒展开 gbdt的目标函数与xgboost区别就是带不带正则项,也就是上面式子中的 。 gbdt对损失函数的优化是直接使用了损失函数的负梯度,沿着梯度下降的方向来减小损失,其是也就是一阶泰勒展开。 而xgboost在这里使用了二阶泰勒展开,因为包含了损失函数的二阶信息,其优化的速度大大加快。 下面来看一下泰勒展开的推导。首先我们来复习一下泰勒定理: 设n是一个正整数。如果定义在一个包含a的区间上的函数f在a点处n+1次可导,那么对于这个区间上的任意x,则有: 其中的多项式称为函数在a处的泰勒展开式,剩余的 是泰勒公式的余项,是 的高阶无穷小。 该公式经过变换 可以得到二阶展开式: 对于式子: 可以这样分析, 为预测值 和真实值 之间的损失, 为常量,因此是以预测值为自变量的函数,当建立新树给出新的预测后,相当于在上一次的预测 上增加了一个无穷小量 令 则有 其中真实标签 是常数, 是上次迭代求出的值即这里的 , 为无穷小量 。 有了这个对应之后。 因此我们建立第t棵树时有损失函数: 令损失函数的一阶、二阶偏导分别为 ,其中 , 式中 为常量,优化的是损失函数的最小值,因此常量值可以从损失函数中去掉。上式可简化为:除了对目标函数添加正则项外,为了减小过拟合,xgboost还使用了列采样和缩减方法(Shrinkage,即Learning rate)。
网络人工智能园地,力求打造网络领域第一的人工智能交流平台,促进华为iMaster NAIE理念在业界(尤其通信行业)形成影响力!
转载地址:http://rqwcy.baihongyu.com/