Xgboost原理分析

Xgboost

从陈天奇的PPT中进行总结,重点了解模型的构建,策略的选择和优化算法的选取。

基础

机器学习的目标函数基本都是:
Objective = L(\theta) + \Omega(\theta)
也就是 损失函数和正则化项的组合。

在目标函数,偏差和方差之间 做trade-off

  • 损失函数

    为了得到更好的预测模型,在训练数据集上拟合更好的效果。至少能够让我们的模型逼近训练数据的可能的分布情况。(数据的情况决定了我们模型的上界,我们尽可能的去逼近那个界)

  • 正则化

    为了得到更简单的模型,我们引入正则化。简单的模型可以让我们在预测未来的数据时候,有更小的方差,预测结果更加稳定。

回归树

也称分类回归树

  • 决策规则与决策树相同

  • 在每个叶子结点上都有一个分数(score)

上图可以看出来,每个叶子结点都有一个分数,那么被分到该结点的数据获得这个分数。

我们通过将多个这样的回归树集成起来,获得我们的集成算法。

上图可以看出来,对于小男孩的总体分数,就是两棵树的加和结果。

集成树的特点有:

  • 应用非常广泛,比如GBDT 、RM。近一半的数据挖掘比赛都是使用了各种集成树算法的变体获胜的。

  • invariant to scaling of inputs.不是必须的进行特征归一化

  • 能从特征中,学习到较高阶的关系

  • 可伸缩,可很好的用在工业中(can be scalable)

模型的提出

模型假设我们有K棵树(上面提到的回归树):
\hat{y}_i = \sum_{k=1}^{K}f_k(x_i),f_k\in F
F就是我们的假设空间(函数空间,包含k个回归树)

