集成学习方法之 Boosted Tree 原理

之前在点云分类中用了SVM和Random Forest , 发现RF 的效果非常好,比SVM好许多,因此想再试一下其它基于树的集成学习方法,比如Boosted Tree 和 Xgboost,Xgboost 基于前者是基于前者实现的,优点是相对前者可以并行化。这里先看Boosted Tree。

参考文献:

https://xgboost.readthedocs.io/en/latest/tutorials/model.html

https://blog.csdn.net/github_38414650/article/details/76061893

1. Decision Tree Ensembles 集成决策树

集成学习方法之 Boosted Tree 原理_第1张图片

与普通决策树相比,分类回归树(CART)不仅将每个要分类的对象分配到叶子上,还将每个叶子分配了一个分数,这个分数与叶子绑定,提供了比单纯分类更丰富的信息。

 

 

集成学习方法之 Boosted Tree 原理_第2张图片

单个决策树比较弱,可以将多个决策树集成,如上图。

 

2. Tree Boosting

如何训练呢

首先定义目标函数,第一项是loss,第二项是正则项。

训练的时候,不能同时训练所有的树,只能采用累加策略,即一颗一颗树分别训练。

集成学习方法之 Boosted Tree 原理_第3张图片

梯度定义:

正则项定义:

其中w是每个叶子的分数,T是叶子的总个数,gamma和lambda是正则参数。因为在正则项定义中包含了叶子个数,所以这个正则项也描述了模型复杂度!

树的结构分数:

集成学习方法之 Boosted Tree 原理_第4张图片

如果loss计算是用的平均平方误差,则自然是二次型,若用的是logistic loss,则需泰勒展开,取到2阶项。在二次型基础上可以直接求出最值以及取最值时的叶子分数,如上图最下面两个公式。这就是结构分数,它既表述了分类纯度又表述了模型复杂度!因为在正则项的定义中包含了叶子的个数

集成学习方法之 Boosted Tree 原理_第5张图片

 

 

学习树的结构

上式为树分裂时的增益,倘若增益gain小于gamma,则树不应该继续分裂。

 

3. sklearn 代码

官方代码

https://github.com/dmlc/xgboost

以下是参数解释

clf = XGBClassifier(
    silent=0 ,#设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。
    #nthread=4,# cpu 线程数 默认最大
    learning_rate= 0.3, # 如同学习率
    min_child_weight=1, 
    # 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
    #,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
    #这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
    max_depth=6, # 构建树的深度,越大越容易过拟合
    gamma=0,  # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。
    subsample=1, # 随机采样训练样本 训练实例的子采样比
    max_delta_step=0,#最大增量步长,我们允许每个树的权重估计。
    colsample_bytree=1, # 生成树时进行的列采样 
    reg_lambda=1,  # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
    #reg_alpha=0, # L1 正则项参数
    #scale_pos_weight=1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重
    #objective= 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标
    #num_class=10, # 类别数,多分类与 multisoftmax 并用
    n_estimators=100, #树的个数
    seed=1000 #随机种子
    #eval_metric= 'auc'
)

 

你可能感兴趣的:(机器学习/深度学习)