【机器学习】揭秘GBDT:梯度提升决策树

简介: 【机器学习】揭秘GBDT:梯度提升决策树

学习目标

🍀 掌握提升树的算法原理思想

🍀 了解梯度提升树的原理思想

🍔 提升树

梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法,所以在讲梯度提升树之前先来说一下提升树。

先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。

上面提到的残差是什么呢?

假设:

  1. 我们前一轮迭代得到的强学习器是:ft-1(x)
  2. 损失函数是:L(y,ft−1(x))
  3. 本轮迭代的目标是找到一个弱学习器:ht(x)
  4. 让本轮的损失最小化: L(y, ft(x))=L(y, ft−1(x)) + ht(x))

当采用平方损失函数时:

则:

令:R = y - ft-1(x),则:

此处,R 是当前模型拟合数据的残差(residual)

所以,对于提升树来说只需要简单地拟合当前模型的残差。

🍔 梯度提升树

GBDT,全称为Gradient Boosting Decision Tree,即梯度提升决策树(梯度提升树),是一种迭代的决策树算法,也被称作MART(Multiple Additive Regression Tree)。它通过将多个决策树(弱学习器)的结果进行累加来得到最终的预测输出,是集成学习算法的一种,具体属于Boosting类型。

梯度提升树不再使用拟合残差,而是利用最速下降的近似方法,利用损失函数的负梯度作为提升树算法中的残差近似值。

假设: 损失函数仍然为平方损失, 则每个样本要拟合的负梯度为:

此时, 我们发现 GBDT 拟合的负梯度就是残差,或者说对于回归问题,拟合的目标值就是残差。

如果我们的 GBDT 进行的是分类问题,则损失函数变为 logloss,此时拟合的目标值就是该损失函数的负梯度值。

🍔 举例介绍

3.1 初始化弱学习器(CART树)

我们通过计算当模型预测值为何值时,会使得第一个基学习器的平方误差最小,即:求损失函数对 f(xi) 的导数,并令导数为0.

3.2 构建第一个弱学习器(CART树)

由于我们拟合的是样本的负梯度,即:

由此得到数据表如下:

上表中平方损失计算过程说明(以切分点1.5为例):

  1. 切分点1.5 将数据集分成两份 [5.56],[5.56 5.7 5.91 6.4 6.8 7.05 8.9 8.7 9. 9.05]
  2. 第一份的平均值为5.56 第二份数据的平均值为(5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05)/9 = 7.5011
  3. 由于是回归树,每份数据的平均值即为预测值,则可以计算误差,第一份数据的误差为0,第二份数据的平方误差为 :

$(5.70-7.5011)^2+(5.91-7.5011)^2+...+(9.05-7.5011)^2 = 15.72308$

以 6.5 作为切分点损失最小,构建决策树如下:

3.3 构建第二个弱学习器(CART树)

以 3.5 作为切分点损失最小,构建决策树如下:

3.4 构建第三个弱学习器(CART树)

以 6.5 作为切分点损失最小,构建决策树如下:

3.5 最终强学习器

🍔 GBDT算法

1.初始化弱学习器

2.对$m=1,2,\cdots,M$有:

(a)对每个样本$i=1,2,\cdots,N$,计算负梯度,即残差

(b)将上步得到的残差作为样本新的真实值,并将数据$(x_i,r{im}), i=1,2,..N$作为下棵树的训练数据,得到一颗新的回归树$f{m} (x)$其对应的叶子节点区域为$R_{jm}, j =1,2,\cdots,J$。其中J为回归树t的叶子节点的个数。

(c)对叶子区域$j=1,2,\cdots,J$计算最佳拟合值

(d)更新强学习器

(3)得到最终学习器

🍔 泰坦尼克号案例实战

该案例是在随机森林的基础上修改的,可以对比讲解。

数据地址:

Titanic - Machine Learning from Disaster | Kaggle

5.1 导包并选取特征

1.数据导入

# 导入数据
import  pandas as pd
# 利用pandas的read.csv模块从互联网中收集泰坦尼克号数据集
titanic=pd.read_csv("data/titanic.csv")
titanic.info() #查看信息

2.人工选择特征pclass,age,sex

X=titanic[['pclass','age','sex']]
y=titanic['survived']

3.特征工程

# 数据的填补
X['age'].fillna(X['age'].mean(),inplace=True)

5.2 切分数据及特征处理

数据的切分

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.25,random_state=22)

将数据转化为特征向量

from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False)
X_train=vec.fit_transform(X_train.to_dict(orient='records'))
X_test=vec.transform(X_test.to_dict(orient='records'))

5.3 三种分类器训练及预测

4.使用单一的决策树进行模型的训练及预测分析

from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(X_train,y_train)
dtc_y_pred=dtc.predict(X_test)
print("score",dtc.score(X_test,y_test))

5.随机森林进行模型的训练和预测分析

from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(random_state=9)
rfc.fit(X_train,y_train)
rfc_y_pred=rfc.predict(X_test)
print("score:forest",rfc.score(X_test,y_test))

6.GBDT进行模型的训练和预测分析

from sklearn.ensemble import GradientBoostingClassifier
gbc=GradientBoostingClassifier()
gbc.fit(X_train,y_train)
gbc_y_pred=gbc.predict(X_test)
print("score:GradientBoosting",gbc.score(X_test,y_test))