\color{#fbbc05}{其实我们可以将回归树看作是一个函数,输入特征之后会输出一些score评分}

这个模型中的参数包括:

  • 每课树的结构,叶子结点中的score

  • 或者使用每棵树作为参数:

    \theta = \{f_1,f_2,\cdots,f_K\}

  • 与从R^d中学习参数相反,我们去学习每个函数,即每棵树。

单变量分析

定义目标函数,然后去优化这个目标函数

上图中,是以时间为变量,来构建回归树,评价个人随着时间t是否喜欢浪漫音乐。

将一个回归树等价到一个分段函数中,那么我们从中需要学习的“参数”也就是我们的:

\color{#fbbc05}{划分位置 以及 每一段函数的值(高度)}

上面四幅图中,给出了不同划分位置和划分高度,最后的参数模型也就是图四的效果。

那么从一棵树开始,我们可以来定义我们模型的目标函数。

模型的目标函数

我们有K棵树
\hat{y}_i = \sum_{k=1}^{K}f_k(x_i),f_k\in F
目标函数是:
Obj= \sum_{i=1}^{n}l(y_i,\hat{y}_i)+\sum_{k=1}^{K}\Omega(f_k)
第一项是我们的损失函数项,第二项是我们的正则化项。

启发式的算法

当我们讨论决策树的时候,都是启发式的从一些方面进行考虑:

  • 通过信息增益来划分分支
  • 剪裁树
  • 树的最大深度
  • 平滑叶子结点的值

我们使用决策树算法时候,就是通过信息增益来划分分支,那么这里我们可以用每一次划分的信息增益当做我们的损失函数。(划分后的信息增益-划分前的信息增益)

决策树中的剪枝,就是为了控制决策树的模型复杂度,这里我们也通过控制叶子节点的个数,来实现正则化,控制模型的复杂度。

限制树的深度,也是一定程度上限制我们的模型复杂度。

尽可能的让我们的叶子上的score平滑,使用L2正则化来控制叶子结点上的权重。

模型的学习

目标函数是:
Obj= \sum_{i=1}^{n}l(y_i,\hat{y}_i)+\sum_{k=1}^{K}\Omega(f_k),f_k\in F
那我们是如何学习这个目标函数的呢?

我们不能使用梯度下降算法来进行计算损失函数,因为我们这里的参数是回归树,而不是一些数值型数据(类比线性模型里面的参数 w)

\color{#fbbc05}{解决办法:Additive Training}

从常数开始,然后每次加入一棵新树(一个新的函数)
\hat{y}_i^{(0)} = 0 \\ \hat{y}_i^{(1)} = 0 + f_1(x_i) = \hat{y}_i^{(0)}+f_1(x_i) \\ \hat{y}_i^{(1)} = f_1(x_i) +f_2(x_i) = \hat{y}_i^{(1)}+f_2(x_i) \\ \cdots \\ \hat{y}_i^{(t)} = \sum_{k=1}^{t}f_k(x_i) = \hat{y}_i^{(t-1)}+f_t(x_i) \\
其中,我们的\hat{y}_i^{(t)}是第t轮的训练模型,\hat{y}_i^{(t-1)}是t轮前我们的训练结果,f_t(x_i) 是新加入的函数(新加入的一棵树)

那么我们怎么样决定一个新加入的树(函数f_t(x_i)),这个函数就是我们上面提到的我们的参数,即如何选择一个参数来优化我们的模型,当然从优化目标函数中找。

\color{#fbbc05}{目标:选择一个f_t来最小化我们的目标函数}


其中
y_i
是我们训练数据的标签,
x_i
是我们输入的第i个数据。

应用泰勒展开到损失函数中

上述目标函数还是很复杂,于是作者引入了泰勒展开式来替换损失函数。

1551440681216.png

类比泰勒展开式的f(x+\Delta x)

在我们的目标函数中损失函数l()相当于函数f()

所以我们可以得到我们的目标函数带入泰勒展开之后的结果是:

这里面l(y_i,\hat{y_i}^{t-1})是我们前t-1轮的对y_i预测和y_i的目标的损失,这是一个常数项。因为我们优化的是第t轮,研究怎么选择第t轮需要加进去的树,所以前面的 我们都可以看作是一个常量。

给目标函数对权重求偏导,得到一个能够使目标函数最小的权重,把这个权重代回到目标函数中,这个回代结果就是求解后的最小目标函数值

\color{#fbbc05}{那g_i和h_i到底是什么呢?}

gi是一个叶子结点上的 每一个样本的梯度值,同理理解h_i

从我们的损失函数l(),说起,看我们如何定义这个l(),不如这里我们以简单的\color{#fbbc05}{平方差函数}为例子:
\begin{align} l(y_i,\hat{y_i}^{(t)}) & =l(y_i,\hat{y_i}^{(t-1)}+f_t(x_i))\\ & =(y_i-(\hat{y_i}^{(t-1)}+f_t(x_i)))^2 \\ & =((\hat{y_i}^{(t-1)}+f_t(x_i))-y_i)^2 \\ & = ((\hat{y_i}^{(t-1)}-y_i)+f_t(x_i))^2 \\ l((\hat{y_i}^{(t-1)}-y_i)+f_t(x_i)) & =((\hat{y_i}^{(t-1)}-y_i)+f_t(x_i))^2 \\ \end{align} \\ l((\hat{y_i}^{(t-1)}-y_i)+f_t(x_i)) 相当于f(x+\Delta x),f_t(x_i)也就是\Delta x\\ 由上面推导带入泰勒公式可以得到:\\ Obj^{(t)} = \sum_{i=1}^{n}[2(\hat{y_i}^{(t-1)}-y_i)f_t(x_i)+{f_t(x_i)}^2]+\Omega(f_t)+const \\ 对比上下两式 \\ Obj^{(t)} = \sum_{i=1}^{n}[g_if_t(x_i)+\frac{1}{2}h_i{f_t(x_i)}^2]+\Omega(f_t)+const
针对我们的平方差损失函数来说,g_i和h_i就是如下式子:
g_i = 2(\hat{y_i}^{(t-1)}-y_i)\\ h_i = 2
其中(\hat{y_i}^{(t-1)}-y_i)项也就是我们常说的残差项。

改善模型

从例子中理解各个参数的含义,

f_t(x)是我们的一棵树,包含叶子结点的score,对应到参数\omega

比如叶子结点1代表的权重(分数)是+2,叶子结点2对应的是+0.1,叶子结点3对应是-1

q(x)就是数据x所对应的叶子结点,从旁边的图例p(小男孩)=1,也就是将小男孩分到叶子结点1中

然后看我们的正则化项,其中T代表叶子结点的数目,\omega_j是叶子结点的权重(得分)从上面的例子可以很容易的计算得到我们的正则化结果。

再来看我们的目标函数

我们定义:I_j=\{i|q(x_i)=j\}就是第i个数据属于第j个叶子结点。

然后我们将属于同一个叶子结点的数据放入一个group里面得到

也就是将从各个样本上的遍历,映射到了对叶子结点的遍历(叶子结点里可能包含多个样本)

重新定义G 和H ,也将其从单个样本上的遍历,映射到对叶子结点的遍历。
\begin{align} 我们将:& \\ & G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2 \\ 看作是关于w的二次函数,那么最优解是:\\ & w_j^*= -\frac{G_i}{H_i+\lambda}\\ & Obj = -\frac{1}{2}\sum_{j=1}^{T}\frac{G_j^2}{H_j+\lambda}+\gamma T \end{align}
其中的\frac{G_j^2}{H_j+\lambda}是来评价一棵树的结构是否很好,分数越小,结构越好。

但是仍然有无数颗树可以进行选择,那么我们如何选择才能保证最优化呢?

\color{#fbbc05}{贪心策略}

从常数0开始,我们选择一个树加入,每一次尝试去对已有的叶子加入一个分割。

然后我们来计算分割后的结构分数(左子树+右子树)与我们不进行分割的结构分数进行做差,同时还要减去因为分割引入的结构复杂度。


  • 对于每个节点,我们都遍历所有特征

    • 对于每个特征,都按特征值将每一个数据排序
    • 从左到右的线性扫描决定该特征最好的分割位置
    • 将最好的分割方案适用到所有特征中。
  • 时间复杂度分析(生成一棵深度为K的树)

    • O(dkn*logn):对于每一层都需要对feature排序消耗nlogn

      那么每层都有d个特征需要进行分析,我们一共需要做K层。

    • 可被优化的(使用近似方法??? 或者 缓存根据特征的排序结果(因为生成一棵树都需要进行排序))

    • can scale very large dataset

Categorical Variables

也可以很好的处理非数值型特征,并且不需要将类别特征(离散的)和数值型特征(连续的)分开进行处理。

我们可以通过one-hot编码将离散的特征类别映射到数值型。

如果类别特别多,向量会非常稀疏,但是这个算法也很擅长处理稀疏的数据。

剪枝和正则化

trade-off between simplicity and predictivness

早停止

  • 如果最好的分裂已经出现负的Gain 停止分裂。
  • 同时也牺牲了未来可能出现更好的分裂的情况

后剪枝

设置最大树深度,然后递归的去剪裁 所有叶子节点出现负的Gain的分裂情况

总结

更细节的问题是,我们不会每个树做到最优化,这样容易过拟合,我们赋予一个参数,来控制每次的优化(不让优化效果太好),这样留下更多的优化空间给后边的树。

分类回归树的集成算法可以用来做回归,分类,ranking等等,这取决于我们的损失函数如何定义。

Xgboost比较重要的参数

(1)objective [ default=reg:linear ] 定义学习任务及相应的学习目标,可选的目标函数如下:

  • “reg:linear” –线性回归。

  • “reg:logistic” –逻辑回归。

  • “binary:logistic” –二分类的逻辑回归问题,输出为概率。

  • “binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。

  • “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。 在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)

  • “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)

  • “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。

  • “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss

(2)’eval_metric’ The choices are listed below,评估指标:

  • “rmse”: root mean square error
  • “logloss”: negative log-likelihood
  • “error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
  • “merror”: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).
  • “mlogloss”: Multiclass logloss
  • “auc”: Area under the curve for ranking evaluation.
  • “ndcg”:Normalized Discounted Cumulative Gain
  • “map”:Mean average precision
  • “ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
  • “ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions.

(3)lambda [default=0] L2 正则的惩罚系数

(4)alpha [default=0] L1 正则的惩罚系数

(5)lambda_bias 在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

(6)eta [default=0.3]
为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
取值范围为:[0,1]

(7)max_depth [default=6] 数的最大深度。缺省值为6 ,取值范围为:[1,∞]

(8)min_child_weight [default=1]
孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该参数越大算法越保守。
取值范围为: [0,∞]

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

推荐阅读更多精彩内容