当前位置:   article > 正文

GBDT算法_gbdt怎么计算特征重要性

gbdt怎么计算特征重要性

GBDT:

先从BDT这个简单的做个引入讲解,它是使用的cart决策树作为基学习器的基层学习方法,又名提升树。

上图就是BDT的流程图,代表的就是说,有一份训练数据training samples,经过一个弱学习器1weak learning1,是不是会得到一个预测结果,然后这个预测结果是不是对比真实值是有误差的,然后和真实值作差,就会得到样本的残差sample residuals,然后训练第二个弱学习器的时候就可以使用这个残差作为弱学习器的训练数据,去训练第二个弱学习器,以此类推。

我们知道提升树BDT也是Boosting思想,因此它也的遵守加法模型和前向算法。

BDT的整体流程:

  1. 初始化f0(x)= 0
  2. 遍历m个弱学习器,for i in M
  3. 针对每一个样本计算残差:r = y - f(m-1)
  4. 利用x和r训练出一颗决策树T
  5. 更新F(m)= F(m-1)+ T
  6. 完成以上迭代,得到最终的强分类器(提升树):F(m) = ∑T(x;θ)

其中的重点就是我们每在训练一个弱学习器的时候,都是利用上一个弱分类器所产生的的残差。

GBDT(梯度提升决策树):

利用损失函数的负梯度来拟合基学习器。我们的BDT中使用的是什么?残差吧,这就是其中一个重要的区别吧。

为什么说可以使用负梯度去代替残差?

为了方便通过均方误差来举个例子。

GBDT算法的流程:

GBDT算法的一个流程:

通过对比我们发现,BDT和GBDT的区别分别有哪些?

  1. 每次训练的数据不同,BDT使用的是残差,而GBDT使用了负梯度去代替了残差。
  2. 在GBDT中每个弱分类器的模型都会有一个相应的权重。

拓展补充:

GBDT和BDT只能使用CART作为基分类器

梯度提升和梯度下降的区别和对比:

梯度下降:

梯度下降用于求解无约束参数最优化问题。

梯度提升:

给定一个数据集D={(xi,yi)},任务是训练一个函数F来拟合这份数据,假设损失函数是均方误差,一开始我们训练了一个函数h0,赋值给F,此时F=h0,然后是不是每一个样本都会产生一个误差,也叫做残差,为了弥补这个损失,我们有去训练一个h1,来拟合这个残差,此时得到一个F=h0+h1,以此类推,由多个若学习器的到一个总的F,这就是梯度提升,也就是说,每次迭代都会训练一个弱学习器,目标就是最小化,或者说拟合残差,最后将多个弱分类器进行相加,得到最终的模型。

梯度提升和梯度下降有什么关系?

梯度提升的目的也是为了梯度下降,但是,梯度下降 是通过,直接求导的方式就可以对参数进行更新求解,而梯度提升是通过累计弱学习器的形式来进行梯度下降。

GBDT的优缺点:

优点:

  1. 预测阶段比较快
  2. 在分布稠密的数据上效果比较好

缺点:

只能串行,因此他的速度肯定是比较慢的

在稀疏的数据上效果很不好,甚至不如SVM或者神经网络

GBDT和随机森林的区别和对比

相同点:

都是由多棵树组成,最终的结果由多棵树共同决定

不同点:

随机森林是并行,而GBDT是串行

随机森林是由投票得到最终的结果,而GBDT是通过多棵弱学习器的加和得到。

为什么前向分步时不直接拟合残差

为了可以扩展到更复杂的损失函数中

这时候你可能就有疑问了,难道不是所有的损失函数都在h=y时最小吗?

那可能你忘了正则项这一回事,如果只是经验风险最小化的话非常容易过拟合,所以一个合理的办法就是在每个基模型中加入正则项,所以在有正则项的情况下就不再是h=y,时损失函数最小了,所以我们需要计算损失函数的梯度,而不能直接使用分模型来拟合残差。

GBDT优缺点

优点:

预测精度高;适合低维数据;能处理非线性数据可以灵活;处理各种类型的数据,包括连续值和离散值;

在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。

使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

缺点:

由于弱学习器之间存在依赖关系,难以并行训练数据,不过可以通过自采样的SGBT来达到部分并行;如果数据维度较高时会加大算法的计算复杂度

sklearn参数

Boosting的第二个模型GBDT,GBDT和Adaboost都是Boosting模型的一种,但是略有不同,主要有以下两点不同:

GBDT使用的基模型是CART决策树,且只能是CART决策树,而Adaboost的默认基模型是CART决策树,可以是其他模型。

GBDT通过计算每次模型的负梯度来进行模型迭代,而Adaboost模型则根据错分率来进行模型迭代。

参数

class sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto')

因基分类器是决策树,所以很多参数都是用来控制决策树生成的,这些参数与前面决策树参数基本一致,对于一致的就不进行赘述。关于决策树参数看这里:Sklearn参数详解--决策树

loss:损失函数度量,有对数似然损失deviance和指数损失函数exponential两种,默认是deviance,即对数似然损失,如果使用指数损失函数,则相当于Adaboost模型。

criterion: 样本集的切分策略,决策树中也有这个参数,但是两个参数值不一样,这里的参数值主要有friedman_mse、mse和mae3个,分别对应friedman最小平方误差、最小平方误差和平均绝对值误差,friedman最小平方误差是最小平方误差的近似。

subsample:采样比例,这里的采样和bagging的采样不是一个概念,这里的采样是指选取多少比例的数据集利用决策树基模型去boosting,默认是1.0,即在全量数据集上利用决策树去boosting。

warm_start:“暖启动”,默认值是False,即关闭状态,如果打开则表示,使用先前调试好的模型,在该模型的基础上继续boosting,如果关闭,则表示在样本集上从新训练一个新的基模型,且在该模型的基础上进行boosting。

属性/对象

feature_importance_:特征重要性。

oob_improvement_:每一次迭代对应的loss提升量。oob_improvement_[0]表示第一次提升对应的loss提升量。

train_score_:表示在样本集上每次迭代以后的对应的损失函数值。

loss_:损失函数。

estimators_:基分类器个数。

方法

apply(X):将训练好的模型应用在数据集X上,并返回数据集X对应的叶指数。

decision_function(X):返回决策函数值(比如svm中的决策距离)

fit(X,Y):在数据集(X,Y)上训练模型。

get_parms():获取模型参数

predict(X):预测数据集X的结果。

predict_log_proba(X):预测数据集X的对数概率。

predict_proba(X):预测数据集X的概率值。

score(X,Y):输出数据集(X,Y)在模型上的准确率。

staged_decision_function(X):返回每个基分类器的决策函数值

staged_predict(X):返回每个基分类器的预测数据集X的结果。

staged_predict_proba(X):返回每个基分类器的预测数据集X的概率结果。n_estimators 弱学习器的最大迭代次数

learning_rate学习率

subsample 上采样,取值为(0,1],但推荐[0.5,0,8],默认为1,即不采用自采样

init 初始的弱学习器。

loss gdbt中提到的损失函数(http://www.cnblogs.com/pinard/p/6140514.html),具体区别看当前博客

alpha

应用场景

gbdt可以用于所有的回归问题(线性和非线性),而logistic regression只能用于线性回归,bgdt也可以用于二分类,多分类问题。
 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号