谈谈模型融合之三 —— GBDT

前言

本来应该是年后就要写的一篇博客,因为考完试后忙了一段时间课设和实验,然后回家后又在摸鱼,就一直没开动。趁着这段时间只能呆在家里来把这些博客补上。在之前的文章中介绍了 Random Forest 和 AdaBoost,这篇文章将介绍介绍在数据挖掘竞赛中,最常用的算法之一 —— GBDT(Gradient Boosting Decision Tree)。

GBDT

原理

GBDT 实际上是 GBM(Gradient Boosting Machine) 中的一种,采用 CART 树作为基学习器,所以称为 GBDT。与 AdaBoost 一样,GBDT 为 Boosting 家族中的一员。其表达式为
\[
f_m(x) = \sum_{m=1}^{M} T(x;\Theta_m)
\]
其中\(T(x;\Theta_m)\)表示决策树;\(\Theta_m\)为决策树参数;M为树的个数。

这里来回顾下 AdaBoost,AdaBoost 通过不断调整样本权重,使得上一次分类错误的样本权重变大,最后训练出 m 个弱分类器,然后对 m 个弱分类器加权结合形成强分类器。

而 GBDT 又是另一思想,当我们假设前一轮迭代得到的学习器为 \(f_{m-1}(x)\) ,损失函数为 \(L(y, f_{m-1}(x))\) ,那么,本轮迭代的目标就是使损失函数 \(L(y, f_{m-1}(x) + h_m(x))\) 的值尽可能的小。

我们先将损失函数假设为最常用的平方损失

令 \(r = y - f_{m-1}(x)\) ,那么第 m 步的目标就是最小化 \(L(y, f_m(x)) = \frac{1}{2}(y-f_m(x))^2=\frac{1}{2}(r-h_m(x))^2\)

到这里,似乎发现了点什么,我们对损失函数求导,发现:
\[
\frac{\partial{L}}{\partial{h_m(x)}}=h_m(x)-r
\]
看出什么来了没?对其取个负号就变成 \(r-h_m(x)\) ,即我们常说的残差 ,所以,当为平方损失函数时,弱学习器拟合的目标为之前拟合结果的残差。那到这里代码就很好写了,但是,我们实际中有很多其它的损失函数,而且在很多问题中,这些损失函数比平方损失要好得多。那这时候,如果我们还采用同样的思路,那就没办法像上面那样直接展开并拟合残差了,这时候该怎么办?

这里别忘了,我们最终的目标是使得 \(L(y, f_m(x))\) 最小,那么只需要保证 \(L(y, f_{m-1}(x)+h_m(x))\) 的值比 \(L(y, f_{m-1}(x))\) 小就好了。


\[
max[L(y,f_{m-1}(x))-L(y,f_{m-1}(x)+h(x))]
\]
检验大一高数学的怎么样的时候到了 orz

我们前面说了第 m 轮迭代的损失函数为 \(L(y, f_{m-1}(x) + h_m(x))\) ,换一种形式,写成 \(L(f_{m-1}(x) + h_m(x))\) ,对其进行一阶泰勒展开,得
\[
L(f_{m-1}(x)+h_m(x)) \approx L(f_{m-1}(x)) + L'(f_{m-1}(x))h_m(x)
\]
所以,我们只需使得满足
\[
\max L'(f_{m-1}(x))h_m(x) \L'(f_{m-1}(x))h_m(x)<0
\]
那我们的 \(h_m(x)\) 到底要拟合什么呢?别忘了,我们是要求梯度的,在这里我们已知的是 \(L'(f_{m-1}(x))\) ,我们肯定是根据上一次的拟合的结果来拟合这一次的结果,所以,要使得结果最大,自然就是梯度方向。那么 \(h_m(x)=-L'(f_{m-1}(x))\) , 这样原先的 \(r\) 也就变成了梯度。这里如果把损失函数看作是平方损失,我们得到的结果也恰好就是我们所说的残差!!

此时也总算明白了之前面腾讯的时候我说 GBDT 是拟合残差的时候面试官让我再回去重新康康这个算法的原因了。

算法步骤

