GBDT如何做分类任务

Q

GBDT是一种基于前向策略的加法模型, 每阶段使用一个基模型去拟合上一阶段基模型的残差. 残差是连续值, 因此用到的是回归树. 为什么当GBDT用作分类任务时可以选择deviance lossexponential loss, 而这两个损失函数的$y^{(i)}$取值都为0-1标量, 如何计算残差?

A

在梯度提升做二分类任务时, $y^{(i)}$不再是标量, 而是概率(为正的概率); 另一方面, deviance loss(二分类就是交叉熵损失)和exponential loss都是评价预测(概率)与真实(概率)之间的差距, 也就是残差, 是一个连续值, 从而是一个回归问题.

GBDT如何做分类任务?

若选择deviance loss为分类任务的损失函数:

求损失函数对当前模型的负梯度:

作为残差的近似(就是梯度下降求解Logistics回归参数的式子, 就是残差, 惊人的联系)

其中概率$p_k(x)$的计算:

  • 概率来自$f_k(x)$, 也就是叶节点的输出(输出为对数几率, 后转换为概率), 其中$f_k(x) \geq 0$, $\sum_{k=1}^{K} p_k(x) = 1$

也就是说, GBDT做分类任务时, 提升的是关于概率的近似残差

决策树的两个参数

  • 损失函数的负梯度仅仅是用来作为目标(残差的近似)

  • 使用最小二乘法计算树结构(决策树参数一)

  • 使用目标(残差的近似)计算叶子节点权值(决策树参数二)

    (这里可以和XGBoost进行比较, XGBoost使用最小化损失函数计算树结构, 使用二阶梯度作为残差的近似)

再看梯度提升算法

注意:

  1. 在训练过程中并不是求的与上一棵树结果的残差, 而是求的与前面所有树和的残差! 在预测过程中, 可分别计算每棵树, 求和即为最后的结果
  2. 在做分类任务时, 当树构建完成后
    1. 计算每个叶节点的权值(这里的权值是对数几率)
    2. 把对数几率转换为概率值(二分类就是logistics函数, 多分类用上面的概率公式)
    3. 得到提升的概率值
  3. 对与(c)计算叶权重时, 使用均方误差就是均值, 其他函数需要带入计算最优权值

GBDT与XGBoost在算法上的比较

XGBoost的每一阶段的损失函数(经验损失 + 结构损失):

其中, $w$是叶节点权值, 也是模型需要提升的值, 相当于GBDT中损失函数的负梯度:

  • 叶节点权值是如何得来的? 使用牛顿法计算的增量$\Delta \theta = -\frac{G}{H}$作为梯度值的近似
    • 这里用到了二阶导信息, 更加接近于真实值, 所以收敛速度更快
    • 分母加上了对结构损失的惩罚(如果结构复杂, 就少下降一点, 降低影响)

每个叶子是相互独立的, 因此可以直接带入到损失函数中:

GBDT的损失函数仅用在了计算目标值(进而计算叶节点的值), 而XGBoost不仅仅是计算叶节点的值, 进一步把损失函数用在了计算树结构:

  • 选择划分后损失降低最多的特征作为分裂特征
  • 为什么GBDT不这么做呢? 可能是直接使用的CART的原因吧!
  • 为什么XGBoost要这么做呢? $G, H$都求出来了, 又不和叶子节点相关, 很完美呀!(XGBoost完全基于$G, H$求解)
    1. 求每个样本的近似残差(一阶梯度 vs 二阶梯度)
    2. 计算树结构(最小二乘法 vs 损失函数)
    3. 计算叶子权值(落在叶子节点上的样本取平均)

GBDT与XGBoost算法上区别的总结

  1. GBDT使用一阶梯度作为残差的近似, XGBoost使用二阶梯度作为残差的近似

    • 更加接近真实值, 收敛更快
  2. GBDT的损失函数没有考虑到树的复杂度, 而XGBoost添加了正则项对复杂度进行了惩罚

  3. GBDT是用的最小二乘法计算树结构(CART), 而XGBoost使用的是损失函数来计算树的结构

    (注: 这里的区别仅仅是算法上的, XGBoost在并行上, 过拟合上, 适用范围上还有改进)

