机器学习算法——集成学习

来源:互联网 发布:美国人用淘宝吗 编辑:程序博客网 时间:2024/04/28 18:56
  1. 概念

集成学习是机器中一个非常重要且热门的分支,用多个弱分类器构成一分类器,其哲学思想是三个臭皮匠赛过诸葛亮

  • 为什么要集成?

模型选择:假设各弱分类器间具有一定差异性(如不同的算法,或相参数配置),这会导致生成假设各弱分类器间具有一定差异性(如不同的算法,或相参数配置),这会导致生成类决策边界不同,也就是说它们在时会犯的错误。将结合后能得到更理减少整体错误,实现更好的分类错误。

数据集过大或过小:数据集较大时,可以分为不同的子别进行训练然后再合成类器。

数据集过小时,可使用自举技术( bootstrapping),从原样本集有放回的抽取),从原样本集有放回的抽取 m个子集,训练 m个分器,进行集成。

分治:若决策边界过于复杂,则线性模型不能很好地描述真实情况。因此先训练多个分类器再将它们集成。

数据融合:当有多个不同数据源,且每的特征集抽取方法都时(异构),需要分训练分类器然后再集成

  • 集成学习有效的前提:

每个弱分类器的错误率不能高于0.5;弱分类器之间的性能要有较大的差别,否则集成效果不是很好。

  1. 集成学习常用算法 (Boosting / bagging / stacking)

boosting的弱分类器形成是同一种机器学习算法 只是其数据抽取时的权值在不断更新每次都是提高前一次分错了的数据集的权值,最后得到T个弱分类器,且分类器的权值也跟其中间结果的数据有关。

bagging算法也是用的同一种弱分类器,其数据的来源是用boostrap算法得到的(有放回抽样)。

Stacking算法 分为2层,第一层是用不同的算法形成 T个弱分类器,同时产生一与原数据集大小相同的新数据集,利用这个新数据集和一个新算法构成第二层的分类器。

  • Bagging

bagging也叫自举汇聚法(bootstrapaggregating),是一种在原始数据集上通过有放回抽样重新选出S个新数据集来训练分类器的集成技术。也就是说这些新数据集是允许重复的。使用训练出来的分类器集合来对新样本进行分类,然后用多数投票或者对输出求均值的方法统计所有分类器的分类结果,结果最高的类别即为最终标签。

 

① Bagging又叫自助聚集,是一种根据均匀概率分布从数据中重复抽样(有放回)的技术。

② 每个抽样生成的自助样本集上,训练一个基分类器;对训练过的分类器进行投票,将测试样本指派到得票最高的类中。

③  每个自助样本集都和原数据一样大

④ 有放回抽样,一些样本可能在同一训练集中出现多次,一些可能被忽略。


 

例子:http://blog.csdn.net/qq_30189255/article/details/51532442

 Bagging通过降低基分类器的方差,改善了泛化误差

 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起

 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例

  • Boosting

 boosting是一个迭代的过程,用于自适应地改变训练样本的分布,使得基分类器聚焦在那些很难分的样本上

 boosting会给每个训练样本赋予一个权值,而且可以再每轮提升过程结束时自动地调整权值。开始时,所有的样本都赋予相同的权值1/N,从而使得它们被选作训练的可能性都一样。根据训练样本的抽样分布来抽取样本,得到新的样本集。然后,由该训练集归纳一个分类器,并用它对原数据集中的所有样本进行分类。每轮提升结束时,更新训练集样本的权值。增加被错误分类的样本的权值,减小被正确分类的样本的权值,这使得分类器在随后的迭代中关注那些很难分类的样本。

  • AdaBoost

即Adaptive boosting,是一种迭代算法。每轮迭代中会在训练集上产生一个新的分类器,然后使用该分类器对所有样本进行分类,以评估每个样本的重要性(informative)。 

具体来说,算法会为每个训练样本赋予一个权值。每次用训练完的新分类器标注各个样本,若某个样本点已被分类正确,则将其权值降低;若样本点未被正确分类,则提高其权值。权值越高的样本在下一次训练中所占的比重越大,也就是说越难区分的样本在训练过程中会变得越来越重要。 整个迭代过程直到错误率足够小或达到一定次数为止。

算法思路

输入:分类数据;弱算法组

输出:分类结果

流程:

  1.  给训练数据集中的每一个样本赋予权重,权重初始化相等值,这些权重形成向量 D,一般初始化所有训练样例的权重为 1 / N,其中 N是样例数
  2. 在训练集上训练出弱分类器并计算该分类器的错误率。
  3. 同一数据集上再次训练分类器,调整样本的权重,将第一次分对的样本权重降低,第一次分错的样本权重提高。
  4. 最后给每一个分类器分配一个权重值αα=0.5*ln(1-错误率)/错误率)
  5. 计算出α后,可以对权重向量D进行更新,以使得正确分类的样本权重降低而错分样本的权重升高。D的计算方法如下:


计算出 D之后, AdaBoost又开始进入下一轮迭代。 Adaboost算法会不断地重复训练和调整权的过程,直到训练错误率为 0者弱分类器的数目达到用户指定的值为止。

Adaboost算法优缺点

优点:

1)Adaboost是一种有很高精度的分类器

2)可以使用各种方法构建子分类器, Adaboost算法提供的是框架

3)当使用简单分类器时,计算出的结果是可以理解的,而弱构造及其简单,不用做特征筛选

4)不用担心overfitting(过拟合)问题

Adaboost算法应用场景

1)用于二分类或多的应场景

2)用于做分类任务的 baseline--无脑化,简单不会 overfitting,不用调分类器

3)用于特征选择( feature selection)

4)Boosting框架用于对 badcase的修正 --只需要增加新的分类器 ,不需要变动原有分类器。

Adaboost算法 Python库实现

#Import Libraryfrom sklearn.ensemble import GradientBoostingClassifier#Assumed you have, X(predictor) and Y (target) for training data set and x_test(predictor) oftest_dataset# Create GradientBoosting Classifier objectmodel= GradientBoostingClassifier(n_estimators=100,learning_rate=1.0, max_depth=1, random_state=0)# Train the model using the training sets and check scoremodel.fit(X, y)#Predict Outputpredicted= model.predict(x_test)


 

0 0