1. 概念
集成学习(ensemble learning),并不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器(基学习器,Base learner)来完成学习任务。集成学习往往被视为一种元算法(meta-algorithm)。
2. 分类
集成学习主要可以分为两类:
一. Bagging
Bagging(训练多个分类器取平均):从训练集从进行子抽样组成每个基模型所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果。
二. Boosting
Boosting(提升算法,从弱学习器开始加强,通过加权来进行训练):训练过程为阶梯状,基模型按次序一一进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次都进行一定的转化。如果某一个数据在这次分错了,那么在下一次我就会给它更大的权重。对所有基模型预测的结果进行线性综合产生最终的预测结果。
(1) Bagging类
以对鸢尾花数据进行Bagging分类为例:
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
Y = iris.target
seed = 42
kfold = KFold(n_splits=10,shuffle=True,random_state=seed)
cart = DecisionTreeClassifier(criterion='gini',max_depth=3)
cart = cart.fit(X, Y)
result = cross_val_score(cart, X, Y, cv=kfold)
print("CART树结果:",result.mean())
model = BaggingClassifier(base_estimator=cart, n_estimators=100, random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print("Bagging提升后结果:",result.mean())
运行后可以看出用了Bagging后,交叉验证的正确率相比简单的CART树,提升了一些。
其中,随机森林(Random Forest)是一种较为特殊的Bagging方法,在引入RandomForestClassifier分类器之后,会发现分类准确率会再上升一些,具体使用方法和BaggingClassifier几乎一致,可对照使用。
(2) Boosting类
以对乳腺癌数据进行Boosting分类为例:
#引用KFold,cross_val_score,AdaBoost和决策树
#使用cross_val_score进行交叉验证,KFold来划分数据集
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
#引用breast_cancer数据集
dataset_all = datasets.load_breast_cancer()
X = dataset_all.data
Y = dataset_all.target
X.shape
seed = 42
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
dtree = DecisionTreeClassifier(criterion='gini',max_depth=3)
dtree = dtree.fit(X, Y)
result = cross_val_score(dtree, X, Y, cv=kfold)
print("决策树结果:",result.mean())
model = AdaBoostClassifier(base_estimator=dtree, n_estimators=100,random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print("提升法改进结果:",result.mean())
同样可以看出,有一定程度的提升。