简单投票
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,甚至是第二层里这些子模型的输入不是输入到一个新的模型中,而是输入到多个新模型中,形成一个网络结构等。