输入: 训练数据集 \(T = {(x_1, y_1),(x_2, y_2), ..., (x_N, y_N)}, x_i \in X \subset R^n, y_i \in Y \subset R\); 损失函数 L(y,f(x)),树的个数M.

输出: 梯度提升树\(F_M(x)\)

(1) 初始化 \(f_0(x) = argmin_c \Sigma_{i=1}^N L(y_i,c)\).

(2) 对 \(m=1,2,...,M\)

? (a) 对\(i =1,2,...,N\),计算, \(r_{mi} = - [\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x) = F_{m-1}(x)}\).

? (b) 拟合残差\(r_{mi}\)学习一个回归树,得到\(f_m(x)\).

? (c) 更新\(F_m(x) = F_{m-1}(x) + f_m(x)\).

(3) 得到回归问题提升树 \(F_M(x) = \Sigma_{i=0}^M f_i(x)\)

代码

这里代码是采用了平方损失的方法来写的,且解决的是分类问题

def sigmoid(x):
    """
    计算sigmoid函数值
    """
    return 1 / (1 + np.exp(-x))

def gbdt_classifier(X, y, M, max_depth=None):
    """
    用于分类的GBDT函数
    参数:
        X: 训练样本
        y: 样本标签,y = {0, +1}
        M: 使用M个回归树
        max_depth: 基学习器CART决策树的最大深度
    返回:
        F: 生成的模型
    """
    # 用0初始化y_reg
    y_reg = np.zeros(len(y))
    f = []

    for m in range(M):
        # 计算r
        r = y - sigmoid(y_reg)

        # 拟合r
        # 使用DecisionTreeRegressor,设置树深度为5,random_state=0
        f_m = DecisionTreeRegressor(max_depth=5, random_state=0)
        # 开始训练
        f_m.fit(X, r)
        # 更新f
        f.append(f_m)

        y_reg += f_m.predict(X)

    def F(X):
        num_X, _ = X.shape
        reg = np.zeros((num_X))

        for t in f:
            reg += t.predict(X)

        y_pred_gbdt = sigmoid(reg)

        # 以0.5为阈值,得到最终分类结果0或1
        one_position = y_pred_gbdt >= 0.5
        y_pred_gbdt[one_position] = 1
        y_pred_gbdt[~one_position] = 0

        return y_pred_gbdt

    return F

小节

到这里 GBDT 也就讲完了,从决策树 ID3 开始一直到 GBDT,后面终于要迎来最开始想要梳理的数据挖掘的两大杀器 XGBoost 和 LightGBM 了,下一篇将介绍 XGBoost。

原文地址:https://www.cnblogs.com/csu-lmw/p/12254174.html

时间: 2024-11-06 07:41:45

谈谈模型融合之三 —— GBDT的相关文章

谈谈模型融合之二 —— 随机森林

