有了上一篇文章的诸多准备、我们就能以之为基础实现核感知机和 SVM 了。不过需要指出的是,由于我们实现的 SVM 是一个朴素的版本、所以如果是要在实际任务中应用 SVM 的话,还是应该使用由前人开发、维护并经过长年考验的成熟的库(比如 LibSVM 等);这些库能够处理更大的数据和更多的边值情况、运行的速度也会快上很多,这是因为它们通常都使用了底层语言来实现核心算法、且在算法上也做了许多数值稳定性和数值优化的处理
多分类与支持向量回归
本篇文章将简要说明几种将二分类模型拓展为多分类模型的普适性方法,它们不仅能对前三篇文章叙述的感知机和 SVM 进行应用、同时还能应用于在上一个系列中进行了说明的 AdaBoost 二分类模型;在本篇的第四节(也是最后一节)、我们则会简要地说明一下如何将支持向量机的思想应用在回归问题上
相关数学理论
这篇文章会叙述之前没有解决的纯数学问题,会涉及到相当庞杂的数学概念与思想,其中一些推导的难度相对而言可能会比较大
“支持向量机”小结
- 感知机利用 SGD 能保证对线性可分数据集正确分类(无论学习速率为多少)、但它没怎么考虑泛化能力的问题
- 线性 SVM 通过引入间隔(硬、软)最大化的概念来增强模型的泛化能力
- 核技巧能够将线性算法“升级”为非线性算法,通过将原始问题转化为对偶问题能够非常自然地对核技巧进行应用
- 对于一个二分类模型,有许多方法能够直接将它拓展为多分类问题
- SVM 的思想能用于做回归(SVR);具体而言、SVR 容许模型输出和真值之间存在的差距以期望提高泛化能力
集成学习综述
目前为止我们已经讲过了若干的分类器了。从它们的复杂程度可以感受到,它们有些是比较“强”的、有些是比较“弱”的。这一章我们将会阐述所谓的“强”与“弱”的定义、它们之间的联系以及阐述如何将一个“弱分类器”通过集成学习来集成出一个“强分类器”。而由于集成学习有许多种具体的方法,我们会挑选出其中的随机森林和 AdaBoost 来作比较详细的说明
以下是目录:
“集成”的思想
本文首先会介绍何谓“集成”、然后会介绍两种常见的集成学习方法:Bagging、AdaBoost 的基本定义。这些概念的背后有着深刻的数学理论,但是它们同时也拥有着很好的直观。获得对它们的直观有助于加深对各种模型的分类性能的理解、同时也有助于根据具体的数据集来挑选相应的、合适的模型来进行学习
随机森林算法
由前文讨论可知,我们在实现 RF 算法之前,需要先在决策树模型的生成过程中加一个参数、使得我们能够对特征选取加入随机性。这个过程相当平凡,下给出代码片段以进行粗略的说明。首先在CvDBase
的fit
方法中加入一个参数feature_bound
:
|
|
然后在同一个方法里面、把这个参数传给CvDNode
的fit
方法:
|
|
在CvDNode
的fit
方法中,原始代码中有一个对可选特征空间的遍历:
|
|
根据参数feature_bound
对它加入随机性:
|
|
然后要在同一个方法里面、把feature_bound
传给_gen_children
方法,而在_gen_children
中、再把feature_bound
传给子节点的fit
方法即可
以上所有实现细节可参见这里中的 Tree.py 和 Node.py
有了这些准备,我们就可以来看看 RF 的算法陈述了(以分类问题为例):
AdaBoost 算法
由前文的讨论可知,问题的关键主要在如下两点:
- 如何根据弱模型的表现更新训练集的权重
- 如何根据弱模型的表现决定弱模型的话语权
我们接下来就看看 AdaBoost 算法是怎样解决上述两个问题的。事实上,能够将这两个问题的解决方案有机地糅合在一起、正是 AdaBoost 的巧妙之处之一
集成模型的性能分析
正如前文所说,在实现完 AdaBoost 框架后,我们需要先用 sklearn 中的分类器进行检验、然后再用我们前两章实现的模型进行对比实验。检验的步骤就不在这里详述(毕竟只是一些调试的活),我们在此仅展示在随机森林模型和经过检验的 AdaBoost 模型上进行的一系列的分析
直观起见,我们先采用二维的数据进行实验、并通过可视化来加深对随机森林和 AdaBoost 的理解,然后再用蘑菇数据集做比较贴近现实的实验。为讨论方便,我们一律采用决策树作为 AdaBoost 的弱分类器(亦即采用提升树模型进行讨论)、其强度可以通过调整其最深层数来控制。我们可以利用DataUtil
类来生成或获取原始数据集,其完整代码可参见这里、生成数据集的代码则会在前三节分别放出
对于二维数据,我们拟打算使用三种数据集来进行评估:
- 随机数据集。该数据集主要用于直观地感受模型的分类能力
- 异或数据集。该数据集主要用于直观地理解:
- 集成模型正则化的能力
- 为何说 AdaBoost 不要选用分类能力太强的弱分类器
- 螺旋线数据集,主要用于直观认知随机森林和提升树的不足
AdaBoost 算法的解释
我们前面提到过 Bagging 的数学基础是 Bootstrap 理论、但还没有讲 Boosting 的数学基础。本篇文章拟打算直观地阐述 Boosting 族的代表算法——AdaBoost 算法的解释,由于具体的推导相当繁琐,相关的细节我们会放在相关数学理论里面说明