Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
DA-southampton committed Feb 15, 2022
1 parent ef0d82b commit 88a066a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 2 deletions.
Binary file modified .DS_Store
Binary file not shown.
Binary file added Pytorch/.DS_Store
Binary file not shown.
30 changes: 28 additions & 2 deletions 机器学习/xgboost/xgboost.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ $$
\\注解:\sum_{j=1}^{t}\Omega(f_{j})是全部t颗树的复杂度求和,在这里我们是当成了函数中的正则化项;
$$

这里一定要注意的是在损失函数中,我们左边使用的是按照样本来,右边使用的是按照树的个数来。

在后面损失函数优化的时候,我们需要把这个两个统一一下,都按照树的个数来做。

从这个目标函数我们需要掌握的细节是,**前后部分是两个维度的问题**

两个累加的变量是不同的:
Expand Down Expand Up @@ -98,12 +102,18 @@ $$
使用泰勒公式进行近似展开的核心目标是就是对目标函数进行化简,将常数项抽离出来。

基本泰勒公式展开如下:

$f(x) = f(x_{0})+f^{'}(x_{0})(x-x_{0})+\frac{1}{2}f^{"}(x_{0})(x-x_{0})^{2}$

拓展一下就是


$$
f(x+\Delta x) \simeq f(x)+ f'(x)\Delta x+\frac{1}{2}f''(x)\Delta x^{2}\\注解:此公式是对f(x+\Delta x) 在点x处进行的泰勒二阶展开
f(x_{0}+\Delta x) \simeq f(x_{0})+ f'(x_{0})\Delta x+\frac{1}{2}f''(x_{0})\Delta x^{2}\\注解:此公式是对f(x_{0}+\Delta x) 在点x_{0}处进行的泰勒二阶展开
$$
损失函数展开公式细节推导如下:
$$
\Delta x 对应的是第t颗树的模型f_{t}(x_i),x对应的是\hat{y_{i}}^{(t-1)},
\Delta x 对应的是第t颗树的模型f_{t}(x_i),x_{0}对应的是\hat{y_{i}}^{(t-1)},
$$

$$
Expand All @@ -129,6 +139,8 @@ $$

上述中树的表达我们都是使用函数`f(x)`来表示,本质上模型的优化求解是在求参数,所以我们需要对树模型参数化才可以进行进一步的优化

我想重点谈一下这个损失函数的意义,$g_{i}$是针对单个样本的一阶导数,$h_{i}$是单个样本的二阶导数。

### 1.3 树的参数化

树的参数化有两个,一个是对树模型参数化,一个是对树的复杂度参数化。
Expand All @@ -141,6 +153,12 @@ $$
- 样本到叶子节节点的映射关系`q`:(大白话就是告诉每个样本落在当前这个树的哪一个叶子节点上)
- 叶子节点样本归属集合`I`:就是告诉每个叶子节点包含哪些样本

这三个东西用图来表示就是这样子的:

![image-20220215105647686](https://picsfordablog.oss-cn-beijing.aliyuncs.com/2022-02-15-025649.png)

这个树的作用就是上图中这个函数,给我一个样本的id,我通过 $q_{x_{i}}$ 返回样本落在哪个叶子节点,然后返回这个叶子节点的值$w_{q_{x_{i}}}$

#### 1.3.1 树复杂度的参数化-如何定义树的复杂度

定义树的复杂度主要是从两个部分出发:
Expand All @@ -164,14 +182,20 @@ $$
进而我们可以对树进行了参数化,带入到目标函数我们可以得到如下:
$$
Obj^{(t)} \simeq \sum_{i=1}^{n}[g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega(f_{t})
\\ 注意,这里我们把l(y_{i},\hat{y_{i}}^{(t-1)})这个删掉了,因为是常量
$$

$$
= \sum_{i=1}^{n}[g_{i}w_{q}(x_{i})+\frac{1}{2}h_{i}w_{q}^{2}(x_{i})]+ \gamma T+\frac{1}{2}\lambda\sum_{j=1}^{T}\omega_{j}^{2}
\\这里一定要注意,就谈到了我们之前说到了,前后两项维度含义不一样,一个是样本,一个树叶子节点,我们全都
\\归到叶子节点这个维度
$$

$$
= \sum_{j=1}^{T}[(\sum _{i\in I_{j}}g_{i})w_{j}+\frac{1}{2}(\sum _{i\in I_{j}}h_{i}+\lambda )w_{j}^{2}]+ \gamma T
\\(\sum _{i\in I_{j}}g_{i}) 的含义是对单个叶子节点里的样本,把它的一阶导数加起来
\\\sum _{i\in I_{j}}h_{i} 同理这个是把单个叶子节点里的样本的二阶导数加起来
\\ \sum_{j=1}^{T} 对叶子节点个个数进行累加
$$

$$
Expand Down Expand Up @@ -215,6 +239,8 @@ $$

我们当然是希望,使用这个分裂点,目标函数降低的越多越好。

最保守的方式就是穷举法,就是我把所有的切分方式都列出来【注意我这里说的列出来不是针对单个节点,而是针对树,也就是把所有可能的树都列出来,在这个过程中,没有计算单个特征最优切分点的过程。一定要注意这点。然后我计算最初的损失值,和每一个树的损失值,然后找到损失降低最大的那个数,那么这个数对应的特征分类【包含先选择哪个特征,然后选择特征的哪个切分点】就是我们想要的】

#### 1.4.0 贪心算法

本质上是做两次循环,第一个是是针对每个特征的每个分割点做一次循环,计算收益,从而选择此特征的最佳分割点。分裂收益使用的是分裂之后的目标函数的变化差值。
Expand Down
Binary file modified 计算机基础知识/.DS_Store
Binary file not shown.

0 comments on commit 88a066a

Please sign in to comment.