目录html
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
集成学习(ensemnle learning)经过构建并结合多个学习器来完成学习任务,集成学习能够用于分类问题集成、回归问题集成、特征选取集成、异常点检测集成等等。算法
# 集成学习基础引入图例 import matplotlib.pyplot as plt import matplotlib.patches as patches from matplotlib.font_manager import FontProperties %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc', size=15) fig1 = plt.figure() ax1 = fig1.add_subplot(111, aspect='equal') ax1.add_patch(patches.Rectangle((1, 1), 5, 1.5, color='b')) plt.text(2.6, 3.5, s='$\cdots$', fontsize=30) ax1.add_patch(patches.Rectangle((1, 5), 5, 1.5, color='b')) ax1.add_patch(patches.Rectangle((1, 7), 5, 1.5, color='b')) plt.text(3.5, 7.5, s='个体学习器$_1$', fontsize=20, color='white', ha='center', fontproperties=font) plt.text(3.5, 5.5, s='个体学习器$_2$', fontsize=20, color='white', ha='center', fontproperties=font) plt.text(3.5, 1.5, s='个体学习器$_T$', fontsize=20, color='white', ha='center', fontproperties=font) plt.annotate(s='', xytext=(6, 7.8), xy=(8, 4.7), arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color='orange')) plt.annotate(s='', xytext=(6, 5.8), xy=(8, 4.2), arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color='orange')) plt.annotate(s='', xytext=(6, 1.7), xy=(8, 4.0), arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color='orange')) ax1.add_patch(patches.Rectangle((8, 3.4), 4, 2, color='g')) plt.text(10, 4.2, s='结合模块', fontsize=20, color='white', ha='center', fontproperties=font) plt.annotate(s='', xytext=(12, 4.2), xy=(13, 4.2), arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color='orange')) ax1.add_patch(patches.Rectangle((13, 3.4), 4, 2, color='purple')) plt.text(15, 4.2, s='强学习器', fontsize=20, color='white', ha='center', fontproperties=font) plt.annotate(s='', xytext=(17, 4.2), xy=(18, 4.2), arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color='orange')) plt.text(19, 4, s='输出', fontsize=20, color='r', ha='center', fontproperties=font) plt.xlim(0, 20) plt.ylim(0, 10) plt.show()
如上图所示,集成学习能够理解成,若干个个体学习器,经过结合策略构造一个结合模块,造成一个强学习器。其中全部的个体学习器中,能够是相同类型也能够是不一样类型的个体学习器。bootstrap
所以为了得到强学习器,咱们首先得得到若干个个体学习器,以后选择一种较好的结合策略。网络
上一节咱们讲到,构造强学习器的全部个体学习器中,个体学习器能够是相同类型的也能够是不一样类型的,对于相同类型的个体学习器,这样的集成是同质(homogeneous)的,例如决策树集成中全是决策树,神经网络集成中全是神经网络;对于不一样类型的个体学习器,这样的集成是异质(heterogenous)的,例如某个集成中既含有决策树,又含有神经网络。数据结构
目前最流行的是同质集成,在同质集成中,使用最多的模型是CAR\(T\)决策树和神经网络,而且个体学习器在同质集成中也被称为弱学习器(weak learner)。按照同质弱学习器之间是否存在依赖关系能够将同质集成分类两类:第一个是弱学习器之间存在强依赖关系,一系列弱学习器基本都须要串行生成,表明算法是Boosting系列算法;第二个是弱学习器之间没有较强的依赖关系,一系列弱学习器能够并行生成,表明算法是Bagging和随机森林(random forest)系列算法。dom
Boosting是一种可将弱学习器提高为强学习器的算法。它的工做机制为:先从初始训练集中训练出一个弱学习器,再根据弱学习器的表现对训练样本分布进行调整,使得先前弱学习器训练错误的样本权重变高,即让错误样本在以后的弱学习器中受到更多关注,而后基于调整后的样本分布来训练下一个弱学习器。机器学习
不断重复上述过程,直到弱学习器数达到事先指定的数目\(T\),最终经过集合策略整合这\(T\)个弱学习器,获得最终的强学习器。学习
Boosting系列算法中最著名的算法有AdaBoost算法和提高树(boosting tree)系列算法,提高树系列算法中应用最普遍的是梯度提高树(gradient boosting tree)。测试
Boosting因为每个弱学习器都基于上一个弱学习器,所以它的误差较小,即模型拟合能力较强,可是模型泛化能力会稍差,即方差偏大,而Boosgting则是须要选择一个能减少方差的学习器,通常选择较简单模型,如选择深度很浅的决策树。
Boosting的弱学习器之间是有依赖关系的,而Bagging的弱学习器之间是没有依赖关系的,所以它的弱学习器是并行生成。
Bagging的弱学习器的训练集是经过随机采样获得的。经过\(T\)次的随机采样,咱们能够经过自主采样法(bootstrap sampling)获得\(T\)个采样集,而后对于这\(T\)个采样集独立的训练出\(T\)个弱学习器,以后咱们经过某种结合策略将这\(T\)个弱学习器构形成一个强学习器。
Bagging系列算法中最著名的算法有随机森林,可是随机森林能够说是一个进阶版的Bagging算法,虽然随机森林的弱学习器都是决策树,可是随机森林在Baggin的样本随机采样的基础上,又进行了特征的随机选择。
Bagging因为经过随机采样得到数据,所以它的方差较小,即模型泛化能力较强,可是模型拟合能力较弱,即误差偏大,而Bagging则是须要选择一个能减少误差的学习器,通常选择较复杂模型,如选择深度很深的决策树或不剪枝的决策树。
给定包含\(m\)个样本的数据集,咱们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样通过\(m\)次随机采样操做,咱们能获得包含\(m\)个样本的采样集。
构造强学习器除了须要使用若干个弱学习器以外,还须要选择某种结合策略,接下来咱们将讲平均法、投票法和学习法三种结合策略。
假设集成包含\(T\)个弱学习器\(\{h_1,h_2,\cdots,h_T\}\),其中\(h_i\)在实例\(X\)上的输出为\(h_i(X)\)。
平均法通常用于解决数值类的回归问题,即对\(T\)个弱学习器的输出求平均值做为最终的输出。
投票法通常用于解决分类问题,假设咱们须要预测的类别为\(\{c_1,c_2,\cdots,c_K\}\),对于样本\(X\)上的输出表示为一个\(K\)维向量\((h_i^1(X);h_i^2(X);\cdots;h_i^K(X))\),其中\(h_i^j(X)\)是\(h_i\)在类别标记\(c_j\)上的输出。
平均法和投票法相比较学习法都很简单,而且他们的偏差较大,而学习法相比较则偏差较小。
学习法中的表明方法是Stacking,当使用Stacking的结合策略时,咱们再也不是对弱学习器的结果作简单的处理,而是再加上一层学习器,与此同时,咱们把个体学习器称为初级学习器,额外加上的学习器称为次级学习器或元学习器(meta-learner)。
Stacking结合策略能够这样理解:对于训练集,咱们将初级学习器对训练集的学习结果做为次级学习器的输入,将训练集的标记仍当作样例标记,从新训练一个次级学习器获得最终结果;对于测试集,咱们首先用初级学习器预测一次,获得次级学习器的输入样本,再用次级学习器预测一次,获得最终的预测结果。
集成学习能够简单的认为经过某种结合策略将多个弱学习器构形成一个强学习器,奥卡姆剃刀原则——简单其实就是最好的。那为何要花这么大的功夫把弱学习器结合成强学习器呢?至于构造的强学习器能有什么优势,接下来将会逐一介绍。