From 48ce677e3d77035dbf940feda74f6c31752d7ed9 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 14 Aug 2017 15:30:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20AdaBoost=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84=E6=B3=A8=E8=A7=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/6.支持向量机.md | 8 ++--- docs/7.1.利用AdaBoost元算法提高分类.md | 44 ++++++++++++++------------ docs/7.2.随机森林的使用.md | 2 +- src/python/7.AdaBoost/adaboost.py | 6 ++-- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/docs/6.支持向量机.md b/docs/6.支持向量机.md index 097161d0..e36074ba 100644 --- a/docs/6.支持向量机.md +++ b/docs/6.支持向量机.md @@ -15,7 +15,7 @@ * 注意:`SVM几何含义比较直观,但其算法实现较复杂,牵扯大量数学公式的推导。` ``` -优点:泛化错误率低,计算开销不大,结果易理解。 +优点:泛化(由具体的、个别的扩大为一般的,就是说:模型训练完后的新样本)错误率低,计算开销不大,结果易理解。 缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适合于处理二分类问题。 使用数据类型:数值型和标称型数据。 ``` @@ -47,13 +47,13 @@ This is the simplest kind of SVM (Called an LSVM) Support Vectors are those data 1. 直觉上是安全的 2. 如果我们在边界的位置发生了一个小错误(它在垂直方向上被颠倒),这给我们最小的错误分类机会。 -3. CV很容易,因为该模型对任何非支持向量数据点的去除是免疫的。 +3. CV(Computer Vision 计算机视觉 - 这缩写看着可怕)很容易,因为该模型对任何非支持向量数据点的去除是免疫的。 4. 有一些理论,这是一件好事。 5. 通常它的工作非常好。 ``` * 选择D会比B、C分隔的效果要好很多,原因是上述的5个结论。 -* 所有的点看作地雷吧,那么我们(超平面)得找到最近所有的地雷,并保证我们离它最远。 +* 如果把所有的点看作地雷,那么我们(超平面)得找到最近所有的地雷,并保证我们离它最远。 ![线性可分](/images/6.SVM/SVM_3_linearly-separable.jpg) ### 怎么寻找最大间隔 @@ -70,7 +70,7 @@ This is the simplest kind of SVM (Called an LSVM) Support Vectors are those data * 类别标签用-1、1,是为了后期方便 \\(lable*(w^Tx+b)\\) 的标识和距离计算;如果 \\(lable*(w^Tx+b)>0\\) 表示预测正确,否则预测错误。 * 现在目标很明确,就是要找到`w`和`b`,因此我们必须要找到最小间隔的数据点,也就是前面所说的`支持向量`。 * 也就说,让最小的距离取最大.(最小的距离:就是最小间隔的数据点;最大:就是最大间距,为了找出最优超平面--最终就是支持向量) - * 怎么理解呢? 例如: 所有的点看作地雷吧,那么我们(超平面)得找到最近所有的地雷,并保证我们离它最远。 + * 怎么理解呢? 例如: 如果把所有的点看作地雷,那么我们(超平面)得找到最近所有的地雷,并保证我们离它最远。 * 目标函数:\\(arg: max\ \{min\ [lable*(w^Tx+b)/||w||]\}\\) * 1.如果 \\(lable*(w^Tx+b)>0\\) 表示预测正确,也称`函数间隔`,\\(||w||\\) 可以理解为归一化,也称`几何间隔`,我们始终可以找到一个阈值让 \\(lable*(w^Tx+b)>=1\\) * 2.所以令 \\(lable*(w^Tx+b)=1\\),我们本质上是求 \\(arg: max\{关于w, b\}\ (1/||w||)\\);也就说,我们约束(前提)条件是: \\(lable*(w^Tx+b)=1\\) diff --git a/docs/7.1.利用AdaBoost元算法提高分类.md b/docs/7.1.利用AdaBoost元算法提高分类.md index 75f705c9..a4dca768 100644 --- a/docs/7.1.利用AdaBoost元算法提高分类.md +++ b/docs/7.1.利用AdaBoost元算法提高分类.md @@ -1,4 +1,4 @@ -# 第7章 利用AdaBoost元算法提高分类 +# 第7.1章 利用AdaBoost元算法提高分类 ![利用AdaBoost元算法提高分类](/images/7.AdaBoost/adaboost_headPage.jpg "利用AdaBoost元算法提高分类") @@ -9,7 +9,7 @@ * 概念:是对其他算法进行组合的一种形式。 * 通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。 机器学习处理问题时又何尝不是如此? 这就是元算法(meta-algorithm)背后的思想。 -* 集成方法: 1. 投票选举 2. 再学习 +* 集成方法: 1. 投票选举(bagging) 2. 再学习(boosting) > bagging:基于数据随机重抽样的分类器构造方法 @@ -18,41 +18,45 @@ 2. 每个数据集都是通过在原始数据集中随机选择一个样本来进行替换(替换:意味着可以多次选择同一个样本,也就有重复值)而得到的。 3. 该算法作用的数据集就会得到S个分类器,与此同时,选择分类器投票结果中最多的类别作为最后的分类结果。 4. 例如:随机森林(random forest) -* 追美女:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友 +* 选帅哥:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友 -> boosting +> boosting:是基于所有分类器的加权求和的方法 * boosting是一种与bagging很类似的技术。 * 不过boosting分类的结果是基于所有分类器的加权求和结果的。不论是boosting还是bagging当中,所使用的多个分类器的类型都是一致的。 -* 区别是什么? - 1. bagging:不同的分类器是通过串形训练而获得的,每个新分类器斗根据已训练出的分类器的性能来进行训练。 - 2. boosting:是通过集中关注被已有分类器错分的那些数据来获得新的分类器。 - 3. 由于boosting分类的结果是基于所有分类器的加权求和结果的,因此boosting与bagging不太一样。 - 4. bagging中的分类器权重是相等的,而boosting中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。 * 目前boosting方法最流行的版本是: AdaBoost。 * 追美女:第1个帅哥失败->(传授经验:姓名、家庭情况) 第2个帅哥失败->(传授经验:兴趣爱好、性格特点) 第3个帅哥成功 -## 应用AdaBoost算法 +> bagging 和 boosting 区别是什么? + +1. bagging:不同的分类器是通过串形训练而获得的,每个新分类器斗根据已训练出的分类器的性能来进行训练。 +2. boosting:是通过集中关注被已有分类器错分的那些数据来获得新的分类器。 +3. 由于 boosting 分类的结果是基于所有分类器的加权求和结果的,因此 boosting 与 bagging 不太一样。 +4. bagging 中的分类器权重是相等的,而 boosting 中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。 + +## 应用 AdaBoost 算法 > AdaBoost(adaptive boosting: 自适应boosting) ``` 能否使用弱分类器和多个实例来构建一个强分类器? 这是一个非常有趣的理论问题。 -* 优点:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调节。 +* 优点:泛化(由具体的、个别的扩大为一般的,就是说:模型训练完后的新样本)错误率低,易编码,可以应用在大部分分类器上,无参数调节。 * 缺点:对离群点敏感。 * 适用数据类型:数值型和标称型数据。 ``` -> AdaBoost的一般流程 +> AdaBoost 的一般流程 ``` 收集数据:可以使用任意方法 -准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。当然也可以使用任意分类器作为弱分类器,第2章到第6章中的任一分类器都可以充当弱分类器。作为弱分类器,简单分类器的效果更好。 +准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。 + 当然也可以使用任意分类器作为弱分类器,第2章到第6章中的任一分类器都可以充当弱分类器。 + 作为弱分类器,简单分类器的效果更好。 分析数据:可以使用任意方法。 -训练数据:AdaBoost的大部分时间都用在训练上,分类器将多次在同一数据集上训练弱分类器。 +训练数据:AdaBoost 的大部分时间都用在训练上,分类器将多次在同一数据集上训练弱分类器。 测试数据:计算分类的错误率。 -使用算法:通SVM一样,AdaBoost预测两个类别中的一个。如果想把它应用到多个类别的场景,那么就要像多类SVM中的做法一样对AdaBoost进行修改。 +使用算法:通SVM一样,AdaBoost 预测两个类别中的一个。如果想把它应用到多个类别的场景,那么就要像多类 SVM 中的做法一样对 AdaBoost 进行修改。 ``` * 训练算法: 基于错误提升分类器的性能 @@ -70,15 +74,15 @@ ``` 发现: -alpha目的主要是计算每一个分类器实例的权重(组合就是分类结果) - 分类的权重值:最大的值=alpha的加和,最小值=-最大值 -D的目的是为了计算错误概率: weightedError = D.T*errArr,求最佳分类器 - 特征的权重值:如果一个值误判的几率越小,那么D的特征权重越少 +alpha 目的主要是计算每一个分类器实例的权重(组合就是分类结果) + 分类的权重值:最大的值= alpha 的加和,最小值=-最大值 +D 的目的是为了计算错误概率: weightedError = D.T*errArr,求最佳分类器 + 特征的权重值:如果一个值误判的几率越小,那么 D 的特征权重越少 ``` ![AdaBoost算法权重计算公式](/images/7.AdaBoost/adaboost_alpha.png "AdaBoost算法权重计算公式") -## 完整AdaBoost算法的实现 +## 完整 AdaBoost 算法的实现 整个实现的伪代码如下: diff --git a/docs/7.2.随机森林的使用.md b/docs/7.2.随机森林的使用.md index 5693ed65..04b07c4e 100644 --- a/docs/7.2.随机森林的使用.md +++ b/docs/7.2.随机森林的使用.md @@ -1,4 +1,4 @@ -# 第7章 随机森林的使用(个人补充,非课本内容) +# 第7.2章 随机森林的使用(个人补充,非课本内容) ## 基本介绍 diff --git a/src/python/7.AdaBoost/adaboost.py b/src/python/7.AdaBoost/adaboost.py index 1672f9bd..52effab7 100644 --- a/src/python/7.AdaBoost/adaboost.py +++ b/src/python/7.AdaBoost/adaboost.py @@ -257,9 +257,9 @@ def plotROC(predStrengths, classLabels): plt.show() ''' 参考说明:http://blog.csdn.net/wenyusuran/article/details/39056013 - 为了计算AUC,我们需要对多个小矩形的面积进行累加。这些小矩形的宽度是xStep,因此 - 可以先对所有矩形的高度进行累加,最后再乘以xStep得到其总面积。所有高度的和(ySum)随 - 着x轴的每次移动而渐次增加。 + 为了计算 AUC ,我们需要对多个小矩形的面积进行累加。 + 这些小矩形的宽度是xStep,因此可以先对所有矩形的高度进行累加,最后再乘以xStep得到其总面积。 + 所有高度的和(ySum)随着x轴的每次移动而渐次增加。 ''' print "the Area Under the Curve is: ", ySum*xStep