集成学习

简单投票

hard Voting Classifier

from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimaters=[('clf1',obj1),('clf2',obj2),('clf3',obj3)],
                              voting = 'hard')

soft Voting Classifier

有时少数服从多数并不一定是正确的,更合理的投票是应该有权值的。
一种常用的方法是计算各个分类的概率均值,而不是计算各个分类的个数。

例如
clf1:A-85%,B-15%
clf2:A-40%,B-60%
clf3:A-44%,B-56%
clf4:A-49%,B-51%
clf5:A-99%,B-1%
五个模型,其中1、5预测为A类,而2、3、4预测为B类,若完全依据投票,预测结果应当为B。
但是可以明显看出来2、3、4中分类为B的概率并不高,而1、5中分类为A的概率非常高分别为85%和99%。
这5个模型分类为A的概率均值为(85+40+44+49+99)/5=65.4%,B为35.6,因此应当预测为A。

Bagging、Pasting

虽然使用投票的方法进行集成学习是可以取得很好的效果的,但是一个很大的问题是用于投票的模型其实还是不够(例如上面代码及示例中只有3、5个模型),因此我们需要创建更多的(子)模型。
一个简单的思路就是,创建某一种算法下的多个子模型,每个子模型只使用数据的一部分进行训练。例如数据有1000个,我们用svm算法训练100个模型,每个模型只(随机)看100条数据。
优势:每个子模型不需要太高的准确率(概率论原理)!例如有500个子模型,每个子模型的准确率是60%,他们组合起来的准确率有99.9%

放回取样-Bagging(更常用)

  • 因为是放回取样,因此子模型数量不受数据量限制,可以训练更多的子模型。
  • 相比Pasting而言,Pasting由于不放回,相当于是将数据切割成了几部分进行训练。此时数据怎么分将会严重影响到模型的效果,即Pasting严重依赖于随机性。

不放回取样-Pasting

统计学中放回和不放回一般称为:bootstrap。而在sklearn中,控制放回还是不放回取样其实也是修改bootstrap参数。

sklearn中的Bagging和Pasting

#因为多模型做voting时,最好是使用差异性较大的模型,
#而决策树这种无参模型天然就适合做子模型投票
from sklearn.tree import DescessionTreeClassifier
from sklearn.ensemble import BaggingClassifier
#sklearn中靠boostrap一个参数决定是bagging放回取样还是pasting不放回取样
bagging_clf  = BaggingClassifier(DescessionTreeClassifier(),
                                  n_estimators = 500,
                                  max_sample = 100,
                                  bootstrap=True)

OOB问题

Out-of-Bag是意思是,由于在放回取样时,每次仍然是采取随机抽样的方式进行选取数据进行学习。根据统计,平均大约37%的数据在整个训练过程中是没有被选择到的。
因此,我们就不再进行train-test-split分割数据,而是直接进行训练,训练完后将未参与训练的数据视为test-data,进行测试或评估。sklearn中可以直接使用oob_score_表示剩余数据的得分情况。

from sklearn.tree import DescessionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf  = BaggingClassifier(DescessionTreeClassifier(),
                                  n_estimators = 500,
                                  max_sample = 100,
                                  bootstrap=True,
                                  oob_score=True)

并行计算

根据Bagging和Pasting的特点,我们是可以并行计算各个子模型的。可以使用n_jobs指定计算调用的cpu数量。

其他相关讨论

Bootstrap Features

除了对数据进行取样,还可以对特征进行取样,即Random Subspaces,这种方式一般只在特征较多的时候可以使用。
还可以在特征和数据两个方向进行随机取样,即Random Patches。

”“”假设样本只有500个“”“
random_subspaces_clf  = BaggingClassifier(DescessionTreeClassifier(),
                                  n_estimators = 500,#500个子模型
                                  max_sample = 500,#每个模型使用500个数据进行训练
                                  bootstrap=True,#放回取样
                                  oob_score=True,#使用oob进行评估
                                  max_features = 1, #对特征随机采样
                                  bootstrap_features = True #采用放回的方式对特征随机采样
)


”“”假设样本只有500个“”“
random_patches_clf  = BaggingClassifier(DescessionTreeClassifier(),
                                  n_estimators = 500,#500个子模型
                                  max_sample = 100,#每个模型使用100个数据进行训练
                                  bootstrap=True,#放回取样
                                  oob_score=True,#使用oob进行评估
                                  max_features = 1, #对特征随机采样
                                  bootstrap_features = True #采用放回的方式对特征随机采样
)

Boosting

Voting是多个互不相关的模型最终合并生成一个模型。而Boosting是每个模型都尝试增强整体的效果,即多个模型叠加生成最终的模型,不同模型之间是存在关系的。

AdaBoosting

AdaBoosting是在一个模型的基础上,评估预测结果准确情况并修改数据的学习权重,将附加上权值属性的数据点应用到下一个模型。依次迭代学习,形成最终的模型。

GradientBoosting

模型拟合会出现正确预测的部分和错误预测的部分,我们将错误预测部分的数据提出来,(在新的模型上)进行再一次拟合,同样会出现正确的部分和错误的部分。这样不断的将错误部分提出重新进行拟合并生成新的模型,最后将各个模型叠加起来的方式就是GrandientBoosting。

Staking

类似于Voting,生成多个子模型。不同于Voting直接进行投票,Stacking会将这些子模型的输出作为另外一个模型(上层模型)的输入,并对这个模型进行训练,将这个上层模型作为最终输出。
具体方法是:将训练数据分为两个数据集,其中一个数据集进行常规的子模型训练,另外一个数据集输入到这些子模型中,将这些子模型的输出作为另外一个新模型的输入,训练这个新的模型。即最终模型数量为子模型数量+1。
扩展:除了可以子模型的输出作为另外一个新模型的输入这种两层stacking,还可以形成更多的stacking,甚至是第二层里这些子模型的输入不是输入到一个新的模型中,而是输入到多个新模型中,形成一个网络结构等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容