[机器学习] Boosting算法1 --- AdaBoost

[机器学习] Boosting算法2 --- GBDT

[机器学习] Boosting算法3 --- XGBoost

[机器学习] Boosting算法4 --- LightGBM

目录

一、提升算法概论

二、AdaBoost算法

弱分类器(单层决策树)

关于Adaboost的两种权重

Adaboost数据权重与弱分类器

Adaboost分类器的权重

Adaboost实例解析<1>

图示说明adaboost的实现过程<2>


一、提升算法概论

Boosting(提升)是一族可将弱学习器提升为强学习器的算法。提升算法基于这样一种思想:对于一个复杂的任务,将多个专家的判断总和得出的结果要比任何一个专家单独的判断好。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器表现对训练样本分布进行调整,是的先前基学习器做错的样本在后续收到更多关注(赋予做错的样本更大的权值),然后基于调整后的样本分布来训练下一个基学习器,一直反复进行,直到达到指定值。boosting方法通过分步迭代(stage-wise)的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。(个体学习器之间存在强依赖关系。

对样本加权的过程如下:

上图中被放大的点是被加权的样本,样本加权后,在下一次的学习中就会收到更多的关注。

也就是说提升算法对分类错误的样本更为关注,通过改变错误样本所占的权值来改变分类边界,从而一步步提升算法的准确度。

二、AdaBoost算法

AdaBoost算法是提升算法中最具代表性的。其中AdaBoost是Adaptive Boosting的缩写, 正如上面所说的,在AdaBoost算法中会提高前一轮分类器分类错误的样本的权值,而降低那些被分类正确样本的权值。对于弱分类器的组合,AdaBoost算法采取加权多数表决的方法。具体的说就是加大分类误差率小的弱分类器的权值,使其在表决中起到较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

主要解决的问题:目前对AdaBoost算法的研究以及应用大多集中于分类问题,同时近年也出现了一些在回归问题上的应用。就其应用adaBoost系列主要解决了: 两类问题、多类单标签问题、多类多标签问题、大类单标签问题,回归问题。

1.    为数据集里的每个样本赋予相同的权重(一般情况),然后开始依据一定的分类标准来对该数据集分类,从而得到第一个Classifier[1](弱分类器)。同时由此可得此次分类中被分错的样本,提高他们的权重,用于下一个Classifier[2]的训练。

2.    依据上一次Classifier训练更新样本权重后的样本集,来训练此次Classifier[2]。其中可以依据样本权重来影响此次训练的错误率来使此次Classifier[2]足够重视之前错分的样本。这样我们可以得到对于上次分错的样本有较好分类能力的Classifier[2],然后提高本次分类中被分错的样本的权重。重复此过程,得到若干的弱分类器Classifier[i]。

3.    为1、2步中得到的Classifier[i]确定在最终的强分类器中的权重(此权重的确定也可以在1、2步中确定)。Strong_Classifier = ∑( weight[i] *Classifier[i])(弱分类器的线性组合),计算Strong_Classifier的错误率,然后综合考虑程序迭代次数来判断是否继续重复1-3步迭代训练。

对于这个算法需要介绍的是: 
1. 算法开始前,需要将每个样本的权重初始化为1/m,这样一开始每个样本都是等概率的分布,每个分类器都会公正对待。 
2. 开始迭代后,需要计算每个弱分类器的分类错误的误差,误差等于各个分错样本的权重和,这里就体现了样本权重的作用。如果一个分类器正确分类了一个权重大的样本,那么这个分类器的误差就会小,否则就会大。这样就对分类错误的样本更大的关注。 
3. 获取最优分类器后,需要计算这个分类器的权重,然后再更新各个样本的权重,然后再归一化。 
4. 算法迭代的次数一般不超过弱分类器的个数,如果弱分类器的个数非常之多,那么可以权衡自己性价比来折中选择。 
5. 迭代完成后,最后的分类器是由迭代过程中选择的弱分类器线性加权得到的。

弱分类器(单层决策树)

Adaboost一般使用单层决策树作为其弱分类器。单层决策树是决策树的最简化版本,只有一个决策点,也就是说,如果训练数据有多维特征,单层决策树也只能选择其中一维特征来做决策,并且还有一个关键点,决策的阈值也需要考虑。

关于单层决策树的决策点,来看几个例子。比如特征只有一个维度时,可以以小于7的分为一类,标记为+1,大于(等于)7的分为另一类,标记为-1。当然也可以以13作为决策点,决策方向是大于13的分为+1类,小于(等于)13的分为-1类。在单层决策树中,一共只有一个决策点,所以下图的两个决策点不能同时选取。

同样的道理,当特征有两个维度时,可以以纵坐标7作为决策点,决策方向是小于7分为+1类,大于(等于)7分类-1类。当然还可以以横坐标13作为决策点,决策方向是大于13的分为+1类,小于13的分为-1类。在单层决策树中,一共只有一个决策点,所以下图的两个决策点不能同时选取。

扩展到三维、四维、N维都是一样,在单层决策树中,一共只有一个决策点,所以只能在其中一个维度中选择一个合适的决策阈值作为决策点。

关于Adaboost的两种权重

Adaboost算法中有两种权重,一种是数据的权重,另一种是弱分类器的权重。其中,数据的权重主要用于弱分类器寻找其分类误差最小的决策点,找到之后用这个最小误差计算出该弱分类器的权重(发言权),分类器权重越大说明该弱分类器在最终决策时拥有更大的发言权。

Adaboost数据权重与弱分类器

刚刚已经介绍了单层决策树的原理,这里有一个问题,如果训练数据保持不变,那么单层决策树找到的最佳决策点每一次必然都是一样的,为什么呢?因为单层决策树是把所有可能的决策点都找了一遍然后选择了最好的,如果训练数据不变,那么每次找到的最好的点当然都是同一个点了。

所以,这里Adaboost数据权重就派上用场了,所谓“数据的权重主要用于弱分类器寻找其分类误差最小的点”,其实,在单层决策树计算误差时,Adaboost要求其乘上权重,即计算带权重的误差。

举个例子,在以前没有权重时(其实是平局权重时),一共10个点时,对应每个点的权重都是0.1,分错1个,错误率就加0.1;分错3个,错误率就是0.3。现在,每个点的权重不一样了,还是10个点,权重依次是[0.01,0.01,0.01,0.01,0.01,0.01, 0.01,0.01,0.01,0.91],如果分错了第1一个点,那么错误率是0.01,如果分错了第3个点,那么错误率是0.01,要是分错了最后一个点,那么错误率就是0.91。这样,在选择决策点的时候自然是要尽量把权重大的点(本例中是最后一个点)分对才能降低误差率。由此可见,权重分布影响着单层决策树决策点的选择,权重大的点得到更多的关注,权重小的点得到更少的关注。

在Adaboost算法中,每训练完一个弱分类器都就会调整权重,上一轮训练中被误分类的点的权重会增加,在本轮训练中,由于权重影响,本轮的弱分类器将更有可能把上一轮的误分类点分对,如果还是没有分对,那么分错的点的权重将继续增加,下一个弱分类器将更加关注这个点,尽量将其分对。

这样,达到“你分不对的我来分”,下一个分类器主要关注上一个分类器没分对的点,每个分类器都各有侧重。

Adaboost分类器的权重

由于Adaboost中若干个分类器的关系是第N个分类器更可能分对第N-1个分类器没分对的数据,而不能保证以前分对的数据也能同时分对。所以在Adaboost中,每个弱分类器都有各自最关注的点,每个弱分类器都只关注整个数据集的中一部分数据,所以它们必然是共同组合在一起才能发挥出作用。所以最终投票表决时,需要根据弱分类器的权重来进行加权投票,权重大小是根据弱分类器的分类错误率计算得出的,总的规律就是弱分类器错误率越低,其权重就越高。

如图所示为Adaboost分类器的整体结构。从右到左,可见最终的求和与符号函数,再看到左边求和之前,图中的虚线表示不同轮次的迭代效果,第1次迭代时,只有第1行的结构,第2次迭代时,包括第1行与第2行的结构,每次迭代增加一行结构,图下方的“云”表示不断迭代结构的省略。

第i轮迭代要做这么几件事: 
1. 新增弱分类器WeakClassifier(i)与弱分类器权重alpha(i) 
2. 通过数据集data与数据权重W(i)训练弱分类器WeakClassifier(i),并得出其分类错误率,以此计算出其弱分类器权重alpha(i) 
3. 通过加权投票表决的方法,让所有弱分类器进行加权投票表决的方法得到最终预测输出,计算最终分类错误率,如果最终错误率低于设定阈值(比如5%),那么迭代结束;如果最终错误率高于设定阈值,那么更新数据权重得到W(i+1)

对于boosting算法,存在两个问题:   
1. 如何调整训练集,使得在训练集上训练的弱分类器得以进行;    
2. 如何将训练得到的各个弱分类器联合起来形成强分类器。

针对以上两个问题,AdaBoost算法进行了调整:   
1. 使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;    
2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。  

Adaboost实例解析<1>

例1. Adaboost的一个例子 
下面,给定下列训练样本,请用AdaBoost算法学习一个强分类器。 
 
求解过程: 
  初始化训练数据的权值分布,令每个权值W1i = 1/N = 0.1,其中,N = 10,i = 1,2, …, 10,然后分别对于m = 1,2,3, …等值进行迭代。 
  拿到这10个数据的训练样本后,根据 X 和 Y 的对应关系,要把这10个数据分为两类,一类是“1”,一类是“-1”,根据数据的特点发现:“0 1 2”这3个数据对应的类是“1”,“3 4 5”这3个数据对应的类是“-1”,“6 7 8”这3个数据对应的类是“1”,9是比较孤独的,对应类“-1”。抛开孤独的9不讲,“0 1 2”、“3 4 5”、“6 7 8”这是3类不同的数据,分别对应的类是1、-1、1,直观上推测可知,可以找到对应的数据分界点,比如2.5、5.5、8.5 将那几类数据分成两类。当然,这只是主观臆测,下面实际计算下这个过程。

迭代过程1 
(1) 对于m=1,在权值分布为D1(10个数据,每个数据的权值皆初始化为0.1)的训练数据上,经过计算可得:

  • 阈值v取2.5时误差率为0.3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.3),
  • 阈值v取5.5时误差率最低为0.4(x < 5.5时取1,x > 5.5时取-1,则3 4 5 6 7 8皆分错,误差率0.6大于0.5,不可取。故令x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.4),
  • 阈值v取8.5时误差率为0.3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.3)。

