除了Adaboost,Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 以下简称GBDT)做一个总结。
GBDT有很多简称,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其实都是指的同一种算法,GBDT。
GBDT在BAT大厂中也有广泛的应用,假如要选择3个最重要的机器学习算法的话,GBDT应该占一席之地。

GBDT原理和实例:(回归实例)
https://blog.csdn.net/zpalyq110/article/details/79527653#commentBox

1 GBDT概述

GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。

在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x)f_{t−1}(x)ft−1​(x), 损失函数是L(y,ft−1(x))L(y,f_{t−1}(x))L(y,ft−1​(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小

从上面的例子看这个思想还是蛮简单的,但是有个问题是这个损失的拟合不好度量,损失函数各种各样,怎么找到一种通用的拟合方法呢?

2 GBDT的负梯度拟合/损失函数

3 CART TREE(是一种二叉树) 如何生成:

CART TREE 生成的过程其实就是一个选择特征的过程。假设我们目前总共有 M 个特征。第一步我们需要从中选择出一个特征 j,做为二叉树的第一个节点。然后对特征 j 的值选择一个切分点 m. 一个 样本的特征j的值 如果小于m,则分为一类,如果大于m,则分为另外一类。如此便构建了CART 树的一个节点。其他节点的生成过程和这个是一样的。现在的问题是在每轮迭代的时候,如何选择这个特征 j,以及如何选择特征 j 的切分点 m。

5 前向分布算法

6 二分类,多分类

首先明确一点,gbdt 无论用于分类还是回归一直都是使用的CART 回归树。不会因为我们所选择的任务是分类任务就选用分类树,这里面的核心是因为gbdt 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。残差相减是有意义的。
如果选用的弱分类器是分类树,类别相减是没有意义的。上一轮输出的是样本 x 属于 A类,本一轮训练输出的是样本 x 属于 B类。 A 和 B 很多时候甚至都没有比较的意义,A 类- B类是没有意义的。

GBDT 多分类举例说明:

这是一个有6个样本的三分类问题。我们需要根据这个花的花萼长度,花萼宽度,花瓣长度,花瓣宽度来判断这个花属于山鸢尾,杂色鸢尾,还是维吉尼亚鸢尾。具体应用到gbdt多分类算法上面。
我们用一个三维向量来标志样本的label。[1,0,0] 表示样本属于山鸢尾,[0,1,0] 表示样本属于杂色鸢尾,[0,0,1] 表示属于维吉尼亚鸢尾。

gbdt 的多分类是针对每个类都独立训练一个 CART Tree。
所以这里,我们将针对山鸢尾类别训练一个 CART Tree 1。杂色鸢尾训练一个 CART Tree 2 。维吉尼亚鸢尾训练一个CART Tree 3,这三个树相互独立。

我们以样本 1 为例:
针对 CART Tree1 的训练样本是[5.1,3.5,1.4,0.2],label 是 1,最终输入到模型当中的为[5.1,3.5,1.4,0.2,1]。针对 CART Tree2 的训练样本也是[5.1,3.5,1.4,0.2],但是label 为 0,最终输入模型的为[5.1,3.5,1.4,0.2,0].
针对 CART Tree 3的训练样本也是][5.1,3.5,1.4,0.2],label 也为0,最终输入模型当中的为[5.1,3.5,1.4,0.2,0]。

下面我们来看 CART Tree1 是如何生成的,其他树 CART Tree2 , CART Tree 3的生成方式是一样的。
CART Tree的生成过程是从这四个特征中找一个特征做为CART Tree1 的节点。比如花萼长度做为节点。6个样本当中花萼长度 大于5.1 cm的就是 A类,小于等于 5.1 cm 的是B类。
生成的过程其实非常简单,问题 1.是哪个特征最合适? 2.是这个特征的什么特征值作为切分点?
即使我们已经确定了花萼长度做为节点。花萼长度本身也有很多值。在这里我们的方式是遍历所有的可能性,找到一个最好的特征和它对应的最优特征值可以让当前式子的值最小。

我们以第一个特征的第一个特征值为例。R1 为所有样本中花萼长度小于 5.1 cm 的样本集合,R2 为所有样本当中花萼长度大于等于 5.1cm 的样本集合。所以 R1={2},R2={1,3,4,5,6}。

下面便开始针对所有的样本计算这个式子的值。样本1 属于 R2 计算的值为(1−0.2)2(1−0.2)^2(1−0.2)2 ,样本2 属于R1 计算的值为(1−1)2(1−1)^2(1−1)2, 样本 3,4,5,6同理都是 属于 R2的 所以值是(0−0.2)2. 把这六个值加起来,便是 山鸢尾类型在特征1 的第一个特征值的损失值。这里算出来(1−0.2)2+(1−1)2+(0−0.2)2+(0−0.2)2+(0−0.2)2+(0−0.2)2=0.84(1-0.2)^2+ (1-1)^2 + (0-0.2)^2+(0-0.2)^2+(0-0.2)^2 +(0-0.2)^2= 0.84(1−0.2)2+(1−1)2+(0−0.2)2+(0−0.2)2+(0−0.2)2+(0−0.2)2=0.84



7 sklearn参数

GradientBoostingClassifier支持二进制和多类分类

from  sklearn.datasets  import  make_hastie_10_2
from  sklearn.ensemble  import  GradientBoostingClassifier
X, y = make_hastie_10_2(random_state=0)
X_train, X_test = X[:2000], X[2000:]
y_train, y_test = y[:2000], y[2000:]clf = GradientBoostingClassifier(
loss='deviance',  ##损失函数默认deviance  deviance具有概率输出的分类的偏差
n_estimators=100, ##默认100 回归树个数 弱学习器个数
learning_rate=0.1,  ##默认0.1学习速率/步长0.0-1.0的超参数  每个树学习前一个树的残差的步长
max_depth=3,   ## 默认值为3每个回归树的深度  控制树的大小 也可用叶节点的数量max leaf nodes控制
subsample=1,  ##树生成时对样本采样 选择子样本<1.0导致方差的减少和偏差的增加
min_samples_split=2, ##生成子节点所需的最小样本数 如果是浮点数代表是百分比
min_samples_leaf=1, ##叶节点所需的最小样本数  如果是浮点数代表是百分比
max_features=None, ##在寻找最佳分割点要考虑的特征数量auto全选/sqrt开方/log2对数/None全选/int自定义几个/float百分比
max_leaf_nodes=None, ##叶节点的数量 None不限数量
min_impurity_split=1e-7, ##停止分裂叶子节点的阈值
verbose=0,  ##打印输出 大于1打印每棵树的进度和性能
warm_start=False, ##True在前面基础上增量训练(重设参数减少训练次数) False默认擦除重新训练
random_state=0  ##随机种子-方便重现
).fit(X_train, y_train)  ##多类别回归建议使用随机森林
print clf.score(X_test, y_test)  ##tp / (tp + fp)正实例占所有正实例的比例
test_y= clf.predict(X_test)
test_y= clf.predict_proba(X_test)[:,1] ##预测概率
print clf.feature_importances_  ##输出特征重要性
print clf.train_score_  ##每次迭代后分数
##test_y= clf.predict(X_test)
##from sklearn.metrics import precision_score
##precision_score(test_y, y_test,average='micro')  ##tp / (tp + fp)
##from sklearn import metrics
##fpr, tpr, thresholds = metrics.roc_curve(y_test, test_y)
##print("auc : %.4g" % metrics.auc(fpr, tpr)
y_pre= clf.predict(X_test)
y_pro= clf.predict_proba(X_test)[:,1] ##预测概率
from sklearn import metrics
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pro)
print("auc : %.4g" % metrics.auc(fpr, tpr),x%10000/100,x%100) #auc表示一
print "AUC Score (Train): %f" % metrics.roc_auc_score(y_test, y_pro) #auc表示二 两种方式等价
print"Accuracy : %.4g" % metrics.accuracy_score(y_test, y_pre) ##等价于clf.score(X_test, y_test)

