本文不定期更新。原创文章,转载请注明出处,谢谢。

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器。

算法概述

1、先通过对N个训练样本的学习得到第一个弱分类器;
2、将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;
3、将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器
4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。

与boosting算法比较

1. 使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;   
2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

与Boosting算法不同的是,AdaBoost算法不需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,并且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,这样可以深入挖掘弱分类器算法的能力。

算法步骤

1. 给定训练样本集S,其中X和Y分别对应于正例样本和负例样本;T为训练的最大循环次数;
2. 初始化样本权重为1/n ,即为训练样本的初始概率分布;   
3. 第一次迭代:(1)训练样本的概率分布相当,训练弱分类器;(2)计算弱分类器的错误率;(3)选取合适阈值,使得误差最小;(4)更新样本权重;   
经T次循环后,得到T个弱分类器,按更新的权重叠加,最终得到的强分类器。

具体步骤如下:

一.样本
Given: m examples (x1, y1), …, (xm, ym)
     where xiX, yiY={-1, +1}
     xi表示X中第i个元素,
     yi表示与xi对应元素的属性值,+1表示xi属于某个分类,
                                       -1表示xi不属于某个分类
二.初始化训练样本xi的权重D(i) :i=1,……,m;
    (1).若正负样本数目一致,D1(i) = 1/m
    (2).若正负样本数目m+, m-则正样本D1(i) = 1/m+,
负样本D1(i) = 1/m-

实例详解


图中“+”和“-”表示两种类别。我们用水平或者垂直的直线作为分类器进行分类。

算法开始前默认均匀分布D,共10个样本,故每个样本权值为0.1.

第一次分类:

第一次划分有3个点划分错误,根据误差表达式

 计算可得e1=(0.1+0.1+0.1)/1.0=0.3

分类器权重:

然后根据算法把错分点的权值变大。对于正确分类的7个点,权值不变,仍为0.1,对于错分的3个点,权值为:

D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333

第二次分类:

如图所示,有3个"-"分类错误。上轮分类后权值之和为:0.1*7+0.2333*3=1.3990

分类误差:e2=0.1*3/1.3990=0.2144

分类器权重a2=0.6493

错分的3个点权值为:D2=0.1*(1-0.2144)/0.2144=0.3664

第三次分类:

同上步骤可求得:e3=0.1365 ;a3=0.9223;D3=0.6326

最终的强分类器即为三个弱分类器的叠加,如下图所示:

每个区域是属于哪个属性,由这个区域所在分类器的权值综合决定。比如左下角的区域,属于蓝色分类区的权重为h1 中的0.42和h2 中的0.65,其和为1.07;属于淡红色分类区域的权重为h3 中的0.92;属于淡红色分类区的权重小于属于蓝色分类区的权值,因此左下角属于蓝色分类区。因此可以得到整合的结果如上图所示,从结果图中看,即使是简单的分类器,组合起来也能获得很好的分类效果。

分类器权值调整的原因


由公式可以看到,权值是关于误差的表达式。每次迭代都会提高错分点的权值,当下一次分类器再次错分这些点之后,会提高整体的错误率,这样就导致分类器权值变小,进而导致这个分类器在最终的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占整体的权值更高,让正确率低的分类器权值更低,从而提高最终分类器的正确率。

算法优缺点

优点

1)Adaboost是一种有很高精度的分类器
2)可以使用各种方法构建子分类器,Adaboost算法提供的是框架
3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单
4)简单,不用做特征筛选
5)不用担心overfitting(过度拟合)

缺点

1)容易受到噪声干扰,这也是大部分算法的缺点

2)训练时间过长

3)执行效果依赖于弱分类器的选择

SQL实现

#开始迭代
while(@i<=3) do
set @evalue=0,@temp=0;
set @flag1=0,@flag2=0,@flag3=0,@flag4=0;
set @las=concat('d',@i-1);
set @cur=concat('d',@i);
set @a=concat('select hx,hy into @hx,@hy from hea where id = ',@i);
prepare stmt1 from @a;
execute stmt1;
set @aa=concat('update adaset set ',@cur,' = ',@las);
prepare stmt111 from @aa;
execute stmt111;
#1.分类器为垂直x轴直线
if (@hy=0) then
#处理分类1
set @b=concat('select count(class) into @l_1 from adaset where class="1" and x < ',@hx);
prepare stmt2 from @b;
execute stmt2;
set @c=concat('select count(class) into @l_2 from adaset where class="-1" and x < ',@hx);
prepare stmt3 from @c;
execute stmt3;
if(@l_1=0 and @l_2!=0) then
set @clas=concat('update hea set l=-1 where id = ',@i);
prepare stmt28 from @clas;
execute stmt28;
end if;
if(@l_1!=0 and @l_2 =0) then
set @clas=concat('update hea set l=1 where id = ',@i);
prepare stmt29 from @clas;
execute stmt29;
end if;
set @weight=concat('d',@i-1);
if (@l_1 !=0 and @l_2 !=0 and @l_1>@l_2) then #@l_2是错分点
set @d=concat('select sum(',@weight,') into @temp from adaset where class="-1" and x < ',@hx);
prepare stmt4 from @d;
execute stmt4;
set @evalue=@evalue+@temp;
set @flag1=1;
set @clas=concat('update hea set l=1 where id = ',@i);
prepare stmt20 from @clas;
execute stmt20;
end if;
if (@l_1 !=0 and @l_2 !=0 and @l_1<@l_2) then #@l_1是错分点
set @d=concat('select sum(',@weight,') into @temp from adaset where class="1" and x < ',@hx);
prepare stmt5 from @d;
execute stmt5;
set @evalue=@evalue+@temp;
set @flag2=1;
set @clas=concat('update hea set l=-1 where id = ',@i);
prepare stmt21 from @clas;
execute stmt21;
end if;
#总权值&误差
set @h=concat('select sum(',@weight,') into @temp from adaset');
prepare stmt10 from @h;
execute stmt10;
set @evalue = round(@evalue/@temp,4);
set @avalue = round((0.5*ln((1-@evalue)/@evalue)),4);
set @eee=round((1-@evalue)/@evalue,4);
#更新误差e&假设权重a
set @j=concat('update hea set e = ',@evalue,' ,a = ',@avalue,' where id = ',@i);
prepare stmt11 from @j;
execute stmt11;
#更新错分样本的权重
if (@hy=0) then
if (@flag1=1) then
set @k=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class="-1" and x < ',@hx);
prepare stmt12 from @k;
execute stmt12;
end if;
if (@flag2=1) then
set @m=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class="1" and x < ',@hx);
prepare stmt13 from @m;
execute stmt13;
end if;
if (@flag3=1) then
set @n=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class="-1" and x > ',@hx);
prepare stmt14 from @n;
execute stmt14;
end if;
if (@flag4=1) then
set @o=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class="1" and x > ',@hx);
prepare stmt15 from @o;
execute stmt15;
end if;
end if;
set @i=@i+1;
end while;