所以无论阈值v取2.5,还是8.5,总得分错3个样本,故可任取其中任意一个如2.5,够成第一个基本分类器为:

  • 上面说阈值v取2.5时则6 7 8分错,所以误差率为0.3,更加详细的解释是:因为样本集中0 1 2对应的类(Y)是1,因它们本身都小于2.5,所以被G1(x)分在了相应的类“1”中,分对了。
  • 3 4 5本身对应的类(Y)是-1,因它们本身都大于2.5,所以被G1(x)分在了相应的类“-1”中,分对了。
  • 但6 7 8本身对应类(Y)是1,却因它们本身大于2.5而被G1(x)分在了类”-1”中,所以这3个样本被分错了。
  • 9本身对应的类(Y)是-1,因它本身大于2.5,所以被G1(x)分在了相应的类“-1”中,分对了。

(2) 从而得到G1(x)在训练数据集上的误差率(被G1(x)误分类样本“6 7 8”的权值之和)e1=P(G1(xi)≠yi) = 3*0.1 = 0.3。然后根据误差率e1计算G1的系数:


这个a1代表G1(x)在最终的分类函数中所占的权重为0.4236。 
(3) 接着更新训练数据的权值分布,用于下一轮迭代。 
 
  值得一提的是,由权值更新的公式可知,每个样本的新权值是变大还是变小,取决于它是被分错还是被分正确。即如果某个样本被分错了,则yi * Gm(xi)为负,负负等正,结果使得整个式子变大(样本权值变大),否则变小。 
