更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html
提升树
提升树(boosting tree)是以分类树或回归树作为弱学习器的强学习器。
提升树模型用的是加法模型,算法用的是前向分步算法,弱学习器是决策树的集成学习方法。
一、提升树学习目标
- 加法模型
- 前向分步算法
- 提升树与AdaBoost算法
- 回归提升树流程
- 提升树优缺点
二、提升树引入
假设Nick的年龄是25岁。
- 第1棵决策树
把Nick的年龄设置成初始值0岁去学习,如果第1棵决策树预测Nick的年龄是12岁,即残差值为(25-12=13)
2. 第2课决策树
1. 把Nick的年龄设置成残差值13岁去学习,如果第2棵决策树能把Nick分到13岁的叶子节点,累加两棵决策树的预测值加和(12+13=25),就是Nick的真实年龄25岁
2. 如果第2棵决策树的得到的是10岁,残差值为(25-12-10=3)
3. 第3课决策树
把Nick的年龄设置成残差值3岁去学习……
4. 继续重复上述过程学习,不断逼近Nick的真实年龄
三、提升树详解
3.1 加法模型
提升树模型可以表示为决策树的加法模型
其中(T(x; heta_m))表示决策树;( heta_m)表示决策树的参数;(M)为树的个数。
3.2 前向分步算法
提升树模型使用的是前向分布算法,即假设初始提升树(f_0(x)=0),第(m)步的模型是
其中(f_{m-1}(x))为当前模型,通过经验风险极小化确定一下课决策树的参数( heta_m)
3.3 提升树与AdaBoost算法
AdaBoost算法使用的是前向分步算法,利用前一轮弱学习器的误差率更新训练数据的权重;提升树使用的也是前向分步算法,但是提升树如其名,他的弱学习器只能使用决策树,一般使用CART树,然后他的迭代思路也与AdaBoost算法不同
假设提升树在(t-1)轮的强学习器为(f_{t-1}(x)),目标函数是
在第(t)轮的目标则是找到一个弱学习器(决策树)(h_t(x)),最小化第(t)轮的目标函数
但是当AdaBoost算法中的弱学习器为二类分类树的时候,其实AdaBoost就是提升树,即可以说分类提升树算法是AdaBoost算法的一种特殊情况。
3.4 回归提升树
有(m)个数据(n)个特征的训练数据集(T={(x_,y_1),(x_2,y_2),cdots,(x_m,y_m)}),如果将输入空间划分为(k)互不相交的区域(R_1,R_2,cdots,R_j),并且在每个区域上确定输出的常量(c_j),决策树可以表示为
其中,( heta={(R_1,c_1),(R_2,c_2),cdots,(R_J,c_J)}表示树的区域划分和各区域上的常数,)J$是回归树的叶节点个数。
3.4.1 前向分步算法
在第(m)步(f_m(x)=f_{m-1}(x)+T(x, heta_m))的时候,给定了(f_{m-1}(x)),需要求解第(m)棵的参数(hat{ heta_m})
3.4.2 平方误差损失函数
对于第(m)棵树的参数(hat{ heta_m}),可以采用平方误差损失函数(L(y,f(x))=(y-f(x))^2)求解,树的损失变为
其中(r=y-f_{m-1}(x))是当前模型拟合数据的残差。
对于回归提升树,只需简单地拟合当前模型的残差。
四、回归提升树流程
4.1 输入
有(m)个数据(n)个特征的训练数据集(T={(x_,y_1),(x_2,y_2),cdots,(x_m,y_m)})。
4.2 输出
回归提升树(f_M(x))。
五、流程
- 初始化(f_0(x)=0)
- 对(m=1,2,cdots,M)
- 计算残差(r_{mi}=y_i-f_{m-1}(x_i),quad{i=1,2,cdots,m})
- 拟合残差(r_{mi})学习一个回归树,得到(T(x; heta_m))
- 更新(f_m(x)=f_{m-1}(x)+T(x; heta_m))
- 得到回归提升树
六、提升树优缺点
6.1 优点
- 既可以解决分类问题,又可以解决回归问题
6.2 缺点
- 弱学习器之间存在依赖关系,难以并行训练
- 提升树只是简单的拟合模型的残差,并不准确
七、小结
提升树属于Boosting系列算法,他和AdaBoost有相似之处的,并且当AdaBoost算法中的弱学习器为二类分类树的时候,梯度提升树就是一种特殊的AdaBoost算法。
由于提升树是由简单的残差计算得到的,所以在某种程度上来说,提升树是有一定缺陷的,为了解决这个问题,一般会采用梯度提升树来弥补。