首页 > 编程知识 正文

xgboost回归原理,xgboost算法中文

时间:2023-05-04 08:24:24 阅读:32101 作者:2580

详细介绍xgboost算法(通过简单示例说明) boost算法概述集成学习任务xgboost概述xgboost的思想算法流程图举一个例子详细说明xgboost树的生成)首先,三个太阳属性为)天赋高,不恋爱,每天学习时间为16小时) )、天赋低,不恋爱3 .计算损耗函数每个样本预测值的导数4 .根据导数信息建立新决策树5 .用新决策树预测样本值,原始

作者还是浅学者,如有错误请指正。 谢谢你。

boost算法介绍

增压是弱分离器吗? (? )组合强分类器f (? 的算法框架

“弱分类器”的分类能力不强,但比随机选择的效果要好一些。 和“臭皮匠”很像。

“强分类器”具有很强的分类能力。 也就是说,抛出特征,他可以比较准确地分出来,就像“结实的吐司”。

如果可以直接制作强分类器的话,弱分类器实际上是多余的。 但是,世界上“聪明结实的吐司”很少,相反,在某些方面有才能的人很多。 于是,boost选择了用三个臭皮匠做结实的吐司。

整合学习的任务整合学习的主要手段是重复训练多个模型,并以一定的方式将这些模型进行组合,形成高性能强的整合模型。 在Boosting算法体系中一般采用迭代串联的形式生成一系列模型,并将这些模型进行线性加权相加,得到最终的综合学习器。 假设迭代到m-1次,得到的综合模型

在下一次迭代中,新生成的集成模型必须是训练集中损失最小的模型

XG boost概述XG boost的全名为“至尊梯度”boosting,由华盛顿大学的smdyj博士提出,用于Kaggle的hpdym信号识别竞赛中,因其优异的效率和高的预测精度而备受关注。

如果XGBoost思想boost算法的每个步骤的弱预测模型的生成是基于损耗函数的梯度方向的,则其被称为梯度提升。 XGBoost算法采用步进前向模型,每次迭代生成弱学习器后,不需要计算系数,模型形式如下:

XGBoost算法通过优化结构化损耗函数(加正规项的损耗函数降低了过拟合的风险)实现弱学习器的生成,XGBoost算法不采用搜索方法,直接利用损耗函数的一阶导数和二阶导数

在算法流程图中举例详细求解xgboost树的生成

举个预测学生考试分数的例子吧。 例如,试着赋予一些学生属性,如才能、每天的学习时间、是否恋爱等。 从决策树a可以看出,天赋属性预测结果:中天赋高的为分数90,天赋低的为60,而决策树b在每天学习时间10小时内对测试分数有-5的影响,但影响不大。 与此相同,XG提升是这样一个接一个生成新决策树a、b、c、D…的算法,最终生成的决策树算法是树A B C D …之和的决策树。

1 .首先,三个样本初始化后的考试成绩预测值为0,属性为“天赋高、不恋爱、每天学习时间为16小时”、“天赋低、不恋爱、每天学习时间为16小时”、“天赋高、不恋爱、每天学习时间为6小时”

这里,Tt是叶节点数,wj是j叶节点的权重, 是预先设计的超参数。

引入正则化项后,算法选取简单、性能好的模型,选取损耗函数右端的正则化项

每次迭代都是为了抑制弱学习器fi(x )的过拟合,不参与最终模型的合并。 XGBoost还要求l函数至少是二阶连续导数的凸函数。

XG boost系统的每次迭代都会构建新的决策树。 决策树是由与真值的残差构建的。 (才能高,不恋爱,每天学习时间16小时)大学霸100分,)才能低,不恋爱,每天学习时间16小时)小学霸70分,)才能高,不恋爱,每天学习时间6小时)小的,三个学生是第一个决策树在构建第二个决策树时,通过考虑残差(100-90=10 )、(70-60 )、(86-90=-4 )来构建新树(具体的树的制作过程将在后面叙述),从而得到最小化的90-5的预测值,进而() 如果反复次数达到上限或者残差不再减少是停止的话,就可以得到具有多个)反复次数)的决策树的强分类器。 当然,分类器需要考虑更多的样本,但是新添加的决策树fi(x可以被认为是n维空间中的点p[m]相对于点p(m-1的增量,因为有n个样本)。当然怎样得到一颗新的树呢?接着看第三个步骤

3 .计算损耗函数的每个样本预测值的导数为什么要计算导数

信息呢? ——XGBoost的精髓所在下面我们看一个关于目标函数的简单等式变换:
目标函数:


我们可以看到目标函数就这样被转换成了关于g_i和h_i的函数,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。这么写的原因很明显,由于之前的目标函数求最优解的过程中只对平方损失函数时候方便求,对于其他的损失函数变得很复杂,通过二阶zddhf展开式的变换,这样求解其他损失函数变得可行了。所以 XGBoost 是直接先求损失函数在该点处的zddhf近似值,然后通过最小化该近似损失函数值来训练弱学习器?? (??)。

4.根据导数的信息建立一颗新的决策树

这里求导数的的过程或者说求导的意义让笔者‘百思不得其解’,因为树模型是阶跃的,阶跃点是不可导的,所以求导就没意义了。
之后笔者查阅了xgboost的源代码,发现源代码对优化函数求导使用了一个简便的算法代替:

def log_reg(y_hat ,y): p = 1.0/(1.0+ np.exp(-y_hat)) g = p – y.get_lable() h= p * (1.0-p) return g,h

就是这么简单~~
所以树模型(回归树)可以通过导数信息寻找最优分裂点。

怎样通过导数建立树呢,我们可以把目标函数进行如下改写,其中j被定义为每个叶子上面样本集合。它将一个样本x 映射到一个相对应的叶子节点,那么可以写成如下形式

这一个目标包含了个相互独立的单变量二次函数。我们可以定义


wj就是新建立的树叶子的权值,通过计算对w求偏导=0得:

带入目标函数得:

假设我们从一个初始的节点(根节点)开始, I 表示该节点上所有样本的索引集,现在我们要对该节点进行分裂,设 IL,IR分别为分裂后左右子节点中样本的索引集,并且有I=IL∪IR 。那么根据上式我们可以计算出分裂前后第 m个树模型的损失函数值减小量为

这个公式跟我们决策树算法遇到的信心增益或基尼值增量的公式是一个道理。XGBoost 就是利用这个公式计算出的值作为分裂条件,在每一个节点的分裂中寻找最优的分裂和属性和分裂点。这样我们就能顺利地得到我们在第m 轮迭代中所需要的最优的模型fm(x)。

设有ABCDE五个学生,学习时间分别为16,12,8,6,4小时,通过计算不同分割方法的增益值来确定哪个分割是否是最优分割。我们生成如下一个决策树,决策树的增益值就是通过带入p = 1.0/(1.0+ np.exp(-y_hat)); g = p – y.get_lable();h= p * (1.0-p),计算每个节点的gi和hi,带入如下信息增益公式。注意引入的分割带来的增益小于一个阀值的时候,我们可以剪掉这个分割。

5.利用新的决策树预测样本值,并累加到原来的值上


xgboost的简单应用:根据诊断措施预测糖尿病的发病(Kaggle竞赛 )

数据集有如下几个属性:

部分数据集如下:

代码如下(数据pima-indians-diabetes.csv可以在网上下载)

from numpy import loadtxtfrom xgboost import XGBClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom xgboost import plot_importancefrom matplotlib import pyplotdataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")X = dataset[:,0:8]Y = dataset[:,8]seed = 7test_size = 0.33X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)model = XGBClassifier()eval_set = [(X_test, y_test)]model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)y_pred = model.predict(X_test)predictions = [round(value) for value in y_pred]accuracy = accuracy_score(y_test, predictions)print("Accuracy: %.2f%%" % (accuracy * 100.0))model.fit(X, Y)plot_importance(model)pyplot.show()

通过计算不同属性参与节点的分类个数可以看出对糖尿病发病情况影响最重要的属性是BMI。

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