首页 > 编程知识 正文

主观与客观通俗理解,粒子群算法原理

时间:2023-05-04 20:08:27 阅读:49512 作者:2886

原文链接: https://www.Jian Shu.com/p/105 fa a5 FB 5c 7

xgboost是目前很受欢迎的机器学习算法,在面试和竞赛中经常出现,但网上没有完全可以解释的文章。 因此,本文旨在用尽可能少的公式对xgboost进行明确的说明、理解和彻底的说明。

1背景知识XG提升是提升算法家族的一员,提升的根本思想是通过多个简单的弱分类器构建高精度的强分类器。 简而言之,boost意味着在每个步骤中我都可以生成弱预测模型,并对总模型进行加权和累积,从而用于回归和分类问题。 如果每一步骤的弱预测模型的生成是基于损耗函数的梯度方向的,则其被称为梯度提升,可以在几个步骤后实现接近损耗函数的局部最小值的目标。

boosting集成学习由多个相关决策树联合决策。 什么是关联? 举个例子,如果某个样本[数据-标签]为[ (2,4,5 ) ],第一个决策树在该样本中预测为3.3,则训练第二个决策树时的输入是该样本为[ (2,4,5 ) 我们每次学习的目标是上次学习的残差,残差很小直到满足我们的要求和其他结束条件。 该残差是将预测值相加后得到真值的累积量。

在上面的示例中,如果第二次直接预测获得0.7,则不一定好。 因为每走一小步就接近结果的效果比每走一大步就马上接近结果的方式更容易避免过拟合。 换句话说,我们的想法不完全信任所有的残差树。 我们认为所有的树都只学到了真理的一小部分。 累积的时候只累积一部分。 只需要学几瓶wzdppx就能弥补不足。

举个简单的例子,同样使用年龄来分支。 我们a的实际年龄是18岁,但第一棵树的预测年龄是12岁。 也就是说,残差是6岁。 那么,在第二棵树上把a的年龄作为6岁来学习。 如果第二棵树真的能把a分成6岁的叶子节点,那么把两棵树加起来的结论就是a的真实年龄。 如果第二棵树的结论是5岁,那么a还有1岁的残差,第三棵树的a的年龄是1岁……这样学习下去

相比之下,在random forest (随机森林)算法中,各决策树是独立的,各决策树从样本堆中随机选取样本,随机选取特征进行独立训练,各决策树之间没有毛线关系。

xgboost xgboost本质上是k个CART树,k是正整数。

CART树也称为分类和回归树,是既可以进行分类任务也可以进行回归任务的决策树。 分类树的输出是样本的类别,回归树的输出是实数(连续型变量)。

回归树的执行过程与分类树基本相似,但有以下两点不同:

第一,假设回归树的各节点得到的是预测值而不是分类树公式的样本数,在某树的某个节点上利用年龄进行分支(例如

第二,在分枝节点的选择中,回归树不选择最大熵值作为划分标准,而是选择最小化方差,即

很清楚,预测的错误次数越多,错误越多,方差就越大,通过使方差最小化就可以找到最可靠的分支依据。

对于回归问题,我们常用的损耗函数是MSE (均方误差),即:

image对于分类问题,我们常用的损失函数是对数损失函数:

image如前所述,xgboost是一种有k个CART树的综合学习算法,但问题是该怎么得到这k个树,k是多少。 (注意)不是随机得到k个树,而是一个个来,后面的取决于前面的) )。

我们的目标是在下一个造树过程中,尽量减小预测误差,尽量减少叶节点,尽量不使节点数值极端。 第一个目标很明确,第二个目标的理由是树的复杂度越低泛化能力越高。 以后可以看出,叶的节点数是树的复杂度计算的一个考虑因素,叶的节点数越多树就越复杂。 节点的数字不极端意味着一棵树上的一个样本的预测值与另一棵树上的该样本的预测值相比有很大的不同。 例如,如果给定样本的label数字为4,则第一个回归树为3,第二个预测为1。 另一个回归树,一个预测2,一个预测2,为什么倾向于后者呢? 前者意味着第一棵树学得太多,离4太近,有很大的拟合风险。

决策树生成:决策树算法应该很熟悉,尚不清楚的请先知道决策树算法。 在xgboost中,在生成决策树时,将属性分为以下几部分。

为了更好地解释xgboost算法,必须定义一些公式。

首先是模型预测:

这里的k是树的根数,f表示所有可能的CART树,f表示一根具体

的CART树,f k(x i)表示样本x i在第k棵树上的预测值。这个模型由K棵CART树组成。

模型的目标函数:


第一部分就是损失函数,第二部分就是正则项。y i表示期望输出。关于第二部分的解释,我在网站找了个图,不过下边和上面的公式有点不一样,注意一下就好。

还记得xgboost树的生成过程吗?一棵接一棵是不是?那么,我们的目标函数的优化过程页应当如此:首先优化第一棵树,完了之后再优化第二棵树,直至优化完K棵树。整个过程如下

所以,对于第t棵树,它的目标函数就是

这里,我们把f t(x i)当做我们模型的变量参数,本身它表示样本xi在第t棵树上的预测值,这个预测值使我们经过第t棵决策树分类后再计算一下得到的,也就是说虽然分类了,但我们可以给他设不同的值(或者叫权值,一般用w表示),所以这个值就是优化模型过程中用到的参数之一。可以发现,目标函数是f t(x i)的一次式和二次式,而且一次式项的系数是残差,此时就是一个值。而且一次式和二次式的函数优化问题又是特别简单的,是不是很棒,很激动。

综上,我们可以将损失函数用以下函数表示:



但是,损失函数一定是二次函数吗?如果不是,就俊逸的航空展开成二次,简单粗暴。

它背后的思路就是在损失函数上执行梯度下降,然后用基学习器对其进行拟合。当梯度为负时,我们称它为伪残差,因为它们依然能间接帮助我们最小化目标函数。

建树的过程中,在以下情况下完成这棵树的创建:
(1)当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思。
(2)当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,树太深很容易出现的情况学习局部样本,过拟合。
(3)当样本权重和小于设定阈值时则停止建树。

3 XGBoost和GBDT的区别

1)将树模型的复杂度加入到正则项中,来避免过拟合,因此泛化性能会好于GBDT。XGBoost的正则项会惩罚具有多个叶子节点的树结构。

2)损失函数是用俊逸的航空展开式展开的,同时用到了一阶导和二阶导,可以加快优化速度。

3)和GBDT只支持CART作为基分类器之外,还支持线性分类器,在使用线性分类器的时候可以使用L1,L2正则化。

4)引进了特征子采样,像RandomForest那样,这种方法既能降低过拟合,还能减少计算。

5)在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗,除此之外还考虑了稀疏数据集和缺失值的处理,对于特征的值有缺失的样本,XGBoost依然能自动找到其要分裂的方向。

6)XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。

参考资料:
https://blog.csdn.net/mxg1022/article/details/80702264
https://blog.csdn.net/yinyu19950811/article/details/81079192
https://www.cnblogs.com/jiangxinyang/p/9248154.html
https://www.jianshu.com/p/7467e616f227
https://blog.csdn.net/legendavid/article/details/78904353

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。