文章目录
集成学习方法是指组合多个模型,以获得更好的效果,使集成的模型具有更强的泛化能力。对于多个模型,如何组合这些模型,主要有以下几种不同的方法:
- 在验证数据集上上找到表现最好的模型作为最终的预测模型
- 对多个模型的预测结果进行投票或者取平均值 (Bagging方法)
- 对多个模型的预测结果做加权平均 (Boosting方法)
以上的几种思路就对应了集成学习中的几种主要的学习框架。
获得不同种类分类器的方法之一是使用不同的模型进行训练,然后投票得出最优判断。还有另一种方法是每个预测器使用的模型相同,但是在不同的训练集随机子集上进行训练。
sklearn集成学习有一些特别著名的集成方法,包括 bagging, boosting, stacking,随机森林(决策树集合)下面我们逐一介绍。
集成学习的数学原理
模型方差与偏差关系
模型的偏差是训练出来的模型在训练集上的准确度(即在样本上拟合的好不好)。模型的方差是训练出来的模型在测试集上的准确度(即预测的准不准)。方差越大的模型越容易过拟合。
通常来说弱模型是偏差高(在训练集上准确度低)方差小(防止过拟合能力强)的模型。强模型是偏差低(在训练集上准确度高)方差高(防止过拟合能力弱)的模型。bagging和stacking中的基模型为强模型,boosting中的基模型为弱模型。bagging和stacking中的基模型为强模型是偏差低(在训练集上准确度高)方差高(防止过拟合能力弱),boosting中的基模型为弱模型。
方差,偏差,误差与模型复杂度关系。
一、集成方法bagging
另一种方法是每个预测器使用的模型相同,但是在不同的训练集随机子集上进行训练。分为bagging(模型为强模型,样本有放回),pasting(样本无放回)(基模型为强模型,bagging的训练过程旨在降低方差)
bagging:从训练集又放回的 进行子抽样组成每个基模型所需要的子训练集,数据集允许重复,对所有基模型预测的结果进行综合产生最终的预测结果,基模型为强模型,是偏差低(在训练集上准确度高)方差高(防止过拟合能力弱)。
Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。由于,所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。整体模型的期望近似于基模型的期望,这也就意味着整体模型的偏差和基模型的偏差近似。同时,整体模型的方差小于等于基模型的方差(当各个模型相同的时候取等号)。
对于bagging来说,整体模型的偏差和基模型近似,整体模型的方差随着基模型数(m)的增多而减少,从而防止过拟合的能力增强,方差降低,模型的准确度得到提高。
主要算法
随机森林(Bagging + 决策树 )
sklearn实现
sklearn中的sklearn.ensemble.BaggingClassifier(分类)可以实现Bagging
sklearn.ensemble.BaggingClassifier(base_estimator=None, n_estimators=10, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False, warm_start=False, n_jobs=None, random_state=None, verbose=0)
参数说明:
- n_estimators:基学习器的数量
- max_samples:每个基学习器中的样本数,如果是整形,则就是样本个数;如果是float,则是样本个数占所有训练集样本个数的比例
- bootstrap :是否采用有放回抽样(bagging),为True表示采用,否则为pasting(无放回抽样)。默认为True,如果你想使用pasting, 只需要设置bootstrap=False即可
- n_jobs:并行运行的作业数量。-1时,个数为处理器核的个数
- oob_socre:为True时,对模型进行out-of-bag的验证,即在一个基学习器中,没有用于训练的数据用于验证,调用 print (bagging.oob_score_)输出
相对于单个的决策树,Bagging方法得到的分类边界更加平滑相对于pasting方法来说,bagging方法中模型的偏差会偏大一点,因为它是采用有放回的抽样,所有模型中用到的数据的均匀性会差一点;但是因为这样,模型之间相对独立一点,因此bagging的方差会小一点。在实际使用过程中,bagging的效果一般会更好,因此一般使用bagging。但是对于具体的问题,我们也可以用交叉验证验证两种模型的性能。
基础分类器能够估算类别概率(也就是具备predict_proba() 方法) , 比如决策树分类器, 那么BaggingClassifier自动执行的就是软投票法而不是硬投票法
# 产生样本数据集
from sklearn.model_selection import cross_val_score
from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X, y = iris.data, iris.target
print ('===============