(4) 第一轮迭代后,最后得到各个数据新的权值分布: 
       D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。 
      由此可以看出,因为样本中是数据“6 7 8”被G1(x)分错了,所以它们的权值由之前的0.1增大到0.1666,反之,其它数据皆被分正确,所以它们的权值皆由之前的0.1减小到0.0715。 
(5) 分类函数:f1(x)= a1*G1(x) = 0.4236G1(x)。

此时,得到的第一个基本分类器sign(f1(x))在训练数据集上有3个误分类点(即6 7 8)。从上述第一轮的整个迭代过程可以看出:被误分类样本的权值之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重。

迭代过程2 
(1) 对于m=2,在权值分布为D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)的训练数据上,经过计算可得:

  • 阈值v取2.5时误差率为0.1666*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.1666*3),
  • 阈值v取5.5时误差率最低为0.0715*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.0715*3 + 0.0715),
  • 阈值v取8.5时误差率为0.0715*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.0715*3)。

所以,阈值v取8.5时误差率最低,故第二个基本分类器为:

(2) 面对的还是下述样本: 
 
很明显,G2(x)把样本“3 4 5”分错了,根据D2可知它们的权值为0.0715, 0.0715, 0.0715,所以G2(x)在训练数据集上的误差率e2=P(G2(xi)≠yi) = 0.0715 * 3 = 0.2143。 
计算G2的系数:


