前言
集成学习是目前各类竞赛(比如Kaggle,天池等)和工程中应用最广泛的模型提升方法。它确实也取得了不错的效果,在保证准确度的同时也提升了模型防止过拟合的能力。下面我们通过这篇文章了解一下集成学习的原理、具体有哪些方法、以及对其中一种方法 AdaBoost 的展开,同样,使用sklearn实现此方法达到深入理解的效果。
一、集成学习
1.1、什么是集成学习?
集成学习方法是指组合多个模型,以获得更好的效果,使集成的模型具有更强的泛化能力。对于多个模型,如何组合这些模型(就是下图中的个体学习器),主要有Boosting、Bagging、Stacking等几种方法。
集成学习大致过程如下图: 集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。 根据个体学习器的生成方式,将集成学习分为两类:
- 个体学习器间存在强依赖关系、必须串行生成的序列化方法,如 Boosting。
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法,如 Bagging 和 “随机森林”(Random Forest)。
下面展开Boosting算法以及这一族中代表性的算法:AdaBoost算法。
1.2、Boosting 算法
Boosting是一族可将弱学习器提升为强学习器的算法。 该算法工作机制: (1)从初始训练集训练出一个基学习器; (2)根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到更多关注; (3)基于调整后的样本分布来训练下一个基学习器; (4)重复上述步骤,直到基学习器数目达到事先指定的值 T ; (5)最后,将这 T 个基学习器进行加权结合。 即采用同一基模型,在样本的不同子集上进行训练,从而得到对应的多个不同的具体模型。
Boosting族算法最著名的代表算法是AdaBoost算法。
二、AdaBoost算法及实现
2.1、AdaBoost算法
AdaBoost(Adaptive boosting)是一种迭代算法。其核心思想是:针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。 Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器。
-
AdaBoost算法如何做到在一次次迭代过程中,对先前基学习器做错的训练样本更加关注呢? 答:刚开始训练时对每一个训练样本赋相等的权重,然后用该算法对训练集训练 t 轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。 -
此外,对于基分类器的要求是:要有 多样性,例如:一个判断是否为男性的任务,弱分类器1侧重从鼻子、耳朵这些特征判断是否是男人,分类器2侧重脸和眼睛等等,把这些分类器结合起来就有了所有用来判断是否男性的特征,并且adaboost还可以给每个基分类器赋值不同的权重,比如从脸比鼻子更能判断是否为男性,就可以把分类器2的权重调高一些,这也是adaboost需要学习的内容。
AdaBoost算法流程: 这里的公式推导不再详细解释,如果想深入研究,可以参考 周志华-西瓜书 + 谢文睿-南瓜书。
2.2、调sklearn库实现Adaboost算法
代码如下:
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
print(f"训练数据量:{len(X_train)},测试数据量:{len(X_test)}")
# 定义模型
model = AdaBoostClassifier(n_estimators=50,learning_rate=1.5)
# 训练
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
acc = metrics.accuracy_score(y_test, y_pred) # 准确率
print(f"准确率:{acc:.2}")
总结
关于集成学习的方法,这里只介绍了一种Boosting算法族中一个代表性的——AdaBoost算法,除此之外,Bagging算法是另一类的集成学习方法,Bagging是并行式集成学习方法最著名的代表。随机森林(Random Forest,RF)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,其优点是简单、容易实现、计算开销小;有兴趣也可以深入研究。
|