boosting-xgboost算法


最近在看集成学习,看了bagging和RF-《西瓜书》,boosting中的Adaboost、GBDT-《统计学习方法》和这篇的Xgboost。

关于Xgboost下面3个链接写的都很好,尤其第2个:

1.陈天奇论文说明
2.解读的很详细的带推导的博客
3.解读的还不错的博客(个人觉得没有上一个链接清楚)

xgboost参数
xgboost block并行


其他:

正则化

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
boosting-xgboost算法_第1张图片

GBDT与XGBoost区别/应用场景

  • 目标函数通过二阶泰勒展开式做近似。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。注:支持自定义代价函数,只要函数可一阶和二阶求导。
  • 定义了树的复杂度,即xgboost在代价函数里加入了正则项,用于控制模型的复杂度,正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。代替了剪枝。
  • 分裂结点处通过结构打分和分割损失动态生长。结构分数代替了回归树的误差平方和。
  • 分裂结点特征分割点选取使用了近似算法-可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。用于加速和减小内存消耗。
  • 可以处理稀疏、缺失数据(节点分裂算法能自动利用特征的稀疏性),可以学习出它的分裂方向,加快稀疏计算速度。
  • 列抽样(column subsampling)[传统GBDT没有],Shrinkage(缩减),相当于学习速率(xgboost中的eta)[传统GBDT也有]
  • 支持并行化处理。xgboost的并行是在特征粒度上的,在训练之前,预先对特征进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。通过booster [default=gbtree]设置参数:gbtree: tree-based models/gblinear: linear models。

sklearn参数

clf = XGBClassifier(
        #树的个数
        n_estimators=100,
        # 如同学习率
        learning_rate= 0.3, 
        # 构建树的深度,越大越容易过拟合    
        max_depth=6, 
        # 随机采样训练样本 训练实例的子采样比
        subsample=1, 
        # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子
        gamma=0, 
        # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
        reg_lambda=1,  
        
        #最大增量步长,我们允许每个树的权重估计。
        max_delta_step=0,
        # 生成树时进行的列采样 
        colsample_bytree=1, 

        # 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
        # 假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
        #这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
        min_child_weight=1, 

        #随机种子
        seed=1000 
        
        # L1 正则项参数
#        reg_alpha=0,
        
        #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重
        #scale_pos_weight=1,
        
        #多分类的问题 指定学习任务和相应的学习目标
        #objective= 'multi:softmax', 
        
        # 类别数,多分类与 multisoftmax 并用
        #num_class=10,
        
        # 设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。
#        silent=0 ,
        # cpu 线程数 默认最大
#        nthread=4,
    
        #eval_metric= 'auc'
)


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