3 min read

"学习笔记:Boosting理论部分 学习笔记

"学习笔记 系列导航

1 "学习笔记:Deep Learning in Python 学习笔记 2017-12-22
2 "学习笔记:Python 学习的流水笔记 2017-12-25
3 "学习笔记:Network Analysis in Python Part 1 学习笔记 2017-12-27
4 "学习笔记:XGBoost using Python 学习笔记 2017-12-28
5 "学习笔记:Supervised Learning with scikit-learn 学习笔记 2017-12-30
6 "学习笔记:Machine Learning with the Experts School Budgets 学习笔记 2018-01-02
7 "学习笔记:犯罪心理解析 2018-01-02
8 "学习笔记:决策树理论部分 学习笔记 2018-01-03
9 "学习笔记:Shell 学习笔记 2018-01-04
10 "学习笔记:客户价值定价 学习笔记 2018-01-04
11 "学习笔记:Introduction to Git for Data Science 学习笔记 2018-01-06
12 "学习笔记:线性代数 整理笔记 2018-01-08
13 "学习笔记:退火算法 学习笔记 2018-01-09
14 "学习笔记:Fahrenheit 911 视频笔记 2018-01-18
15 "学习笔记:pandas debugging 学习笔记 2018-01-19
16 "学习笔记:brilliant.org概率论导论 学习笔记 2018-01-22
17 "学习笔记:Machine Learning with Tree-Based Models in R 学习笔记 2018-01-22
18 "学习笔记:Building Web Applications in R with Shiny 学习笔记 2018-01-25
19 "学习笔记:Inference for Numerical Data 学习笔记 2018-01-26
20 "学习笔记:Support Vector Machines SVM 学习笔记 2018-01-26
21 "学习笔记:Introduction to DataCamp Projects 学习笔记 2018-01-28
22 "学习笔记:Working with Web Data in R 学习笔记 2018-01-28
23 "学习笔记:三种平均数使用的方式 学习笔记 2018-01-29
24 "学习笔记:戒律的复活 每周六更新 2018-01-29
25 "学习笔记:Communicating with Data in the Tidyverse 学习笔记 2018-01-31
26 "学习笔记:Kaggle R Tutorial on Machine Learning 学习笔记 2018-02-01
27 "学习笔记:Kaggle Python Tutorial on Machine Learning 学习笔记 2018-02-02
28 "学习笔记:圆桌派 第三季 视频笔记 2018-02-05
29 "学习笔记:基础与技巧整理 2018-02-25
30 "学习笔记:英语学习:积累:词汇、表达与语法整理 2018-04-09
31 "学习笔记:魏剑峰英语学习:笔记:表达与语法整理 2018-05-02
32 "学习笔记:Planet Money播客学习笔记:经济学话题解析 2018-06-05
33 "学习笔记:WSJ 学习笔记 2020-10-19

{r setup, include=FALSE} knitr::opts_chunk$set(eval = FALSE) * Extreme Gradient Boosting with XGBoost 学习笔记 - A Hugo website 这里是Python的Code和例子,以及超参数的调整。

这里主要讲的是理论部分,反正我在网上很少看到讲的清楚的文章,这篇写的比较好,是卡狗,Kaggle比较厉害的一个人写的,Ben Gorman | Kaggle。 这里主要参考他的一个博客,A Kaggle Master Explains Gradient Boosting | No Free Hunch

简单来说,XGBoost的形成,是通过决策树$\to$ Boosting $\to$ XGBoost完成的。

因此先将决策树。 具体决策树递归的逻辑见 ( 决策树理论部分 学习笔记 - A Hugo website ) 。

{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) library(tidyverse)

{r echo=FALSE, message=FALSE, warning=FALSE} tibble::tribble( ~PersonID, ~Age, ~LikesGardening, ~PlaysVideoGames, ~LikesHats, 1L, 13L, FALSE, TRUE, TRUE, 2L, 14L, FALSE, TRUE, FALSE, 3L, 15L, FALSE, TRUE, FALSE, 4L, 25L, TRUE, TRUE, TRUE, 5L, 35L, FALSE, TRUE, TRUE, 6L, 49L, TRUE, FALSE, FALSE, 7L, 68L, TRUE, TRUE, TRUE, 8L, 71L, TRUE, FALSE, FALSE, 9L, 73L, TRUE, FALSE, TRUE ) %>% kable()

