GBDT模型总结(GB,DT,调参)

Python017

GBDT模型总结(GB,DT,调参),第1张

一.集成学习方法 :参考:https://www.jianshu.com/p/6c0a286020cb

二.GB的理解 (就是用梯度下降的方法来解Boosting,所以叫GB,目标是求出boost的函数组合的最优解)

1.首先理解梯度下降

a.求解目标函数J(theta)的最优解,本质上是一轮一轮的求解w

b.这句话是对比理解的关键:

2.对比理解多轮迭代后的函数最优解

根据上述的梯度下降法的思路,对于模型的损失函数L(y,F(X)),为了能够求解出最优的函数F∗(X),首先,设置初始值为:

               F0(X)=f0(X)

以函数F(X)作为一个整体,对于每一个样本X(i),都存在对应的函数值F(X(i))。与梯度下降法的更新过程一致,假设经过M代,得到最优的函数F∗(X)为

以函数F(X)作为一个整体,对于每一个样本X(i),都存在对应的函数值F(X(i))。与梯度下降法的更新过程一致,假设经过M代,得到最优的函数F∗(X)为:

这里要和梯度下降对比下,这里是反向思考:因为梯度下降是通过梯度下降的方法求出w参数值,最后就是经过了M轮迭代求出最优解w*.  这里的w是参数,同样的思想对比到函数F(x)上,将F(x)视为整体类似于w,最后通过多轮迭代求出F*(x)最优解

3.理解GB

由上图所示的Boosting方法中,最终的预测结果为b个学习器结果的合并:

由于上述是一个求解梯度的过程,因此也称为基于梯度的Boost方法,其具体过程如下所示

Loss函数选择,一般有对数和指数损失函数

也可参看https://pan.baidu.com/s/1slP4J1r,通过上面的算法,就能够求出boost的函数组合的最优解

三.理解DT

决策树,树生成算法(ID3,C4.5,CART)

CART(回归树:[启发式方法(即随机选择第j个变量和它的取值进行划分),遍历特征和各个特征的取值](最小二乘法,计算平方误差最小化来选择最终位置),分类树:[Gini系数])。

四.使用模型( 总体分为Boost &CART分类树相关参数的调节 )

sklearn地址:http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#

中文辅助:http://blog.sina.com.cn/s/blog_62970c250102xg5j.html

loss:loss function to be optimized. ‘deviance’ refers to deviance (= logistic regression) for classification with probabilistic outputs. For loss ‘exponential’ gradient boosting recovers the AdaBoost algorithm.(损失函数的选择:GradientBoostingClassifier类的损失函数有对数似然损失函数"deviance"和指数损失函数"exponential"两个选项。默认值是对数似然损失函数"deviance")

learning_rate:learning rate shrinks the contribution of each tree by learning_rate. There is a trade-off between learning_rate and n_estimators.(我理解是各个基础模型,在梯度下降训练时的步长)

n_estimators:The number of boosting stages to perform. Gradient boosting is fairly robust to over-fitting so a large number usually results in better performance.(基础模型的数量,过多容易过拟合,在实际的调参过程中,常常将它和参数learning_rate一起来考虑)

max_depth:maximum depth of the individual regression estimators. The maximum depth limits the number of nodes in the tree. Tune this parameter for best performancethe best value depends on the interaction of the input variables(CART分类树的树深度,默认为3,如果样本量少不用设置,如果样本量大建议调整)

min_samples_split:The minimum number of samples required to split an internal node(树中各节点最小数量,如果大于这个值就需要继续划分子树)

min_samples_leaf:The minimum number of samples required to be at a leaf node(叶子节点最小数量,如果大于这个数就会和兄弟节点一起被剪支)

subsample:基础模型在训练的时候使用的样本数量,默认为1,全样本。如果样本量比较大,可以考虑部分样本

max_features:基础模型训练时候使用的feature数量

verbose:这个参数可以看每轮训练的结果

使用Kaggle上的Titanic项目(可以参考:https://www.jianshu.com/writer#/notebooks/28365911/notes/32040639),通过调参,最终输出模型的得分是9.652

GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树。GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算法上一篇文章已经介绍);区别如下:AdaBoost 算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT 也是迭代,但是 GBDT 要求弱学习器必须是 CART 模型,而且 GBDT 在模型训练的时候,是要求模型预测的样本损失尽可能的小。

GBDT 直观理解:每一轮预测和实际值有残差,下一轮根据残差再进行预测,最后将所有预测相加,就是结果。

GBDT 模型可以表示为决策树的加法模型:

其中,T(x;θm)表示决策树;θm 为决策树的参数; M为树的个数。

采用前向分布算法, 首先确定初始提升树 fo(x) = 0, 第 m 步的模型是:

通过经验风险极小化确定下一棵树的参数:(其实就是让残差尽可能的小找到最优划分点)

这里的 L() 是损失函数,回归算法选择的损失函数一般是均方差(最小二乘)或者绝对值误差而在分类算法中一般的损失函数选择对数函数来表示

GBDT 既可以做回归也可以做分类,下面先描述一下做回归的算法流程:

已知一个训练数据集 T = {(x1,y1),(x2,y2),...,(xn,yn)}, 如果将训练集分为不同的区域 R1,R2,...,Rn,然后可以确定每个区域输出的常识 c,c 的计算是将每个区域的 y 值相加再除以 y 的个数,其实就是求一个平均值。树可以表示为:

然后通过下图方式来确定具体分割点:

我将李航的统计学方法里面的例子粘出来,就知道提升树是如何计算的了:

以上就是 GBDT 选择分割点的过程, 如果特征有多个的话也是一样的道理,选择特征和特征值使得误差最小的点,作为分割点。所以其实 GBDT 也可以用作特征选择,通过GBDT 可以将重要的特征选择出来,当特征非常多的时候可以用来做降维。然后再融合类似逻辑回归这样的模型再进行训练。

欢迎大家关注,vx公众号同名

如下图:

在建立GBDT对象并作fit之后,可以使用如下代码获得要的规则代码:

dot_data = tree。export_graphviz(model_tree, out_file=None,

max_depth=5, feature_names=names_list, filled=True, rounded=True) # 将决策树规则生成dot对象。

模型最终可以描述为:

Fm(x)=∑m=1MT(xθm)Fm(x)=∑m=1MT(xθm)

模型一共训练M轮,每轮产生一个弱分类器T(xθm)T(xθm)。弱分类器的损失函数

θ^m=argminθm∑i=1NL(yi,Fm−1(xi)+T(xiθm))θ^m=arg⁡minθm⁡∑i=1NL(yi,Fm−1(xi)+T(xiθm))

Fm−1(x)Fm−1(x)为当前的模型,gbdt通过经验风险极小化来确定下一个弱分类器的参数。具体到损失函数本身的选择也就是L的选择,有平方损失函数,0-1损失函数,对数损失函数等等。如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差。