前言 上篇文章介绍了集成学习的相关概念以及基于 Boosting的 AdaBoost,这篇文章将介绍基于模型融合的另一种方式 Bagging 的算法,随机森林(Random Forest).(上篇公式敲的太累了这篇就来个简单的缓解缓解) 随机森林 算法思想 我们先来看看这个算法的名字,可以拆分开为两部分,随机和森林.森林我们很容易可以想到,就是有很多棵树,即由多颗决策树组成.那么随机指的是什么呢?这里我们来看看 Bagging 的思想了. 首先先说说自助采样(Bootstrap Sanpling

谈谈模型融合之一 —— 集成学习与 AdaBoost

前言 前面的文章中介绍了决策树以及其它一些算法,但是,会发现,有时候使用使用这些算法并不能达到特别好的效果.于是乎就有了集成学习(Ensemble Learning),通过构建多个学习器一起结合来完成具体的学习任务.这篇文章将介绍集成学习,以及其中的一种算法 AdaBoost. 集成学习 首先先来介绍下什么是集成学习: 构建多个学习器一起结合来完成具体的学习任务,常可获得比单一学习器显著优越的泛化性能,对"弱学习器" 尤为明显(三个臭皮匠,顶个诸葛亮) 也称为Multi-Classif

多模型融合推荐算法

常见的多模型融合算法 多模型融合算法可以比单一模型算法有极为明显的效果提升.但是怎样进行有效的融合,充分发挥各个算法的长处?这里总结一些常见的融合方法: 1. 线性加权融合法 线性加权是最简单易用的融合算法,工程实现非常方便,只需要汇总单一模型的结果,然后按不同算法赋予不同的权重,将多个推荐算法的结果进行加权,即可得到结果: 是给用户(user)推荐商品(item)的得分, 是算法K的权重,是算法k得到的用户(user)对商品item的推荐得分.这种融合方式实现简单,但效果较差.因为线性加权的参

十大经典预测算法六---集成学习(模型融合算法)

模型融合算法概念 它不是具体的指某一个算法,而是一种把多个弱模型融合合并在一起变成一个强模型的思想 用模型融合算法的原因 1.单个模型容易过拟合,多个模型融合可以提高范化能力 2.单个模型预测能力不高,多个模型往往能提高预测能力 3.对于数据集过大或过小,可以分别进行划分和有放回的操作,产生不同的数据子集,然后通过数据子集训练不同的分类模型,最终合并成一个大的分类器 4.对于多个异构的特征集的时候,很难进行融合,可以考虑每个数据集构建一个分类模型,然后将多个模型融合 5.模型融合算法成功的关键在

模型融合

一.Voting 模型融合其实也没有想象的那么高大上,从最简单的Voting说起,这也可以说是一种模型融合.假设对于一个二分类问题,有3个基础模型,那么就采取投票制的方法,投票多者确定为最终的分类. 二.Averaging 对于回归问题,一个简单直接的思路是取平均.稍稍改进的方法是进行加权平均.权值可以用排序的方法确定,举个例子,比如A.B.C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6.2/6.1/6这两种方法看似简单,其实后面的高级算法也可

task5 模型融合 打卡

5.1 模型融合目标 对于多种调参完成的模型进行模型融合. 完成对于多种模型的融合,提交融合结果并打卡. 5.2 内容介绍 模型融合是比赛后期一个重要的环节,大体来说有如下的类型方式. 简单加权融合: 回归(分类概率):算术平均融合(Arithmetic mean),几何平均融合(Geometric mean): 分类:投票(Voting) 综合:排序融合(Rank averaging),log融合 stacking/blending: 构建多层模型,并利用预测结果再拟合预测. boosting

CS231n 卷积神经网络与计算机视觉 7 神经网络训练技巧汇总 梯度检验 参数更新 超参数优化 模型融合 等

前面几章已经介绍了神经网络的结构.数据初始化.激活函数.损失函数等问题,现在我们该讨论如何让神经网络模型进行学习了. 1 梯度检验 权重的更新梯度是否正确决定着函数是否想着正确的方向迭代,在UFLDL中我们提到过,计算时梯度公式如果计算错误是不容被察觉的,我们需要比较分析法得到梯度与数值法得到的梯度是否相似,下面是一些技巧: 1.1 centered formula 高等数学中我们知道导数的近似公式: df(x)dx=f(x+h)?f(x)h 以及下面的centered formula: df(

Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)

http://www.cnblogs.com/fiercex/p/7927804.html fiercex 路漫漫其修远兮,吾将上下而求索 Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合) 这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集.注意,mxnet版本要高于0.12.1b2017112.下载数据集. train.zip test.zip labels然后解压在data文件夹下 1. 数据 1.1 整理数据 将解压后的数据整理成Gluon能够读取

基于BERT的多模型融合借鉴

本次介绍假新闻赛道一第一名的构建思路,大家一起学习下 任务描述 文本是新闻信息的主要载体,对新闻文本的研究有助于虚假新闻的有效识别.虚假新闻文本检测,具体任务为:给定一个新闻事件的文本,判定该事件属于真实新闻还是虚假新闻.该任务可抽象为NLP领域的文本分类任务,根据新闻文本内容,判定该新闻是真新闻还是假新闻.针对该任务,本文采用BERT-Finetune.BERT-CNN-Pooling.BERT-RCN-Pooling的多种结构进行融合,在输入上引入字词结合的形式,另外充分利用假新闻的关键词特