回归:
sklearn.ensemble.GradientBoostingRegressor

import numpy as np
from sklearn import ensemble
from sklearn import datasets
from sklearn.utils import shuffle
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_scoreboston = datasets.load_boston()
X, y = shuffle(boston.data, boston.target, random_state=13) #抽取
X = X.astype(np.float32)
offset = int(X.shape[0] * 0.9) #设置取0.9做样本
X_train, y_train = X[:offset], y[:offset]
X_test, y_test = X[offset:], y[offset:]
##参数可以放入一个字典当中
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,'learning_rate': 0.01, 'loss': 'ls'}
clf = ensemble.GradientBoostingRegressor(**params)
clf.fit(X_train, y_train)
mse = mean_squared_error(y_test, clf.predict(X_test))
r2 = r2_score(y_test, clf.predict(X_test))
print("MSE: %.4f" % mse) ##输出均方误差
print("r^2 on test data : %f" % r2) ##R^2 拟合优度=(预测值-均值)^2之和/(真实值-均值)^2之和##绘图查看
import matplotlib.pyplot as plt
test_score = np.zeros((params['n_estimators'],), dtype=np.float64)
##计算每次迭代分数变化
for i, y_pred in enumerate(clf.staged_predict(X_test)):test_score[i] = clf.loss_(y_test, y_pred)plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('Deviance')
plt.plot(np.arange(params['n_estimators']) + 1, clf.train_score_, 'b-',label='Training Set Deviance')
plt.plot(np.arange(params['n_estimators']) + 1, test_score, 'r-',label='Test Set Deviance')
plt.legend(loc='upper right')
plt.xlabel('Boosting Iterations')
plt.ylabel('Deviance')
##输出特征重要性
feature_importance = clf.feature_importances_
# make importances relative to max importance
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)  ##返回的是数组值从小到大的索引值
pos = np.arange(sorted_idx.shape[0]) + .5
plt.subplot(1, 2, 2)
plt.barh(pos, feature_importance[sorted_idx], align='center')
plt.yticks(pos, boston.feature_names[sorted_idx])
plt.xlabel('Relative Importance')
plt.title('Variable Importance')
plt.show()

