放假归来的第一文,关于sickit-learn对集成学习Bagging的实现。Bagging字面意思为”装袋法“,更正式的名称为Bootstrap Aggregating,即自助式集成。Bagging算法过程如下:
1、从样本集中有放回的抽样M个样本,约有37%的样本没有机会抽到。
2、用这M个样本训练基分类器C。
3、重复这个过程N次,得到N个基分类器。
4、对于新传入实例A,用这N个新分类器得到一个分类结果的列表。
5、若待分类属性是数值型(回归),求这个列表的算数平均值作为结果返回。
若待分类属性是枚举类型(分类),按这个列表对分类结果进行投票,返回票数最高的。
下面来介绍sklearn中的Bagging分类器——BaggingClassifier。代码如下
导入集成学习包下的BaggingClassifier,同时导入基学习器决策树包。模型主要参数说明如下,未解释参数请参考前面章节。
base_estimator:Object or None。None代表默认是DecisionTree,Object可以指定基学习器,如:LR、SVM、KNN等。
n_estimators:int (default=10)。要集成的基学习器的个数。
max_samples:int or float(default=1.0)。抽取去训练基学习器的样本数量。int 代表抽取数量,float代表抽取比例。
max_features: int or float (default=1.0)。抽取去训练基学习器的特征数量。int 代表抽取数量,float代表抽取比例。
bootstrap: boolean (default=True) 。样本子集的抽样方式(有放回和不放回)
bootstrap_features: boolean(default=False)。特征子集的抽样方式(同上)。
oob_score: boolean。是否使用袋外样本估计泛化误差。默认是不使用。
Bagging能降低模型的方差,可以对抗过拟合。一般而言,Bagging需要使用高方差、不稳定的个体模型。具体到决策树上,就体现在决策树的层数更深。
接下来使用kaggle泰坦尼克数据集演示BaggingClassifier的效果:
如上所说,将基学习器最大深度设为None,让决策树无限生长,这里假设集成30颗树,oob_score=True即使用未拟合决策树的样本(袋外样本)作为测试集评估效果。因此本例不采用交叉验证评估效果。上图显示测试集的得分为0.84。
模型训练好后,可以得到每个基学习器预测的样本标签,如下是第一个。
还可以看到每个分类器抽取的特征编号。原始的Bagging算法只是对样本无放回采样,不会随机抽取特征,但sklearn中的Bagging也实现了对特征的采样。默认(False)是采用无放回抽样,单颗树的特征都不会重复。
还有一个属性是可以打印每个基学习器的模型参数,如下列出了前3个决策树的模型参数,除了随机种子不同其他都一样。
前面提到Bagging最好使用不稳定的弱学习器,下面看一下换成一个强学习器的效果:
袋外测试集得分0.8,低于决策树的0.84,可以看出换成更稳健的逻辑回归并无助于改善性能。
历史文章回顾
领取专属 10元无门槛券
私享最新 技术干货