集成方法:合并随机森林和AdaBoost

This commit is contained in:
jiangzhonglian
2017-08-16 18:52:03 +08:00
parent 731bd56020
commit f7e8303479
5 changed files with 198 additions and 199 deletions

View File

@@ -11,8 +11,7 @@
* 4.) [基于概率论的分类方法:朴素贝叶斯](./docs/4.朴素贝叶斯.md)
* 5.) [Logistic回归](./docs/5.Logistic回归.md)
* 6.) [支持向量机](./docs/6.支持向量机.md)
* 7.1) [利用AdaBoost元算法提高分类](./docs/7.1.利用AdaBoost元算法提高分类.md)
* 7.2) [随机森林的使用(非课本内容)](./docs/7.2.随机森林的使用.md)
* 7.) [集成方法-随机森林和AdaBoost](./docs/7.集成方法-随机森林和AdaBoost.md)
## 第二部分 利用回归预测数值型数据

View File

@@ -2,15 +2,25 @@
![机器学习基础_首页](/images/1.MLFoundation/机器学习基础-首页.jpg)
## 机器学习 概述
`机器学习`就是把无序的数据转换成有用的信息。
1. 获取海量的数据
2. 从海量数据中获取有用的信息
## 机器学习 场景
```
例如:动物猫
模式识别:人通过经验,得到:这个就是猫。
机器学习:人通过大量的书籍来学习,得到:这个就是猫
深度学习:人通过大量的书籍,然后先对书籍内容:文字/图片/视频,进行特征提取,特征强化,降维,得到:这个就是猫。
模式识别(Pattern recognition: 模式识别是最古老的(作为一个术语而言,可以说是很过时的)。
模式识别(pattern recognition: 模式识别是最古老的(作为一个术语而言,可以说是很过时的)。
我们把环境与客体统称为“模式”,识别是对模式的一种认知,是如何让一个计算机程序去做一些看起来很“智能”的事情。
通过融于智慧和直觉后,通过构建程序,识别一些事物,而不是人,例如识别数字。
通过融于智慧和直觉后,通过构建程序,识别一些事物,而不是人,例如: 识别数字。
机器学习machine learning: 机器学习是最基础的(当下初创公司和研究实验室的热点领域之一)。
在90年代初人们开始意识到一种可以更有效地构建模式识别算法的方法那就是用数据可以通过廉价劳动力采集获得去替换专家具有很多图像方面知识的人
“机器学习”强调的是,在给计算机程序(或者机器)输入一些数据后,它必须做一些事情,那就是学习这些数据,而这个学习的步骤是明确的。
@@ -33,13 +43,8 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
* 邮局邮寄,手写软件自动识别寄送贺卡的地址。
* 申请贷款 或 进入赌场,通过你最近的金融活动信息进行综合评定,决定你是否合格。
## 机器学习的简单概述
`机器学习`就是把无序的数据转换成有用的信息;机器学习将有助于我们穿越数据雾霾,从中抽取出有用的信息。
* 1.获取海量的数据
* 2.从海量数据中获取有用的信息
## 机器学习的主要任务
## 机器学习 主要任务
> 机器学习的主要任务就是分类和回归
@@ -49,8 +54,8 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
* 目标变量是机器学习预测算法的测试结果。
* 在分类算法中目标变量的类型通常是标称型(如:真与假),而在回归算法中通常是连续型(如1~100)。
* 机器学习的训练过程
* ![机器学习训练过程图](/images/1.MLFoundation/机器学习基础训练过程.png)
* 机器学习的训练过程<br/>
![机器学习训练过程图](/images/1.MLFoundation/机器学习基础训练过程.png)
> 监督学习
@@ -61,9 +66,9 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
* 特征(feature-是否有缺失情况) + 目标变量(分类-离散值<A/B/C、 是/否>/回归-连续值<0~100、 -999999>)
* 特征或者属性通常是训练样本集的列,它们是独立测量得到的结果,多个特征联系在一起共同组成一个训练样本。
* `知识表示`(例如-机器已经学会如何识别鸟类的过程)
* 1.可以采用规则集的形式【例如数学成绩大于90分为优秀】
* 2.可以采用概率分布的形式【例如通过统计分布发现90%的同学数学成绩在70分以下那么大于70分定为优秀】
* 3.可以使用训练样本集中的一个实例【例如:通过样本集合,我们训练出一个模型实例,得出 年轻,数学成绩中高等,谈吐优雅,我们认为是优秀】
1. 可以采用规则集的形式【例如数学成绩大于90分为优秀】
2. 可以采用概率分布的形式【例如通过统计分布发现90%的同学数学成绩在70分以下那么大于70分定为优秀】
3. 可以使用训练样本集中的一个实例【例如:通过样本集合,我们训练出一个模型实例,得出 年轻,数学成绩中高等,谈吐优雅,我们认为是优秀】
> 非监督学习
@@ -76,17 +81,22 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
![算法汇总](/images/1.MLFoundation/ml_algorithm.jpg)
## 学习机器学习
* 选择算法需要考虑的两个问题
* 使用机器学习算法的目的
* 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。
* 需要分析或收集的数据是什么
* 举例
* ![选择算法图](/images/1.MLFoundation/机器学习基础-选择算法.jpg)
## 机器学习 学习
> 选择算法需要考虑的两个问题
1. 使用机器学习算法的目的
* 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。
2. 需要分析或收集的数据是什么
> 举例
![选择算法图](/images/1.MLFoundation/机器学习基础-选择算法.jpg)
> 机器学习 开发步骤
```
开发机器学习应用程序的步骤
* 收集数据: 收集样本数据
* 准备数据: 注意数据的格式
* 分析数据: 为了确保数据集中没有垃圾数据;
@@ -97,7 +107,8 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
* 使用算法: 将机器学习算法转为应用程序
```
## Python语言的优势
## Python语言 优势
1. 可执行伪代码
2. Python比较流行使用广泛、代码范例多、丰富模块库开发周期短
@@ -107,6 +118,7 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
* 科学函数库:`SciPy``NumPy`(底层语言C和Fortran)
* 绘图工具库:`Matplotlib`
* * *
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [1988](http://www.apache.wiki/display/~lihuisong)**

View File

@@ -1,137 +0,0 @@
# 第7.1章 利用AdaBoost元算法提高分类
![利用AdaBoost元算法提高分类](/images/7.AdaBoost/adaboost_headPage.jpg "利用AdaBoost元算法提高分类")
## 组合相似的分类器来提高分类性能
> 元算法(meta-algorithm) 或 集成方法(ensemble method)
* 概念:是对其他算法进行组合的一种形式。
* 通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。
机器学习处理问题时又何尝不是如此? 这就是元算法(meta-algorithm)背后的思想。
* 集成方法: 1. 投票选举(bagging) 2. 再学习(boosting)
> bagging基于数据随机重抽样的分类器构造方法
* 自举汇聚法(bootstrap aggregating)也称为bagging方法是在从原始数据集选择S次后得到S个新数据集的一种技术。
1. 新数据集和原数据集的大小相等。
2. 每个数据集都是通过在原始数据集中随机选择一个样本来进行替换(替换:意味着可以多次选择同一个样本,也就有重复值)而得到的。
3. 该算法作用的数据集就会得到S个分类器与此同时选择分类器投票结果中最多的类别作为最后的分类结果。
4. 例如:随机森林(random forest)
* 选帅哥:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友
> boosting是基于所有分类器的加权求和的方法
* boosting是一种与bagging很类似的技术。
* 不过boosting分类的结果是基于所有分类器的加权求和结果的。不论是boosting还是bagging当中所使用的多个分类器的类型都是一致的。
* 目前boosting方法最流行的版本是 AdaBoost。
* 追美女第1个帅哥失败->(传授经验:姓名、家庭情况) 第2个帅哥失败->(传授经验:兴趣爱好、性格特点) 第3个帅哥成功
> bagging 和 boosting 区别是什么?
1. bagging不同的分类器是通过串形训练而获得的每个新分类器斗根据已训练出的分类器的性能来进行训练。
2. boosting是通过集中关注被已有分类器错分的那些数据来获得新的分类器。
3. 由于 boosting 分类的结果是基于所有分类器的加权求和结果的,因此 boosting 与 bagging 不太一样。
4. bagging 中的分类器权重是相等的,而 boosting 中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。
## 应用 AdaBoost 算法
> AdaBoost(adaptive boosting: 自适应boosting)
```
能否使用弱分类器和多个实例来构建一个强分类器? 这是一个非常有趣的理论问题。
* 优点:泛化(由具体的、个别的扩大为一般的,就是说:模型训练完后的新样本)错误率低,易编码,可以应用在大部分分类器上,无参数调节。
* 缺点:对离群点敏感。
* 适用数据类型:数值型和标称型数据。
```
> AdaBoost 的一般流程
```
收集数据:可以使用任意方法
准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。
当然也可以使用任意分类器作为弱分类器第2章到第6章中的任一分类器都可以充当弱分类器。
作为弱分类器,简单分类器的效果更好。
分析数据:可以使用任意方法。
训练数据AdaBoost 的大部分时间都用在训练上,分类器将多次在同一数据集上训练弱分类器。
测试数据:计算分类的错误率。
使用算法通SVM一样AdaBoost 预测两个类别中的一个。如果想把它应用到多个类别的场景,那么就要像多类 SVM 中的做法一样对 AdaBoost 进行修改。
```
* 训练算法: 基于错误提升分类器的性能
* 基于单层决策树构建弱分类器
* 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。
* 过拟合(overfitting, 也称为过学习)
* 发现测试错误率在达到一个最小值之后有开始上升,这种现象称为过拟合。
* ![过拟合](/images/7.AdaBoost/过拟合.png)
> AdaBoost的算法示意图
![AdaBoost算法示意图](/images/7.AdaBoost/adaboost_illustration.png "AdaBoost算法示意图")
> 训练算法:基于错误提升分类器的性能
```
发现:
alpha 目的主要是计算每一个分类器实例的权重(组合就是分类结果)
分类的权重值:最大的值= alpha 的加和,最小值=-最大值
D 的目的是为了计算错误概率: weightedError = D.T*errArr求最佳分类器
特征的权重值:如果一个值误判的几率越小,那么 D 的特征权重越少
```
![AdaBoost算法权重计算公式](/images/7.AdaBoost/adaboost_alpha.png "AdaBoost算法权重计算公式")
## 完整 AdaBoost 算法的实现
整个实现的伪代码如下:
```
对每次迭代:
利用buildStump()函数找到最佳的单层决策树
将最佳单层决策树加入到单层决策树数组
计算alpha
计算新的权重向量D
更新累计类别估计值
如果错误率等于0.0,则退出循环
```
![AdaBoost代码流程图](/images/7.AdaBoost/adaboost_code-flow-chart.jpg "AdaBoost代码流程图")
## 处理非均衡分类问题
> 概念
在分类器训练时,正例数目和反例数目不相等(相差很大)
> 非均衡现象:
* 判断马是否能继续生存(不可误杀)
* 过滤垃圾邮件(不可漏判)
* 不能放过传染病的人
* 不能随便认为别人犯罪
> ROC评估方法
* ROC曲线: 最佳的分类器应该尽可能地处于左上角
* ![ROC曲线](/images/7.AdaBoost/ROC曲线.png)
* 对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC).
* AUC给出的是分类器的平均性能值当然它并不能完全代替对整条曲线的观察。
* 一个完美分类器的AUC为1而随机猜测的AUC则为0.5。
> 代价函数
* 基于代价函数的分类器决策控制:`TP*(-5)+FN*1+FP*50+TN*0`
* ![代价函数](/images/7.AdaBoost/代价函数.png)
> 抽样
* 欠抽样(undersampling)或者过抽样(oversampling)
* 欠抽样: 意味着删除样例
* 过抽样: 意味着复制样例(重复使用)
* * *
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**

View File

@@ -1,38 +0,0 @@
# 第7.2章 随机森林的使用(个人补充,非课本内容)
## 基本介绍
* 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。
* 决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。但是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林就是希望构建多个臭皮匠,希望最终的分类效果能够超过单个大师的一种算法。
## 构造流程
* 那随机森林具体如何构建呢?有两个方面:数据的随机性选取,以及待选特征的随机选取。
> 数据的随机选取:
```
首先,从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。
最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。
如下图假设随机森林中有3棵子决策树2棵子树的分类结果是A类1棵子树的分类结果是B类那么随机森林的分类结果就是A类。
```
![数据重抽样](/images/7.RandomForest/数据重抽样.jpg)
> 待选特征的随机选取
```
与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。
下图中蓝色的方块代表所有可以被选择的特征也就是目前的待选特征。黄色的方块是分裂特征。左边是一棵决策树的特征选取过程通过在待选特征中选取最优的分裂特征别忘了前文提到的ID3算法C4.5算法CART算法等等完成分裂。右边是一个随机森林中的子树的特征选取过程。
```
![特征重抽样](/images/7.RandomForest/特征重抽样.jpg)
> 随机森林-流程图
![随机森林-流程图](/images/7.RandomForest/RandomForest_Flow.jpg)
* * *
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**

View File

@@ -0,0 +1,163 @@
# 第7章 集成方法 ensemble method
![利用AdaBoost元算法提高分类](/images/7.AdaBoost/adaboost_headPage.jpg "利用AdaBoost元算法提高分类")
## 集成方法: ensemble method元算法: meta algorithm 概述
* 概念:是对其他算法进行组合的一种形式。
* 通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。
机器学习处理问题时又何尝不是如此? 这就是元算法(meta-algorithm)背后的思想。
* 集成方法:
1. 投票选举(bagging: 自举汇聚法 bootstrap aggregating): 是基于数据随机重抽样的分类器构造方法
2. 再学习(boosting): 是基于所有分类器的加权求和的方法
> bagging 和 boosting 区别是什么?
1. bagging 是一种与 boosting 很类似的技术, 所使用的多个分类器的类型(数据量和特征量)都是一致的。
2. bagging 是由不同的分类器1.数据随机的 2.特征随机的训练综合得出的出现最多分类结果boosting 是通过调整已有分类器错分的那些数据来获得新的分类器,得出目前最优的结果。
3. bagging 中的分类器权重是相等的;而 boosting 中的分类器加权求和,所以权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。
## 集成方法 场景
目前 bagging 方法最流行的版本是: 随机森林(random forest)
选帅哥:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友
目前 boosting 方法最流行的版本是: AdaBoost
追美女第1个帅哥失败->(传授经验:姓名、家庭情况) 第2个帅哥失败->(传授经验:兴趣爱好、性格特点) 第3个帅哥成功
## 随机森林
### 随机森林 概述
* 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。
* 决策树相当于一个大师,通过自己在数据集中学到的知识用于新数据的分类。但是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林就是希望构建多个臭皮匠,希望最终的分类效果能够超过单个大师的一种算法。
### 随机森林 原理
那随机森林具体如何构建呢?<br/>
有两个方面:<br/>
1. 数据的随机性化<br/>
2. 待选特征的随机化<br/>
使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。
> 数据的随机化:使得随机森林中的决策树更普遍化一点,适合更多的场景。
1. 采取有放回的抽样方式 构造子数据集,保证不同子集之间的数量级一样(不同子集/同一子集 之间的元素可以重复)
2. 利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。
3. 然后统计子决策树的投票结果,得到最终的分类 就是 随机森林的输出结果。
4. 如下图假设随机森林中有3棵子决策树2棵子树的分类结果是A类1棵子树的分类结果是B类那么随机森林的分类结果就是A类。
![数据重抽样](/images/7.RandomForest/数据重抽样.jpg)
> 待选特征的随机化
1. 子树从所有的待选特征中随机选取一定的特征。
2. 在选取的特征中选取最优的特征。
下图中,蓝色的方块代表所有可以被选择的特征,也就是目前的待选特征;黄色的方块是分裂特征。<br/>
左边是一棵决策树的特征选取过程通过在待选特征中选取最优的分裂特征别忘了前文提到的ID3算法C4.5算法CART算法等等完成分裂。<br/>
右边是一个随机森林中的子树的特征选取过程。<br/>
![特征重抽样](/images/7.RandomForest/特征重抽样.jpg)
### 项目实战: 随机森林
![随机森林](/images/7.RandomForest/RandomForest_Flow.jpg)
## AdaBoost
### AdaBoost (adaptive boosting: 自适应 boosting) 概述
`能否使用弱分类器和多个实例来构建一个强分类器? 这是一个非常有趣的理论问题。`
### AdaBoost 原理
> AdaBoost 工作原理
![AdaBoost 工作原理](/images/7.AdaBoost/adaboost_illustration.png "AdaBoost 工作原理")
> AdaBoost 一般流程
```
收集数据:可以使用任意方法
准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。
当然也可以使用任意分类器作为弱分类器第2章到第6章中的任一分类器都可以充当弱分类器。
作为弱分类器,简单分类器的效果更好。
分析数据:可以使用任意方法。
训练数据AdaBoost 的大部分时间都用在训练上,分类器将多次在同一数据集上训练弱分类器。
测试数据:计算分类的错误率。
使用算法通SVM一样AdaBoost 预测两个类别中的一个。如果想把它应用到多个类别的场景,那么就要像多类 SVM 中的做法一样对 AdaBoost 进行修改。
```
> AdaBoost 算法特点
```
* 优点:泛化(由具体的、个别的扩大为一般的)错误率低,易编码,可以应用在大部分分类器上,无参数调节。
* 缺点:对离群点敏感。
* 适用数据类型:数值型和标称型数据。
```
### 项目实战: 马疝病的预测
![AdaBoost代码流程图](/images/7.AdaBoost/adaboost_code-flow-chart.jpg "AdaBoost代码流程图")
* 基于单层决策树构建弱分类器
* 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。
* 过拟合(overfitting, 也称为过学习)
* 发现测试错误率在达到一个最小值之后有开始上升,这种现象称为过拟合。
![过拟合](/images/7.AdaBoost/过拟合.png)
> 训练算法:基于错误提升分类器的性能
```
发现:
alpha 目的主要是计算每一个分类器实例的权重(组合就是分类结果)
分类的权重值:最大的值= alpha 的加和,最小值=-最大值
D 的目的是为了计算错误概率: weightedError = D.T*errArr求最佳分类器
特征的权重值:如果一个值误判的几率越小,那么 D 的特征权重越少
```
![AdaBoost算法权重计算公式](/images/7.AdaBoost/adaboost_alpha.png "AdaBoost算法权重计算公式")
### 优化评估: 处理非均衡分类问题
`在分类器训练时,正例数目和反例数目不相等(相差很大)`
> 非均衡现象:
* 判断马是否能继续生存(不可误杀)
* 过滤垃圾邮件(不可漏判)
* 不能放过传染病的人
* 不能随便认为别人犯罪
> ROC 评估方法
* ROC 曲线: 最佳的分类器应该尽可能地处于左上角
* ![ROC曲线](/images/7.AdaBoost/ROC曲线.png)
* 对不同的 ROC 曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC).
* AUC 给出的是分类器的平均性能值,当然它并不能完全代替对整条曲线的观察。
* 一个完美分类器的 AUC 为1而随机猜测的 AUC 则为0.5。
> 代价函数
* 基于代价函数的分类器决策控制:`TP*(-5)+FN*1+FP*50+TN*0`
![代价函数](/images/7.AdaBoost/代价函数.png)
> 抽样
* 欠抽样(undersampling)或者过抽样(oversampling)
* 欠抽样: 意味着删除样例
* 过抽样: 意味着复制样例(重复使用)
* * *
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**