机器学习 | 算法笔记- 集成学习(Ensemble Learning)

前言

本系列为机器学习算法的总结和概括,目的为了清晰阐述算法原理,同时附带上手代码实例,便于理解。

目录

   决策树
   线性回归
   K-Means
 
本章为集成学习,简单介绍下Bootstraping, Bagging, Boosting, AdaBoost, RandomForest 和Gradient boosting这些组合型算法.

1.Bootstrapping

Bootstrapping: 名字来自成语“pull up by your own bootstraps”,意思就是依靠你本身的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。其核心思想和基本步骤以下:
html

(1)采用重抽样技术从原始样本中抽取必定数量(本身给定)的样本,此过程容许重复抽样。
(2)根据抽出的样本计算给定的统计量T。
(3)重复上述N次(通常大于1000),获得N个统计量T。
(4)计算上述N个统计量T的样本方差,获得统计量的方差。web

应该说Bootstrap是现代统计学较为流行的一种统计方法,在小样本时效果很好。经过方差的估计能够构造置信区间等,其运用范围获得进一步延伸。算法

2.装袋bagging

装袋算法至关于多个专家投票表决,对于屡次测试,每一个样本返回的是屡次预测结果较多的那个。bootstrap

装袋算法描述api

模型生成
    令n为训练数据的实例数量
    对于t次循环中的每一次
        从训练数据中采样n个实例
        将学习应用于所采样本
        保存结果模型
分类
    对于t个模型的每个
        使用模型对实例进行预测
    返回被预测次数最多的一个

bagging:bootstrap aggregating的缩写。让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中能够出现屡次或根本不出现,训练以后可获得一个预测函数序列网络

最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。app

[训练R个分类器f_i,分类器之间其余相同就是参数不一样。其中f_i是经过从训练集合中(N篇文档)随机取(取后放回)N次文档构成的训练集合训练获得的。对于新文档d,用这R个分类器去分类,获得的最多的那个类别做为d的最终类别。]框架

使用scikit-learn测试bagging方法dom

from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
bagging = BaggingClassifier(KNeighborsClassifier(),
...                      max_samples=0.5, max_features=0.5)

3.提高Boosting与Adaboost

提高算法描述机器学习

模型生成
    赋予每一个训练实例相同的权值
    t次循环中的每一次:
        将学习算法应用于加了权的数据集上并保存结果模型
        计算模型在加了权的数据上的偏差e并保存这个偏差
        结果e等于0或者大于等于0.5:
            终止模型
        对于数据集中的每一个实例:
            若是模型将实例正确分类
                将实例的权值乘以e/(1-e)
        将全部的实例权重进行正常化
分类
    赋予全部类权重为0
    对于t(或小于t)个模型中的每个:
        给模型预测的类加权 -log(e/(1-e))
    返回权重最高的类

这个模型提供了一种巧妙的方法生成一系列互补型的专家。

boosting: 其中主要的是AdaBoost(Adaptive boosting,自适应boosting)。初始化时对每个训练例赋相等的权重1/N,而后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在后续的学习中集中对比较难的训练例进行学习,从而获得一个预测函数序列h1,,hmh1,⋯,hm , 其中h_i也有必定的权重,预测效果好的预测函数权重较大,反之较小。最终的预测函数H对分类问题采用有权重的投票方式,对回归问题采用加权平均的方法对新示例进行判别。

提高算法理想状态是这些模型对于其余模型来讲是一个补充,每一个模型是这个领域的一个专家,而其余模型在这部分却不能表现很好,就像执行官同样要寻觅那些技能和经验互补的顾问,而不是重复的。这与装袋算法有所区分。

 

bagging与boosting的区别

两者的主要区别是取样方式不一样。bagging采用均匀取样,而Boosting根据错误率来取样,所以boosting的分类精度要优于Bagging。bagging的训练集的选择是随机的,各轮训练集之间相互独立,而boostlng的各轮训练集的选择与前面各轮的学习结果有关;bagging的各个预测函数没有权重,而boosting是有权重的;bagging的各个预测函数能够并行生成,而boosting的各个预测函数只能顺序生成。对于象神经网络这样极为耗时的学习方法。bagging可经过并行训练节省大量时间开销。