5.4 三种分类器性能评估

7.性能评估

from sklearn.metrics import classification_report
print("dtc_report:",classification_report(dtc_y_pred,y_test))
print("rfc_report:",classification_report(rfc_y_pred,y_test))
print("gbc_report:",classification_report(gbc_y_pred,y_test))

🍔 集成算法多样性

集成学习中,个体学习器多样性越大越好。通常为了增大个体学习器的多样性,在学习过程中引入随机性。常用的方法包括:对数据样本进行扰动、对输入属性进行扰动、对算法参数进行扰动。

6.1 数据样本扰动

给定数据集,可以使用采样法从中产生出不同的数据子集。然后在利用不同的数据子集训练出不同的个体学习器。

该方法简单有效,使用广泛。

(1)数据样本扰动对于“不稳定学习器”很有效。“不稳定学习器”是这样一类学习器:训练样本稍加变化就会导致学习器有显著的变动,如决策树和神经网络等。

(2)数据样本扰动对于“稳定学习器”无效。“稳定学习器”是这样一类学习器:学习器对于数据样本的扰动不敏感,如线性学习器、支持向量机、朴素贝叶斯、K近邻学习器等。

如Bagging算法就是利用Bootstrip抽样完成对数据样本的自助采样。

6.2 输入属性的扰动

训练样本通常由一组属性描述,可以基于这些属性的不同组合产生不同的数据子集,然后在利用这些数据子集训练出不同的个体学习器。

(1)若数据包含了大量冗余的属性,则输入属性扰动效果较好。此时不仅训练出了多样性大的个体,还会因为属性数量的减少而大幅节省时间开销。同时由于冗余属性多,即使减少一些属性,训练个体学习器也不会很差。

(2)若数据值包含少量属性,则不宜采用输入属性扰动法。

6.3 算法参数的扰动

通常可以通过随机设置不用的参数,比如对模型参数加入小范围的随机扰动,从而产生差别较大的个体学习器。

在使用交叉验证法(GridSearch网格搜索)来确定基学习器的参数时,实际上就是用不同的参数训练出来了多个学习器,然后从中挑选出效果最好的学习器。集成学习相当于将所有这些学习器利用起来了。

随机森林学习器就结合了数据样本的扰动及输入属性的扰动。

🍔 小结

🍬 提升树中的每一个弱学习器通过拟合残差来构建强学习器

🍬 梯度提升树中的每一个弱学习器通过拟合负梯度来构建强学习器


相关文章
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
梯度下降求极值,机器学习&深度学习
梯度下降求极值,机器学习&深度学习
52 0
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
179 0
|
机器学习/深度学习 存储 算法
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
533 0
|
3月前
|
机器学习/深度学习 存储 缓存
【机器学习】随机森林、AdaBoost、GBDT、XGBoost从零开始理解
介绍了机器学习中的几种集成学习算法,包括随机森林、AdaBoost、梯度提升决策树(GBDT)和XGBoost,解释了它们的概念、优缺点、算法过程以及系统设计。
169 5
【机器学习】随机森林、AdaBoost、GBDT、XGBoost从零开始理解
|
3月前
|
机器学习/深度学习
【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
长短时记忆网络(LSTM)的基本概念、解决梯度消失问题的机制,以及介绍了包括梯度裁剪、改变激活函数、残差结构和Batch Normalization在内的其他方法来解决梯度消失或梯度爆炸问题。
149 2
|
3月前
|
机器学习/深度学习 算法 数据挖掘
|
3月前
|
机器学习/深度学习 算法
【机器学习】梯度消失和梯度爆炸的原因分析、表现及解决方案
本文分析了深度神经网络中梯度消失和梯度爆炸的原因、表现形式及解决方案,包括梯度不稳定的根本原因以及如何通过网络结构设计、激活函数选择和权重初始化等方法来解决这些问题。
430 0
|
5月前
|
机器学习/深度学习 人工智能 Dart
AI - 机器学习GBDT算法
梯度提升决策树(Gradient Boosting Decision Tree),是一种集成学习的算法,它通过构建多个决策树来逐步修正之前模型的错误,从而提升模型整体的预测性能。
|
5月前
|
机器学习/深度学习 数据采集 分布式计算
【机器学习】XGBoost: 强化学习与梯度提升的杰作
在机器学习的广阔领域中,集成学习方法因其卓越的预测性能和泛化能力而备受瞩目。其中,XGBoost(Extreme Gradient Boosting)作为梯度提升决策树算法的杰出代表,自其诞生以来,便迅速成为数据科学竞赛和工业界应用中的明星算法。本文旨在深入浅出地介绍XGBoost的核心原理、技术优势、实践应用,并探讨其在模型调优与解释性方面的考量,为读者提供一个全面且深入的理解框架。
179 2
|
5月前
|
机器学习/深度学习 存储 人工智能
【机器学习】GBDT (Gradient Boosting Decision Tree) 深入解析
GBDT,全称为Gradient Boosting Decision Tree,即梯度提升决策树,是机器学习领域中一种高效且强大的集成学习方法。它通过迭代地添加决策树以逐步降低预测误差,从而在各种任务中,尤其是回归和分类问题上表现出色。本文将深入浅出地介绍GBDT的基本原理、算法流程、关键参数调整策略以及其在实际应用中的表现与优化技巧。
1265 1