最近好忙。。。

参考博客1
参考博客2

打卡训练营中优秀博客:https://zhuanlan.zhihu.com/p/58105824

boosting-GBDT算法相关推荐

  1. CTR 预测理论(九):Boosting 集成算法中 Adaboost, GBDT 与 XGBoost 的区别

    https://blog.csdn.net/Dby_freedom/article/details/81975255 最近总结树模型,尝试将主流 Boosting 实现方式做一个分析汇总,文中部分内容 ...

  2. gbdt 算法比随机森林容易_机器学习(七)——Adaboost和梯度提升树GBDT

    1.Adaboost算法原理,优缺点: 理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络.对于决策树,Adaboost分类用了CART分类 ...

  3. gbdt 算法比随机森林容易_随机森林与GBDT

    Bagging策略 1.总样本数量是n个,从样本中重采样(有放回的)选出n个样本 ,会有约33.2%的样本不会被抽到 2.在所有属性上对这n个样本建立分类器(比如决策树,svm,lr) 3.重复步骤1 ...

  4. 决策树之 GBDT 算法 - 回归部分

    GBDT(Gradient Boosting Decision Tree)是被工业界广泛使用的机器学习算法之一,它既可以解决回归问题,又可以应用在分类场景中,该算法由斯坦福统计学教授 Jerome H ...

  5. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法

    本文首发于我的微信公众号里,地址:梯度提升(Gradient Boosting)算法 本文禁止任何形式的转载. 我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI ...

  6. GBDT 算法:原理篇

    2019独角兽企业重金招聘Python工程师标准>>> 本文由云+社区发表 GBDT 是常用的机器学习算法之一,因其出色的特征自动组合能力和高效的运算大受欢迎. 这里简单介绍一下 G ...

  7. gbdt算法_GBDT算法原理及应用

    是新朋友吗?记得先点蓝字关注我哦- 作者介绍 知乎@王多鱼 京东的一名推荐算法攻城狮. 主要负责商品推荐的召回和排序模型的优化工作. 一.GBDT算法原理 Gradient Boosting Deci ...

  8. GBDT算法原理个人总结

    0.前言 本文仅仅是自己的学习总结,好记性不如烂笔头,相信对你也会有一些启发吧,可能会与其他博客有很多相似的地方,如若侵权,立删. 1.提升树 在讲GBDT之前,首先要讲一下提升树(Boosting ...

  9. 关于GBDT算法、XGBoost算法的基本原理概述

    GBDT 梯度提升决策树GBDT是一种利用残差拟合弱学习器的集成算法,该算法是由Boosting中最具代表性的Adaboost算法演变而来,其中各个基学习器之间并不独立,是一种串行关系. GBDT的基 ...

  10. 机器学习(五)——GBDT算法

    1.GBDT概述 GBDT也是集成学习Boosting家族的成员,GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型.在GBDT的迭代中,假设我们前一轮迭代得到的强学习 ...

最新文章

  1. Kotlin Gson解析泛型对象
  2. 研究consul的service mesh功能
  3. GRE核心词汇助记与精练-List10感觉,感情
  4. SQLite 安装(http://www.w3cschool.cc/sqlite/sqlite-installation.html)
  5. mysqldumper 与 Innobackupex的备份和恢复操作实验过程
  6. linux下vi修改文件用法
  7. MVC学习之分页 【转】
  8. sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平
  9. cholesky分解java代码_Cholesky 分解(转)
  10. redis-数据类型-普通集合
  11. php 5.4.25,php5.4.25的c核心用vs2008sp1编译无法通过。解决思路
  12. 表主键自增长Mybatis插入数据报错
  13. ubuntu命令行打开vscode-insider_在 Linux 中如何从命令行查找 VirtualBox 版本
  14. android o系统字体下载,fonts软件安卓下载-fonts字体 安卓版v4.0.0-PC6安卓网
  15. 删除IE浏览器JS缓存
  16. notepad 自动排版html,notepad++怎么自动排版
  17. edu教育网邮箱注册申请普及
  18. 高端域名出售如何选择交易平台?
  19. 机械臂抓取实验笔记总结
  20. ICPR MTWI 2018挑战赛 网络图像的文本识别之数据预处理

热门文章

  1. 苹果手机录屏软件_4款手机录屏软件推荐,你觉得哪款更好用?
  2. 网页实现微信扫描二维码登录
  3. 简单网页布局的html代码网站,一个简单的网页布局代码
  4. Unity怎么变中文
  5. viper4android 机顶盒,利用VIPer53封装上系统实现经济型机顶盒供电
  6. mac中不允许安装第三方软件
  7. Android RecyclerView 子条目(item)嵌套 RecyclerView
  8. 2019支付版/聚合支付第三方支付/四方支付系统/提供技术咨询服务
  9. 蜗牛星际B双 安装黑群晖7.1(U盘引导)
  10. ITIL 4 Foundation知识体系-第一章-介绍