以上是博主最近用SQL实现的Adaboost算法的部分代码。数据库表以后整理一下再贴。Ubuntu不稳定啊,死机两次了。。编辑的博客都没了。。累觉不爱。。

个人疑问

上文中的缺点提到,Adaboost算法的效果依赖于弱分类器的选择,那么面对巨大的待分类数据时,如何选择弱分类呢?有没有什么原则。博主依旧在探索中,找到答案的话会在这里更新。

推荐资料:由Adaboost算法创始人Freund和Schapire写的关于Adaboost算法的文档,我已经上传。

原创文章,转载请注明出处,谢谢。

 

Adaboost 2的更多相关文章

  1. boosting、adaboost

    1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...

  2. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

  3. scikit-learn Adaboost类库使用小结

    在集成学习之Adaboost算法原理小结中,我们对Adaboost的算法原理做了一个总结.这里我们就从实用的角度对scikit-learn中Adaboost类库的使用做一个小结,重点对调参的注意事项做 ...

  4. 集成学习之Adaboost算法原理小结

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...

  5. 【十大经典数据挖掘算法】AdaBoost

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...

  6. 机器学习——AdaBoost元算法

    当做重要决定时,我们可能会考虑吸取多个专家而不只是一个人的意见.机器学习处理问题也是这样,这就是元算法(meta-algorithm)背后的思路. 元算法是对其他算法进行组合的一种方式,其中最流行的一 ...

  7. Adaboost\GBDT\GBRT\组合算法

    Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...

  8. AdaBoost算法分析与实现

    AdaBoost(自适应boosting,adaptive boosting)算法 算法优缺点: 优点:泛化错误率低,易编码,可用在绝大部分分类器上,无参数调整 缺点:对离群点敏感 适用数据类型:数值 ...

  9. 7. ensemble learning & AdaBoost

    1. ensemble learning 集成学习 集成学习是通过构建并结合多个学习器来完成学习任务,如下图: 集成学习通过将多个学习学习器进行结合,常可以获得比单一学习器更优秀的泛化性能 从理论上来 ...

  10. 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题

    Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...

随机推荐

  1. WebClient与WebRequest差异

    WebRequst的使用 WebClient和HttpWebRequst是用来获取数据的2种方式,在我的这篇数据访问(2)中主要是讲的WebClient的使用,一般而言,WebClient更倾向于“按 ...

  2. WordCount示例深度学习MapReduce过程(1)

    我们都安装完Hadoop之后,按照一些案例先要跑一个WourdCount程序,来测试Hadoop安装是否成功.在终端中用命令创建一个文件夹,简单的向两个文件中各写入一段话,然后运行Hadoop,Wou ...

  3. [问题2014A02] 解答三(降阶公式法)

    [问题2014A02] 解答三(降阶公式法) 将矩阵 \(A\) 写成如下形式: \[A=\begin{pmatrix} -2a_1 & 0 & \cdots & 0 & ...

  4. Python3基础 print 查看一个列表中存储的所有内容

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  5. DSO转换规则的Aggregation默认为覆盖MOV

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. Key Figure、Exception Aggreagion、Non-Cumulative KeyFigure

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. lua table remove元素的问题

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  8. EasyUi 分页 和 表格数据加载

    这里说明的是将说有数据先返回到前端再由前端去分页,性能可能没有先在后台分好页再返回给前端高 但如果操作不涉及大数据的话也没什么大问题,具体问题具体分析 要使用分页控件首先要声明初始化一下: //设置分 ...

  9. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  10. Deep Learning 17:DBN的学习_读论文“A fast learning algorithm for deep belief nets”的总结

    1.论文“A fast learning algorithm for deep belief nets”的“explaining away”现象的解释: 见:Explaining Away的简单理解 ...