之前在点云分类中用了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 集成决策树
与普通决策树相比,分类回归树(CART)不仅将每个要分类的对象分配到叶子上,还将每个叶子分配了一个分数,这个分数与叶子绑定,提供了比单纯分类更丰富的信息。
单个决策树比较弱,可以将多个决策树集成,如上图。
2. Tree Boosting
如何训练呢
首先定义目标函数,第一项是loss,第二项是正则项。
训练的时候,不能同时训练所有的树,只能采用累加策略,即一颗一颗树分别训练。
梯度定义:
正则项定义:
其中w是每个叶子的分数,T是叶子的总个数,gamma和lambda是正则参数。因为在正则项定义中包含了叶子个数,所以这个正则项也描述了模型复杂度!
树的结构分数:
如果loss计算是用的平均平方误差,则自然是二次型,若用的是logistic loss,则需泰勒展开,取到2阶项。在二次型基础上可以直接求出最值以及取最值时的叶子分数,如上图最下面两个公式。这就是结构分数,它既表述了分类纯度又表述了模型复杂度!因为在正则项的定义中包含了叶子的个数
学习树的结构
上式为树分裂时的增益,倘若增益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'
)