其中列标签分别表示,

  • PersonID表示数据表的index,
  • Age是$Y$变量,
  • 其余是$X$变量,且都是dummy的。

对于三个自变量,有如下的猜想,

– The people who like gardening are probably older,喜欢花花草草的,可能更年长 – The people who like video games are probably younger,喜欢打游戏的,可能更年轻 – LikesHats is probably just random noise,喜欢帽子与否是噪音,这里的引入主要是为说明决策树的一个超参数。

{r echo=FALSE, message=FALSE, warning=FALSE} tibble::tribble( ~Feature, ~FALSE., ~TRUE., "LikesGardening", "{13, 14, 15, 35}", "{25, 49, 68, 71, 73}", "PlaysVideoGames", "{49, 71, 73}", "{13, 14, 15, 25, 35, 68}", "LikesHats", "{14, 15, 49, 71}", "{13, 25, 35, 68, 73} ) %>% kable()

<!-- ![](http://5047-presscdn.pagely.netdna-cdn.com/wp-content/uploads/2017/01/blog_gb_tree1_3.png) -->

假设每个叶子最少三个样本得到的例子。 这个通过信息熵控制,暂时不讨论这个问题。

<!-- ![](http://5047-presscdn.pagely.netdna-cdn.com/wp-content/uploads/2017/01/gb_tree1B_4.png) -->

假设每个叶子最少两个样本得到的例子,发现噪音-帽子进入了决策树,因为模型抓取了噪音,因此过拟合了。

这里可以通过正则化等方法控制,但是Boosting也可以解决这个问题。

{r echo=FALSE, message=FALSE, warning=FALSE} tibble::tribble( ~PersonID, ~Age, ~Tree1.Prediction, ~Tree1.Residual, 1L, 13L, 19.25, -6.25, 2L, 14L, 19.25, -5.25, 3L, 15L, 19.25, -4.25, 4L, 25L, 57.2, -32.2, 5L, 35L, 19.25, 15.75, 6L, 49L, 57.2, -8.2, 7L, 68L, 57.2, 10.8, 8L, 71L, 57.2, 13.8, 9L, 73L, 57.2, 15.8 ) %>% kable()

公式满足

$$Age-Tree1.Prediction = Tree1.Residual$$

Boosting的关键出现了,

<!-- ![](http://5047-presscdn.pagely.netdna-cdn.com/wp-content/uploads/2017/01/blog_gb_tree2_3.png) -->

Tree1.Residual也就是$\hat \mu$进行学习,这就是知道了,为什么线性回归搞Boosting存在bug,因为$\rho(\hat \mu, X) = 0$。

这个树相比较于Tree1的关键之处是,没有用帽子变量,因此剔除了噪音,这就是Boosting的价值之处,并且这里的$\hat y$是Tree1里面的$\hat \mu$,是一个过拟合的决策树的东西。 因此Boosting相当于对错题集重复的学习。

{r echo=FALSE, message=FALSE, warning=FALSE} tibble::tribble( ~PersonID, ~Age, ~Tree1.Prediction, ~Tree1.Residual, ~Tree2.Prediction, ~Combined.Prediction, ~Final.Residual, 1L, 13L, 19.25, -6.25, -3.567, 15.68, 2.683, 2L, 14L, 19.25, -5.25, -3.567, 15.68, 1.683, 3L, 15L, 19.25, -4.25, -3.567, 15.68, 0.6833, 4L, 25L, 57.2, -32.2, -3.567, 53.63, 28.63, 5L, 35L, 19.25, 15.75, -3.567, 15.68, -19.32, 6L, 49L, 57.2, -8.2, 7.133, 64.33, 15.33, 7L, 68L, 57.2, 10.8, -3.567, 53.63, -14.37, 8L, 71L, 57.2, 13.8, 7.133, 64.33, -6.667, 9L, 73L, 57.2, 15.8, 7.133, 64.33, -8.667 ) %>% kable()

这里满足,以PersonID = 1为例。

Age = 13Tree1 Prediction = 19.25, 所以,Tree1 Residual = 13 - 19.25 = -6.25

Tree2 Prediction = -3.567 所以,Tree2 Residual = -6.25 - (-3.567) = -2.683,也就是Final Residual

所以,Combined.Prediction = Age - Final Residual = 13 - (-2.683) = 15.83

用公式推导就是,

$$y = F_{1}(X) \to y = \hat F_{1}(X) + \hat \mu_{1}$$

$$\hat \mu_1 = F_{2}(X) \to \hat \mu_1 = \hat F_{2}(X) + \hat \mu_{2}$$

因此,

$$\begin{alignat}{2} y & = \hat F_{1}(X) + \hat \mu_{1} \ & = \hat F_{1}(X) + \hat F_{2}(X) + \hat \mu_{2} \ & = \sum_{i}^m \hat F_{i}(X) + \hat \mu_{m} \ \end{alignat}$$

$\hat \mu_{m}$理论上比之前都要好,因此这就是Boosting的价值。

"学习笔记 系列导航

1 "学习笔记:Deep Learning in Python 学习笔记 2017-12-22
2 "学习笔记:Python 学习的流水笔记 2017-12-25
3 "学习笔记:Network Analysis in Python Part 1 学习笔记 2017-12-27
4 "学习笔记:XGBoost using Python 学习笔记 2017-12-28
5 "学习笔记:Supervised Learning with scikit-learn 学习笔记 2017-12-30
6 "学习笔记:Machine Learning with the Experts School Budgets 学习笔记 2018-01-02
7 "学习笔记:犯罪心理解析 2018-01-02
8 "学习笔记:决策树理论部分 学习笔记 2018-01-03
9 "学习笔记:Shell 学习笔记 2018-01-04
10 "学习笔记:客户价值定价 学习笔记 2018-01-04
11 "学习笔记:Introduction to Git for Data Science 学习笔记 2018-01-06
12 "学习笔记:线性代数 整理笔记 2018-01-08
13 "学习笔记:退火算法 学习笔记 2018-01-09
14 "学习笔记:Fahrenheit 911 视频笔记 2018-01-18
15 "学习笔记:pandas debugging 学习笔记 2018-01-19
16 "学习笔记:brilliant.org概率论导论 学习笔记 2018-01-22
17 "学习笔记:Machine Learning with Tree-Based Models in R 学习笔记 2018-01-22
18 "学习笔记:Building Web Applications in R with Shiny 学习笔记 2018-01-25
19 "学习笔记:Inference for Numerical Data 学习笔记 2018-01-26
20 "学习笔记:Support Vector Machines SVM 学习笔记 2018-01-26
21 "学习笔记:Introduction to DataCamp Projects 学习笔记 2018-01-28
22 "学习笔记:Working with Web Data in R 学习笔记 2018-01-28
23 "学习笔记:三种平均数使用的方式 学习笔记 2018-01-29
24 "学习笔记:戒律的复活 每周六更新 2018-01-29
25 "学习笔记:Communicating with Data in the Tidyverse 学习笔记 2018-01-31
26 "学习笔记:Kaggle R Tutorial on Machine Learning 学习笔记 2018-02-01
27 "学习笔记:Kaggle Python Tutorial on Machine Learning 学习笔记 2018-02-02
28 "学习笔记:圆桌派 第三季 视频笔记 2018-02-05
29 "学习笔记:基础与技巧整理 2018-02-25
30 "学习笔记:英语学习:积累:词汇、表达与语法整理 2018-04-09
31 "学习笔记:魏剑峰英语学习:笔记:表达与语法整理 2018-05-02
32 "学习笔记:Planet Money播客学习笔记:经济学话题解析 2018-06-05
33 "学习笔记:WSJ 学习笔记 2020-10-19