(3) 更新训练数据的权值分布: 
D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.01667, 0.1060, 0.1060, 0.1060, 0.0455)。 
被分错的样本“3 4 5”的权值变大,其它被分对的样本的权值变小。 
(4) f2(x)=0.4236G1(x) + 0.6496G2(x) 
此时,得到的第二个基本分类器sign(f2(x))在训练数据集上有3个误分类点(即3 4 5)

迭代过程3 
(1) 对于m=3,在权值分布为D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.01667, 0.1060, 0.1060, 0.1060, 0.0455)的训练数据上,经过计算可得:

  • 阈值v取2.5时误差率为0.1060*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.1060*3),
  • 阈值v取5.5时误差率最低为0.0455*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.0455*3 + 0.0715),
  • 阈值v取8.5时误差率为0.1667*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.1667*3)。

所以阈值v取5.5时误差率最低,故第三个基本分类器为:

(2) 依然还是原样本: 
 
此时,被误分类的样本是:0 1 2 9,这4个样本所对应的权值皆为0.0455, 所以G3(x)在训练数据集上的误差率e3 = P(G3(xi)≠yi) = 0.0455*4 = 0.1820。 
计算G3的系数:

(3) 更新训练数据的权值分布: 
D4 = (0.125, 0.125, 0.125, 0.102, 0.102, 0.102, 0.065, 0.065, 0.065, 0.125)。 
被分错的样本“0 1 2 9”的权值变大,其它被分对的样本的权值变小。 
(4) f3(x)=0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) 
此时,得到的第三个基本分类器sign(f3(x))在训练数据集上有0个误分类点。至此,整个训练过程结束。

训练结束 
G(x) = sign[f3(x)] = sign[ a1 * G1(x) + a2 * G2(x) + a3 * G3(x) ], 
将上面计算得到的a1、a2、a3各值代入G(x)中,得到最终的分类器为: 
G(x) = sign[f3(x)] = sign[ 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) ]

毫无疑问这个模型的最大的一个优点是可以自动的组合弱分类器,这在实际应用中的便利之处十分明显。算法本身简单,高效,易于编写而且训练过程是没有参数需要调节的。 但是adaboost也是有缺点的,并不是所有问题都能搞定,从wiki上介绍的来看,adaboost对于噪音数据和异常数据是十分敏感的。

图示说明adaboost的实现过程<2>

图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器,来进行分类。 
第一步:

根据分类的正确率,得到一个新的样本分布D2­,一个子分类器h1。

其中划圈的样本表示被分错的。在右边的途中,比较大的“+”表示对该样本做了加权。 
也许你对上面的ɛ1,ɑ1怎么算的也不是很理解。下面我们算一下,算法最开始给了一个均匀分布 D 。所以h1 里的每个点的值是0.1。ok,当划分后,有三个点划分错了,根据算法误差表达式ε1=Pri∼Dt[ht(xi)≠yi]ε1=Pri∼Dt[ht(xi)≠yi],得到误差为分错了的三个点的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根据表达式的可以算出来为0.42. 然后就根据算法把分错的点权值变大。如此迭代,最终完成Adaboost算法。

第二步:

根据分类的正确率,得到一个新的样本分布D3,一个子分类器h2。 
第三步:

得到一个子分类器h3

整合所有子分类器:

因此可以得到整合的结果,从结果中看,及时简单的分类器,组合起来也能获得很好的分类效果,在例子中所有的。

而a是关于误差的表达式,到这里就可以得到比较清晰的答案了,所有的一切都指向了误差。提高错误点的权值,当下一次分类器再次分错了这些点之后,会提高整体的错误率,这样就导致 a 变的很小,最终导致这个分类器在整个混合分类器的权值变低。也就是说,这个算法让优秀的分类器占整体的权值更高,而挫的分类器权值更低。这个就很符合常理了。

参考:

  1. https://www.jianshu.com/p/6755107e816d
  2. https://www.jianshu.com/p/a72539acafe5
  3. https://blog.csdn.net/fengying2016/article/details/77239605