bagging和boosting均可以有效地提升分类的准确性。在大多数数据集中,boosting的准确性比bagging高。在有些数据集中,boosting会引发退化— Overfit。

Boosting思想的一种改进型AdaBoost方法在邮件过滤、文本分类方面都有很好的性能。

Gradient boosting(又叫Mart, Treenet):Boosting是一种思想,Gradient Boosting是一种实现Boosting的方法,它主要的思想是,每一次创建模型是在以前创建模型损失函数的梯度降低方向损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错。若是咱们的模型可以让损失函数持续的降低,则说明咱们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上降低

使用scikit-learn测试adaboost算法

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
iris = load_iris()
clf = AdaBoostClassifier(n_estimators=100)
scores = cross_val_score(clf, iris.data, iris.target)
scores.mean()                             
0.9...

4.Random Forest

Random Forest: 随机森林,顾名思义,是用随机的方式创建一个森林,森林里面有不少的决策树组成,随机森林的每一棵决策树之间是没有关联的。在获得森林以后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),而后看看哪一类被选择最多,就预测这个样本为那一类。 在创建每一棵决策树的过程当中,有两点须要注意——采样彻底分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行和列的采样。对于行采样,采用有放回的方式,也就是在采样获得的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是所有的样本,使得相对不容易出现over-fitting。而后进行列采样,从M个feature中,选择m个(m << M)。以后就是对采样以后的数据使用彻底分裂的方式创建出决策树,这样决策树的某一个叶子节点要么是没法继续分裂的,要么里面的全部样本的都是指向的同一个分类。通常不少的决策树算法都一个重要的步骤——剪枝,但随机森林不这样作,因为以前的两个随机采样的过程保证了随机性,因此就算不剪枝,也不会出现over-fitting。 按这种算法获得的随机森林中的每一棵都是很弱的,可是你们组合起来就很厉害了。能够这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(由于咱们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了不少个精通不一样领域的专家,对一个新的问题(新的输入数据),能够用不一样的角度去看待它,最终由各个专家,投票获得结果。

Random forest与bagging的区别

(1)Random forest是选与输入样本的数目相同多的次数(可能一个样本会被选取屡次,同时也会形成一些样本不会被选取到),而bagging通常选取比输入样本的数目少的样本;
(2)bagging是用所有特征来获得分类器,而Random forest是须要从所有特征中选取其中的一部分来训练获得分类器; 通常Random forest效果比bagging效果好!

使用scikit-learn测试随机森林算法

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)

5.Gradient boosting

梯度提高树或者梯度提高回归树(GBRT)是任意一个不一样损失函数的泛化。GBRT是一个灵敏的而且高效程序,能够用在回归和分类中。梯度提高树模型在许多领域中都有使用,如web搜索排行榜和社会生态学中。它主要的思想是,每一次创建模型是在以前创建模型损失函数的梯度降低方向。这句话有一点拗口,损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、误差均衡的问题,可是这里就假设损失函数越大,模型越容易出错)。若是咱们的模型可以让损失函数持续的降低,则说明咱们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上降低。

GRBT的优点:

  • 混合数据类型的天然处理
  • 预测力强
  • 健壮的输出空间

Boosting主要是一种思想,表示“知错就改”。而Gradient Boosting是在这个思想下的一种函数(也能够说是模型)的优化的方法,首先将函数分解为可加的形式(其实全部的函数都是可加的,只是是否好放在这个框架中,以及最终的效果如何)。而后进行m次迭代,经过使得损失函数在梯度方向上减小,最终获得一个优秀的模型。值得一提的是,每次模型在梯度方向上的减小的部分,能够认为是一个“小”的或者“弱”的模型,最终咱们会经过加权(也就是每次在梯度方向上降低的距离)的方式将这些“弱”的模型合并起来,造成一个更好的模型。

 

参考:http://www.csuldw.com/2015/07/22/2015-07-22%20%20ensemble/ 

相关文章
相关标签/搜索