通过对比Bagging/Boosting/RF/GDBT来理解XGB

引入

用过XGB模型的人,都大致知道,XGB是由多棵树组成的,像一片森林,这是一种集成学习方法。但是,这片森林里的每棵树都是通过纯度计算与分支划分得到的吗?多棵树是如何组合(集成)在一起共同做决策的呢?XGB和RandomForest是什么区别?XGB和GDBT又有什么区别呢?

如何才能解释这些问题

首先,我们需要理解几个概念

(1)集成学习

集成学习分为三种算法:Bagging,Boosting和Stacking

  • Bagging:从原样本中,通过采样获得多个训练集,分别训练多个模型,具体过程如下所示

在这里插入图片描述

  • Boosting:先从出事训练集训练出一个基学习器,再根据基学习器的表现,对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;最终多个基学习器进行加权结合,具体过程如下所示

在这里插入图片描述

  • Stacking:将每个基分类器的输出组合起来作为一个特征向量,重新训练新模型进行最终决策[2]

(2)RandomForest,GDBT与XGB

  • RandomForest: 随机森林,是在Bagging的基础上,添加了随机因素,训练而成的模型。

  • GDBT: GradientBoost,梯度提升决策树,在Boosting的基础上。Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树

  • XGB: 在Boosting的基础上实现的,XGB可以看作是对GDBT的优化。其原理还是基于GDBT,它的创新之处是用了二阶导数和正则项。

了解这些知识点,我们就能解释这几个问题了

(1)森林里的每棵树都是通过纯度计算与分支划分得到的吗?
回答:是的,因为集成学习中的基分类器,都是由决策树构成的,所以每颗决策树,都是通过基尼指数来做纯度计算后,划分分支的。

(2)多棵树是如何组合(集成)在一起共同做决策的呢?
回答:不同的模型不一样,RandomForest是基于Bagging算法做的集成学习,而XGB和GDBT是基于Boosting算法做的集成学习。

(3)XGB和RandomForest是什么区别?
回答:见上面一个问题的回答。

(4)XGB和GDBT又有什么区别呢?
回答:详见[4]

  • 传统的GBDT以CART树作为基学习器,XGB还支持线性分类器,这个时候XGB相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归)
  • 传统的GBDT在优化的时候只用到一阶导数信息,XGB则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数
  • XGB在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGB优于传统GBDT的一个特性

(5)Bagging和Boosting有什么区别
回答:

  • 样本选择:Bagging做有放回的数据集采样,Boosting的每一次训练集长度都一样
  • 样本权重:Bagging每个样本权重都一样,Boosting每个样本权重都不同
  • 分类器权重:Bagging每个基分类器权重都一样,Boosting每个基分类器权重都不同
  • 并行计算:Bagging可以做并行,因为每个基分类器可以独立训练;Boosting理论上不能做并行,因为后面的基分类器依赖于前一个基分类器

参考

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bagging算法和boosting算法都是集成学习算法,但它们的思路和实现方式有所不同。bagging算法(自举聚合法)是一种并行式的集成学习算法,它通过随机有放回地抽样来构造不同的子数据集,然后分别使用这些子数据集来训练不同的分类器,最终将多个分类器的结果进行平均或多数表决来预测新的数据。boosting算法(提升方法)是一种串行式的集成学习算法,它通过迭代地训练不同的分类器,每次训练的分类器都会关注前一次分类器的错误,并试图修正这些错误,最终将多个分类器的结果加权求和来预测新的数据。 下面我们使用Python的scikit-learn库来比较bagging算法和boosting算法在数据集上的表现: ``` ## 导入需要的库 from sklearn.ensemble import GradientBoostingRegressor, BaggingRegressor from sklearn.metrics import mean_squared_error from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split ## 生成数据集 X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42) ## 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ## 训练Gradient Boosting模型 gb_model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, random_state=42) gb_model.fit(X_train, y_train) ## 预测测试集 gb_pred = gb_model.predict(X_test) ## 计算Gradient Boosting模型的均方误差 gb_mse = mean_squared_error(y_test, gb_pred) print("Gradient Boosting MSE:", gb_mse) ## 训练Bagging模型 dt_model = DecisionTreeRegressor() bg_model = BaggingRegressor(base_estimator=dt_model, n_estimators=100, random_state=42) bg_model.fit(X_train, y_train) ## 预测测试集 bg_pred = bg_model.predict(X_test) ## 计算Bagging模型的均方误差 bg_mse = mean_squared_error(y_test, bg_pred) print("Bagging MSE:", bg_mse) ``` 以上代码中,我们首先生成了一个具有10个特征的回归数据集,并划分训练集和测试集。然后,我们使用GradientBoostingRegressor和BaggingRegressor来分别训练Gradient Boosting模型和Bagging模型。最后,我们使用均方误差(MSE)来评估两个模型的预测效果。 需要注意的是,这里的数据集是人工生成的,因此MSE的值仅供参考,实际应用中会受到数据集的特点、模型参数、评价指标等多种因素的影响。通常来说,在不同的数据集和应用场景下,bagging算法和boosting算法的表现也会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值