另外, XGBoost的剪枝是基于最小增益Gamma的. 需要注意的是, 预剪枝的效果没有后剪枝好(容易出现下潜不足), 因此XGBoost选择了同一层所有节点都做分裂, 后剪枝的方法.

XGBoost: Introduction to Boosted Trees

GBDT vs 离散特征(Categorical Features)

  1. GBDT在处理离散特征时, 会默认特征是有序的
    • 如果排序后的特征对应的标记为为[0, 1, ..., 0, 1]交叉型, 则不能很好的分类
    • 如果使用one-hot, 对于高基数离散特征, 会生成不平衡的树, 且每次划分带来的增益较少
      • 解决办法: 计算每个特征取值的熵, 通过熵的大小对特征进行有序重编码
  2. LightGBM vs 离散特征
    1. 根据标签的关联性对特征进行重排序, 特别的, 使用加速值(sum_gradient / sum_hessian)度量标签与特征取值的关联性
    2. catboost同样是把离散值转化为连续值来处理类别特征

LightGBM: Optimal Split for Categorical Features

LightGBM: Categorical feature support

GBDT vs LR vs DNN

GBDT损失函数的负梯度作为残差的近似 与 LR求损失函数的负梯度去更新参数是一个性质吗?

对于logloss:
$$
J(\theta) = - \sum_{i=1}^{m} y_i log(h_{\theta}(x)) + (1 - y_i)log(1 - h_{\theta}(x))
$$

不同在于GBDT的变量为模型$h_{\theta}(x)$

  • 对$h_{\theta}(x)$求偏导, 来作为残差的近似. ($h_{\theta}(x)$虽然为一个函数, 但在这里视为为变量)

而LR的变量进一步为每个参数$\theta_j$

  • 对$\theta_j$求偏导. (因此$\theta_j$需要归一化, 这个过程是通过对特征的归一化实现的)

总结

GBDT 和 梯度下降的LR 都可以认作是在拟合残差(一步一步向目标值的迭代迈进), 不同在于一个是对模型求导, 作为的残差的近似(其实也是提升模型的一个方向). 一个是对参数求导, 作为提升模型的方向. 同样, DNN也可以这么想, 每一次更新参数为了更接近目标.

一个把梯度作为拟合的目标, 一个使用梯度下降来更新参数

logloss vs cross entropy

logloss 用来评价预测结果为概率的分类器的性能

cross entropy 是损失函数, 衡量的是样本的不确定性

其实就是一样的(ps: wikipedia会把logloss指向cross entropy)

Quora: What is an intuitive explanation for the log loss function?

Wikipedia: cross entropy

附录1: GBDT分类任务源码解析

sklearn GBDT 文档

在每个阶段, 使用回归树去拟合交叉熵损失的负梯度

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

另外的一个文档

  1. 使用的是负的对数似然函数作为损失
  2. 使用对数几率初始化模型(叶节点的值为对数几率)
  • 需要注意的一点, 使用deviance输出的是概率, 所以有可能评价的是概率上的损失

http://scikit-learn.org/stable/modules/ensemble.html#classification

查看源代码

  1. 确实是拟合的交叉熵损失的负梯度
  2. 基模型使用的回归树!

其中的残差的计算

numpy.ravel(): 把多维数组转换为一维数组(两个类别连接起来)

scipy.expit(): logistic function, expit(x) = 1/(1+exp(-x)), logistic 变换, 把对数几率转为概率

负梯度的值(残差的近似)就是残差(使用梯度下降求解的Logistic回归相同)

https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/gradient_boosting.py#L1225

附录2: 树模型与其他模型的比较

  • 树模型是不能提取特征的线性组合信息的
  • SVM的好处就是就是泛化能力强和能处理特征间的线性组合问题

其他参考:

The Elements of Statistical Learning

Scikit Binomial Deviance Loss Function

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容