[机器学习] Boosting算法1 --- AdaBoost相关推荐

  1. [机器学习] Boosting算法4 --- LightGBM介绍与分布式

    [机器学习] Boosting算法1 --- AdaBoost [机器学习] Boosting算法2 --- GBDT [机器学习] Boosting算法3 --- XGBoost [机器学习] Bo ...

  2. [机器学习] Boosting算法2 --- GBDT

    [机器学习] Boosting算法1 --- AdaBoost [机器学习] Boosting算法2 --- GBDT [机器学习] Boosting算法3 --- XGBoost [机器学习] Bo ...

  3. Bagging与Boosting算法的原理与区别,Boosting算法之一Adaboost原理与代码实现

    1. Bagging和Boosting的原理与区别 在讲解Boosting之前,必须提一下Bagging算法.两者作为机器学习中集成学习的主要算法,其思想是必须理解和掌握的.总的来说Bagging和B ...

  4. 机器学习 —— Boosting算法

    Boosting算法(提升法) 算法的三个要素 (1)函数模型:Boosting的函数模型是叠加型的,即 F(x)=∑i=1kfi(x;θi)F(x)=∑i=1kfi(x;θi) F(x)=\sum_ ...

  5. xgboost 正则项_深入理解Boosting算法(4)-XGBoost

    导语:记得第一次使用XGBoost的时候还是2016年,那会的XGBoost工具还不完善,深度模型还没有怎么样火起来,大家用的最多的还是Sklearn里面的GBDT,或者R语言的GBM.后来在工作中也 ...

  6. 【机器学习算法实践】AdaBoost是典型的Boosting算法,加法模型多个弱分类器流水线式的提升精度,更关注那些难处理的数据

    现实生活中,大家都知道"人多力量大","3 个臭皮匠顶个诸葛亮".而集成学习的核心思路就是"人多力量大",它并没有创造出新的算法,而是把已有 ...

  7. 机器学习经典算法详解及Python实现--元算法、AdaBoost

    http://blog.csdn.net/suipingsp/article/details/41822313 第一节,元算法略述 遇到罕见病例时,医院会组织专家团进行临床会诊共同分析病例以判定结果. ...

  8. 【白话机器学习】算法理论+实战之AdaBoost算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  9. CTR 预测理论(九):Boosting 集成算法中 Adaboost, GBDT 与 XGBoost 的区别

    https://blog.csdn.net/Dby_freedom/article/details/81975255 最近总结树模型,尝试将主流 Boosting 实现方式做一个分析汇总,文中部分内容 ...

最新文章

  1. 超棒整理 | Python 关键字知识点大放送
  2. 风云榜查询名次 接单者与公司对应的数据库语句
  3. 巧用iptables搞定SYN洪水攻击!
  4. linux deepin “debconf: DbDriver “config“: config.dat 被另一个进程锁定:资源暂时不可用“
  5. Swift中switch比较元组类型
  6. JAVA集合(笔记)
  7. java压缩图片等比缩放_java对图片进行压缩和resize缩放的方法
  8. 零基础Python学习方法,Python入门必读
  9. 获取SD卡中的音乐文件
  10. 像拍电影一样做软件(译者序)原创
  11. python写网页flash游戏辅助_会玩 | 使用 Python + Selenium制作Flash游戏辅助
  12. 国内外五款免费的协作类管理软件推荐
  13. java 412_http 412问题
  14. 进行淘宝商品比价的定向爬虫
  15. 企业级自动化运维工具-ansible
  16. 带有数字钥匙的智能电动车已商用
  17. 最好用的 Base64 在线工具
  18. android 监控app 读写,Android端 APP性能监控实践
  19. mysql比较多列最大值_SQL多列查询最大值
  20. 五分钟学GIS | BIM与三维GIS的融合

热门文章

  1. mac系统及xcode使用的SVN客户端安装升级
  2. java 正则出特殊字符_java正则_特殊字符处理
  3. java中哈希表怎么表示_java中HashMap概念是什么?怎么存取实现它?
  4. 美国无人驾驶立法提案将进行投票,有望解除一切封杀
  5. 配置WCF同时支持WSDL和REST,swaggerwcf生成文档
  6. Java Instanceof
  7. CKFinder根据用户设置权限,不同用户有自己的私有的、独立的文件夹
  8. Console-算法[for,if]-一堆桃子和一只猴子
  9. JavaEE的13种核心技术规范
  10. spring aop与strut2的拦截器冲突