XGBoost算法推导及参数配置

1.XGB的直观理解

 XGB就是一堆CART树的结果的加和


xgb就是将每棵树的预测值加到一起作为最终的预测值

  • 模型表示


    K为树的个数
    F为所有可能的CART树
    f为一颗具体的CART树​​
  • 目标函数


    问题来了,一棵树的正则化项是怎们表示的?先想想,后面有详解
  • 改进:不再是直接优化整个目标函数,而是分步骤优化目标函数
    首先优化第一棵树,完了之后再优化第二棵树,直至优化完K棵树

2.加法模型

  • 分步骤优化目标函数


    首先优化第一棵树,完了之后再优化第二棵树,直至优化完K棵树
  • 第t步时,添加一个最优的CART树ft(x),在现有的t-1棵树的基础上,时的目标阿寒湖最小的那棵CART树


    obj代表衡量一棵树好坏的目标函数
  • 假如我们使用的损失函数时MSE,那么上述表达式会变成这个样子

  • 对于一般的损失函数,对其作泰勒二街展开

  • 去掉所有的常数项,目标函数变为

3.模型正则化项

  • CART树


    把树拆分成结构函数q(输入x,输出叶子节点的索引)和叶子权重w(输入叶子节点索引,输出叶子节点的分数).
    结构函数q是把输入映射到叶子的索引号上去,而w给点了每个索引号对应的叶子分数​
  • 正则化项


    γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。

4. 最终的目标函数

  • 对上式变形


    Ij代表什么?代表每个叶子节点上的样本集合Ij = {i|q(xi)=ji}
  •  令,Gj,Hj


    Gj为每个叶子节点里面的一阶梯度的和,Hj为每个叶子节点的二阶梯度和
  • 可知,上式为二次项函数,可以求导获得最优的w*和obj*

  • wj*的解释。假设这个叶子节点上的样本只有一个时,wj*变为


    wj*的最佳值为负的梯度诚意一个权重系数,类似于SGD中的学习率。hj越大,这个系数越小,也就是学习率越小。
  • obj也可以叫做结构分数,衡量树的结构好坏

5. 如何寻找出一个最优结构

  • 枚举所有不同树结构的贪心法


    利用这个打分函数来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。 
    常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,计算增益
  • 划分点查找算法
    • 贪心算法

    • 近似算法

6. 应用实例——加入自定义的目标函数和评估函数

#!/usr/bin/python
import numpy as np
import xgboost as xgb
###
# 定制损失函数
print ('开始运行示例,使用自定义的目标函数')
 
dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')
 
param = {'max_depth': 2, 'eta': 1, 'silent': 1}
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2
 
# 用户定义目标函数,给出预测,返回梯度和二阶梯度
def logregobj(preds, dtrain):
    labels = dtrain.get_label()
    preds = 1.0 / (1.0 + np.exp(-preds))
    grad = preds - labels
    hess = preds * (1.0-preds)
    return grad, hess
 
# 用户定义的评估函数,返回一个对指标名称和结果
# 当你做定制的损失函数,默认的预测价值可能使评价指标不正常工作,所以要自定义评估函数
def evalerror(preds, dtrain):
    labels = dtrain.get_label()
    return 'error', float(sum(labels != (preds > 0.0))) / len(labels)
 
# 训练定制的目标
bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)

7. 参数的含义

7.1 通用参数

  • booster
    • gbtree基于树模型的提升算法(default)
    • gblinear基于线性模型的提升算法
  • silent
    是否输出详细信息,默认为0
  • nthread线程数,默认最大

7.2 Tree Booster参数

  • eta (default=0.3):学习率的shrinkage参数
    避免步长过大。把eta设置的小一些,可以使得后面的学习更加仔细
  • min_child_weight:每个叶子节点的h的和至少为多少 -- default=1
    假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
    这个参数的值越小,越容易过拟合​
  • max_depth :每棵树的最大深度 -- default=6
    树越深,越容易过拟合
  • gamma:在树的叶子节点上进一步分割时所需的最小的损失降。
    gamma越大,算法越保守
  • subsample:样本随机采样 -- default=1
    越小的值,时的算法越保守,防止过拟合。过小的话,会导致欠拟合
  • colsample:列采样,对每棵树的生成用的特征进行类采样 -- default==1
    借鉴了RandomForest中的属性采样。(0.5,1)
  • lambda 控制模型复杂度的权重值的L2正则化项参数 -- default = 1
    ,参数越大,模型越简单,越不容易过拟合
  • alpha控制模型复杂度的权重值的L1正则化项参数 -- default = 0
    ,参数越大,模型越简单,越不容易过拟合
  • scale_pos_weight 如果取大于0的话,在类别样本不平衡的情况下,有助于快速收敛
  • tree_method 可选择{'auto','exact','approx'}
    exact贪心算法适用于小数据集
    approx近似算法适用于大数据集​

7.3 学习任务参数

  • objective [ default=reg:linear ]定义最小化损失函数类型
    • 最常用的值有:
      • binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。
      • multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
        在这种情况下,你还需要多设一个参数:num_class(类别数目)。
      • multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
  • seed 随机种子 -- default=0
  • eval_matric对于有效数据的度量方法
    • 回归
      • rmse -- default
      • mae
    • 分类
      • logloss负对数似然函数值
      • error 二分类错误率(阈值为0.5)
      • merror 多分类错误率
      • mlogloss 多分类logloss损失函数
      • auc曲线下面积

8. GBDT与XGBoost的区别

  • 正则化项:定义了树的复杂度
    正则化项中包含了树的叶子节点个数,每个叶子节点的分数的L2的平方和,代替了剪枝
  • 目标函数通过二阶泰勒展开做近似。
    XGB中同时用了一阶导数和二阶导数。
    ​GBDT中只用了一阶导数的信息。
    XGB支持自定义目标函数,只要一阶和二阶可导​

猜你喜欢

转载自blog.csdn.net/Tomxiaodai/article/details/81749559