本文部分原理及实例来自《统计学习方法》By 李航
Bagging的算法过程如下:
1.从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复)
2.对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
3.对于分类问题:由投票表决产生分类结果;
4.对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)
Boosting的算法过程如下:
1.对于训练集中的每个样本建立权值 w i wi wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。
2.进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大)
1.样本选择:Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
2.样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
3.预测函数:Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
4.并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
随机森林里的随机包含的意思是:
样本随机
特征随机
参数随机
模型随机(ID3 ,C4.5)
随机森林的构建过程大致如下:
1.从原始训练集中使用Bootstraping方法随机有放回采样选出N个样本,共进行K次采样,生成K个训练集
2.对于K个训练集,我们分别训练K个决策树模型
3.对于单个决策树模型,假设训练样本特征的个数为m,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂;
4.每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5.将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
sklearn.ensemble.RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, )
极限树/极端随机树里的随机包含的意思是:
特征随机
参数随机
模型随机(ID3 ,C4.5)
分裂随机
极限树与随机森林的主要区别:
RandomForest应用的是Bagging模型;ExtraTree使用的所有的样本,只是特征是随机选取的,因为分裂是随机的,所以在某种程度上比随机森林得到的结果更加好;
随机森林是在一个随机子集内得到最佳分叉属性;而ExtraTree是完全随机的得到分叉值,从而实现对决策树进行分叉的。
sklearn.ensemble.ExtraTreesClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1)
先假设给定一个二分类的训练数据集:
T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)} T=(x1,y1),(x2,y2),...,(xN,yN)
对于给定的如下的训练数据
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
先初始化数值权值分布:
D 1 = ( w 11 , . . . . , w 1 i , . . . . , w 110 ) D_1=(w_{11},....,w_{1i},....,w_{110} ) D1=(w11,....,w1i,....,w110)
w 1 i = 0.1 , 其 中 i = 1 , 2 , . . . 10 w_{1i}=0.1,其中i=1,2,...10 w1i=0.1,其中i=1,2,...10
1.生成第一个基分类器
a)在 D 1 D_1 D1为权值的训练集上,阈值取 2.5 时,误差率最低,故基分类器为:
G 1 ( x ) = { 1 , x<2.5 − 1 , x>2.5 G_1(x)= \begin{cases} 1, & \text{x<2.5} \\ -1, & \text{x>2.5} \end{cases} G1(x)={1,−1,x<2.5x>2.5
b)则 G 1 ( x ) G_1(x) G1(x)在训练集上的误差率为 e 1 = P ( G 1 ( x i ) ≠ y i ) = 0.3 e_1=P(G_1(x_i) \neq y_i)=0.3 e1=P(G1(xi)=yi)=0.3。
c)计算 G 1 ( x ) G_1(x) G1(x)的系数:
α 1 = 1 2 l o g 1 − e m e m = 1 2 l o g 1 − 0.3 0.3 = 0.4236 \alpha_1=\frac{1}{2}log\frac{1-e_m}{e_m}=\frac{1}{2}log\frac{1-0.3}{0.3}=0.4236 α1=21logem1−em=21log0.31−0.3=0.4236
d)更新训练集的权值分布:
D 2 = ( w 21 , . . . . , w 2 i , . . . . , w 210 ) D_2=(w_{21},....,w_{2i},....,w_{210} ) D2=(w21,....,w2i,....,w210)
w 2 , i = w 1 i Z 1 e x p ( − α 1 y i G 1 ( x i ) ) , i = 1 , 2 , . . . 10 w_{2,i}=\frac{w_{1i}}{Z_1}exp(-\alpha_1y_iG_1(x_i)),i=1,2,...10 w2,i=Z1w1iexp(−α1yiG1(xi)),i=1,2,...10
D 2 = ( 0.06546 Z 1 , 0.06546 Z 1 , 0.06546 Z 1 , 0.06546 Z 1 , 0.06546 Z 1 , 0.06546 Z 1 , 0.1527 Z 1 , 0.1527 Z 1 , 0.1527 Z 1 , 0.06546 Z 1 ) D_2=(\frac{0.06546}{Z_1},\frac{0.06546}{Z_1},\frac{0.06546}{Z_1},\frac{0.06546}{Z_1},\frac{0.06546}{Z_1},\frac{0.06546}{Z_1},\frac{0.1527}{Z_1},\frac{0.1527}{Z_1},\frac{0.1527}{Z_1},\frac{0.06546}{Z_1}) D2=(Z10.06546,Z10.06546,Z10.06546,Z10.06546,Z10.06546,Z10.06546,Z10.1527,Z10.1527,Z10.1527,Z10.06546)
D 2 = ( 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.16667 , 0.16667 , 0.16667 , 0.07143 ) D_2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143) D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143)
其中:
Z 1 = ∑ i = 1 10 w 1 i e x p ( − α 1 y i G 1 ( x i ) ) Z_1=\sum_{i=1}^{10} {w_{1i}exp(-\alpha_1y_iG_1(x_i))} Z1=∑i=110w1iexp(−α1yiG1(xi))
= 0.06546 ∗ 6 + 0.1527 ∗ 3 + 0.6546 = 0.9165 =0.06546*6+0.1527*3+0.6546=0.9165 =0.06546∗6+0.1527∗3+0.6546=0.9165
由上述可知,在第一个基分类器 G 1 G_1 G1中,有三个误分类点,以此种方法计算方法将误分类的第 7、8、9 个样本提高权重,再将权重分配至第二个基分类器中;
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
G 1 G_1 G1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
G 1 G_1 G1权重 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
2.生成第二个基分类器
a)在 D 2 D_2 D2为权值的训练集上,阈值取 8.5 时,误差率最低,故基分类器为:
G 2 ( x ) = { 1 , x<8.5 − 1 , x>8.5 G_2(x)= \begin{cases} 1, & \text{x<8.5} \\ -1, & \text{x>8.5} \end{cases} G2(x)={1,−1,x<8.5x>8.5
b) 则 G 2 ( x ) G_2(x) G2(x)在训练集上的误差率为 e 2 = P ( G 2 ( x i ) ≠ y i ) = 0.2143 e_2=P(G_2(x_i) \neq y_i)=0.2143 e2=P(G2(xi)=yi)=0.2143。
c)计算 G 2 ( x ) G_2(x) G2(x)的系数:
α 2 = 0.6496 \alpha_2=0.6496 α2=0.6496
d)更新训练数据权值分布:
D 3 = ( 0.0455 , 0.0455 , 0.0455 , 0.1667 , 0.1667 , 0.1667 , 0.1060 , 0.1060 , 0.1060 , 0.0455 ) D_3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455) D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455)
第二个基分类器 G 2 G_2 G2中,其中序号为 4、5、6 的样本预测错误
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
G 2 G_2 G2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
G 2 G_2 G2权重 | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.16667 | 0.16667 | 0.16667 | 0.07143 |
f 2 ( x ) = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) f_2(x)=0.4236G_1(x)+0.6496G_2(x) f2(x)=0.4236G1(x)+0.6496G2(x)
3.生成第三个基分类器
a)在 D 3 D_3 D3为权值的训练集上,阈值取 5.5 时,误差率最低,故基分类器为:
G 3 ( x ) = { 1 , x>5.5 − 1 , x<5.5 G_3(x)= \begin{cases} 1, & \text{x>5.5} \\ -1, & \text{x<5.5} \end{cases} G3(x)={1,−1,x>5.5x<5.5
b) 则 G 3 ( x ) G_3(x) G3(x)在训练集上的误差率为 e 3 = P ( G 3 ( x i ) ≠ y i ) = 0.1820 e_3=P(G_3(x_i) \neq y_i)=0.1820 e3=P(G3(xi)=yi)=0.1820。
c)计算 G 3 ( x ) G_3(x) G3(x)的系数:
α 3 = 0.7514 \alpha_3=0.7514 α3=0.7514
d)更新训练数据权值分布:
D 4 = ( 0.125 , 0.125 , 0.125 , 0.102 , 0.102 , 0.102 , 0.065 , 0.065 , 0.065 , 0.125 ) D_4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125) D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)
第三个基分类器中,其中序号为 1、2、3 、10的样本预测错误
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
G 3 G_3 G3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
G 3 G_3 G3权重 | 0.125 | 0.125 | 0.125 | 0.102 | 0.102 | 0.102 | 0.065 | 0.065 | 0.065 | 0.125 |
最终得到强学习器
G ( x ) = s i g n [ f 3 ( x ) ] = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x ) G(x)=sign[f_3(x)]=0.4236G_1(x)+0.6496G_2(x)+0.7514G_3(x) G(x)=sign[f3(x)]=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)
其误分类点为0个
别名:GBT(Gradient Boosting Tree)\GTB(Gradient Tree Boosting)\GBRT(Gradient Boosting Regression Tree)\GBDT(Gradient Boosting Decision Tree)\MART(Multiple Additive Regression Tree)
GDBT 也是 Boosting 算法的一种,但是和 Adaboost算法不同;
残差定义:
假设有一组数据 ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . . ( x n , y n ) (x_1,y_1),(x_2,y_2)....(x_n,y_n) (x1,y1),(x2,y2)....(xn,yn),有一个模型 F ( X ) F(X) F(X),用这个模型去拟合这一批数据,拟合的过程中使得我们选择的损失函数最小,最终成功拟合后,假设得到 F ( x 1 ) = 1.2 , F ( x 2 ) = 2.5 F(x_1)=1.2,F(x_2)=2.5 F(x1)=1.2,F(x2)=2.5,但实际的 y 1 = 1.1 , y 2 = 2.4 y_1=1.1,y_2=2.4 y1=1.1,y2=2.4。可以看出虽然已经拟合的不错了,但与真实值还是有一点差距。
如果想要进一步提升拟合的效果,一个最直观的做法就是使用一个新的学习器对上一批数据拟合过后的残差进行进一步拟合,也就是形成了一批新的数据 ( x 1 , y 1 − F ( x 1 ) ) , ( x 2 , y 2 − F ( x 2 ) ) . . . . ( x n , y n − F ( x n ) ) (x_1,y_1-F(x_1)),(x_2,y_2-F(x_2))....(x_n,y_n-F(x_n)) (x1,y1−F(x1)),(x2,y2−F(x2))....(xn,yn−F(xn))。
所以残差实际上是真实值和预测值之差,即 y − F ( x ) y-F(x) y−F(x)。
加法模型
sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse')