集成学习(Ensemble Learning)是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。如图3-3所示,集成学习的思路是在对新的实例进行分类的时候,把若干个单个分类器集成起来,通过对多个分类器的分类结果进行某种组合来决定最终的分类,以取得比单个分类器更好的性能。如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。如果使用的分类器相同,称为同质,分类器不同则称为异质。常见的综合判断策略包括加权平均和投票两种。
图3-3 集成学习基本原理
集成学习粗略可以分为两类:第一类是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是Boosting系列算法;第二类是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是Bagging和随机森林(Random Forest)系列算法。本章以分类问题为例来介绍常见的Boosting算法和Bagging算法。
Boosting算法的原理是在训练集用初始权重训练出一个分类器,根据分类器的表现来更新训练样本的权重,使得那些错误率高的样本在后面的训练中得到更多的重视。如此重复进行,直到分类器的数量达到事先指定的数目,最终将全部分类器通过集合策略进行整合,得到新的分类器。
Boosting系列算法里最著名算法主要有AdaBoost算法和GBDT(梯度提升决策树,Gradient Boosting Decision Tree)算法,我们以AdaBoost和GBDT为例,介绍在Scikit-Learn中的使用方法。
以AdaBoost为例,数据集依然使用随机生成的数据,使用AdaBoostClassifier分类器,分类器个数设置为100,代码如下:
x, y = datasets.make_classification(n_samples=1000, n_features=100,n_redundant=0, random_state = 1) train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.2, random_state=66) clf = AdaBoostClassifier(n_estimators=100) clf.fit(train_X, train_Y) pred_Y = clf.predict(test_X)
输出对应的性能指标,准确度为80.5%,F1为81.52%,准确率为81.13%,召回率为81.90%,AUC为0.80,对应的ROC曲线如图3-4所示,综合指标都优于之前的KNN,代码如下:
accuracy_score: 0.805 f1_score: 0.815165876777 recall_score: 0.819047619048 precision_score: 0.811320754717 confusion_matrix: [[75 20] [19 86]] AUC: 0.804260651629
图3-4 AdaBoost的ROC曲线
以GBDT为例,数据集依然使用随机生成的数据,使用GradientBoostingClassifier分类器,分类器个数设置为100,代码如下:
x, y = datasets.make_classification(n_samples=1000, n_features=100,n_redundant=0, random_state = 1) train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.2, random_state=66) clf = GradientBoostingClassifier(n_estimators=100) clf.fit(train_X, train_Y) pred_Y = clf.predict(test_X) report(test_Y, pred_Y)
输出对应的性能指标,准确度为84%,F1为84.76%,准确率为84.76%,召回率为84.76%,AUC为0.84,对应的ROC曲线如图3-5所示,综合指标优于之前的KNN,也略优于AdaBoost,不过Boosting算法都有大量参数可以优化,对性能有一定影响,本章的这个比较只是一个不太严谨的对比,代码如下:
accuracy_score: 0.84 f1_score: 0.847619047619 recall_score: 0.847619047619 precision_score: 0.847619047619 confusion_matrix: [[79 16] [16 89]] AUC: 0.839598997494
图3-5 GBDT的ROC曲线
Bagging的算法原理和Boosting不同,它的分类器之间没有依赖关系,可以并行生成。Bagging使用自助采样法,即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集。由于是随机采样,每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的分类器 。
以Bagging为例,数据集依然使用随机生成的数据,使用BaggingClassifier分类器,分类器个数设置为100,代码如下:
x, y = datasets.make_classification(n_samples=1000, n_features=100,n_redundant=0, random_state = 1) train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.2, random_state=66) clf = BaggingClassifier(n_estimators=100) clf.fit(train_X, train_Y) pred_Y = clf.predict(test_X) report(test_Y, pred_Y)
输出对应的性能指标,准确度为83.5%,F1为84.21%,准确率为84.61%,召回率为83.81%,AUC为0.83,对应的ROC曲线如图3-6所示,综合指标优于之前的KNN,也略优于AdaBoost,代码如下:
accuracy_score: 0.835 f1_score: 0.842105263158 recall_score: 0.838095238095 precision_score: 0.846153846154 confusion_matrix: [[79 16] [17 88]] AUC: 0.834837092732