第八十五篇 XGBoost梯度提升树

心得:总结一下xgboost相关的知识点,希望自己对它的理解更加深刻,xgboost在树模型里算是比较准确的,比较流行的算法,从我接触到的东西逐一总结一下。

一、简介

  1. 集成算法思想

    用单个决策树模型效果一般来说不是太好,通常会用一种集成的方法,就是一棵树效果可能不太好,用两棵树呢?多棵树呢?是指构建多个分类器(弱分类器)对数据集进行预测,然后用某种策略将多个分类器预测的结果集成起来,作为最终预测结果

    集成学习分为以下三类:
    在这里插入图片描述
    Bagging:

在这里插入图片描述

Boosting:
在这里插入图片描述

Stacking:

比如先用LR,GBDT,XGBOOST等每一种分类器各预测出一种结果,用所得出的预测结果用作下一个训练模型的输入。如此堆叠训练出的结果很强,但训练的时间较长
在这里插入图片描述

  1. 什么是xgboost

    GBDT(Gradient Boosting Decision Tree),XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。两者都是boosting方法。
    从一组弱学习器逐渐提升进化到一个强学习器,提升预测的准确度。这个过程重点是逐渐提升,所以起名boosting

  2. 它和决策树的区别是什么

    Xgboost就是由很多分类和回归树集成。(分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射)

  3. xgboost的工作原理是什么

    假设我们要预测一个人是否会喜欢电脑游戏,特征包括年龄,性别是否为男,是否每天使用电脑。标记(label)为是否喜欢电脑游戏,假设训练出如下模型
    在这里插入图片描述
    样本在两棵树中所在的叶节点如下:

在这里插入图片描述
最后对某样本累加它所在的叶子节点的输出值,例如:

在这里插入图片描述
gboost的训练是根据第一棵树的残差来建立第二棵树,以此类推,树建立的越多,累计的残差越小,预测的结果就越准确。

二、数学公式

1.公式推导:

公式推导有兴趣的可以去看此视频,能更加深入的理解原理:
https://www.bilibili.com/video/BV1Ks411V7Jg?from=search&seid=8079819112967891330

1.1目标函数

目标函数:损失 + 正则,教我们如何去寻找一个比较好的参数
一般的目标函数包含下面两项:
在这里插入图片描述

1.2 模型学习:additive training

第一部分是训练误差,第二部分是每棵树的复杂度的和。
每一次保留原来的模型不变,加入一个新的函数f到我们的模型中。
在这里插入图片描述
如何选择每一轮加入什么f呢?
选取一个f来使得我们的目标函数尽量最大地降低(加入f后的预测结果与实际结果误差减少)。
在这里插入图片描述
对于l是平方误差时:
在这里插入图片描述
对于l不是平方误差的情况:
采用如下的泰勒展开近似来定义一个近似的目标函数
在这里插入图片描述
移除常数项(真实值与上一轮的预测值之差),目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数
在这里插入图片描述

1.3树的复杂度

以上是目标函数中训练误差的部分,接下来定义树的复杂度。
对于f的定义做一下细化,把树拆分成结构函数q(输入x输出叶子节点索引)和叶子权重部分w(输入叶子节点索引输出叶子节点分数),结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。
在这里插入图片描述

定义一棵树的复杂度如下:
一棵树里面叶子节点的个数,以及每个树叶子节点上面输出分数的L2模平方。
在这里插入图片描述

目标函数改写:
在这里插入图片描述

其中I被定义为每个叶子上面样本集合Ij={i|q(xi)=ji} (每个叶子节点里面样本集合);
f(xi)等价于求出w(q(xi))的值(每一个样本所在叶子索引的分数) ;T为叶子节点数量。
定义Gj(每个叶子节点里面一阶梯度的和)Hj(每个叶子节点里面二阶梯度的和):
在这里插入图片描述
目标函数改写:
在这里插入图片描述
求偏导得出:
在这里插入图片描述
Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少,可叫做结构分数(structure score),Obj计算示例:
在这里插入图片描述

2. 代码实现需要用到的公式

2.1 叶子节点权重:

weight = -G.sum() / (H.sum() +gamma)
在这里插入图片描述

2.2 增益:

gain=1/2(left_score + right_score - total_score)-gamma

节点得分score:
score = (G.sum())^2 / (H.sum() + gamma)
在这里插入图片描述

2.3 自定义损失函数

  1. 损失函数举例
    在这里插入图片描述
  2. 针对Logistic loss求一阶二阶梯度
    g = label - y
    h = y * (1 - y)
    在这里插入图片描述

三、快速使用

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from xgboost import plot_importance  # 查看变量的重要程度
import matplotlib.pyplot as plt
from xgboost import XGBClassifier

data = load_iris()
X = data['data']
Y = data['target']
vars = data['target_names']

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)

#训练
model = XGBClassifier(n_estimators=200)
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, eval_set=eval_set, early_stopping_rounds=100, verbose=True)

# 打分,包含了预测
score = model.score(X_test, y_test)
print(score)

# 查看变量的重要程度
plot_importance(model)
plt.show()

在这里插入图片描述

四、xgboost库的用法和相关参数

n_estimators
训练树的个数,集成算法通过在数据上构建多个弱评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现

learning_rate
在这里插入图片描述

objective:
梯度提升算法中都存在着损失函数。不同于逻辑回归和SVM等算法中固定的损失函数写法,集成算法中的损失函数是可选的,常用的有:
在这里插入图片描述
subsample:采样比例
这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1

booster:弱评估器
在这里插入图片描述
gamma:
gamma设置的越大,算法就越保守,树的叶子节点就越少,模型的负责度就越低,因为gamma值越大的时候,损失函数下降更多才可以分裂节点。所以树生成的时候更不容易分裂节点
在这里插入图片描述
lambda:也称reg_lambda,默认值为0。

权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值