三个弱分类器,顶个强分类器。 ----沃.兹基硕德
集成学习
1.基本概念
集成学习通过构建并结合多个学习器来完成学习任务。
个体学习器:由现有的学习算法从训练数据产生。若集成中只包含同一类学习器则称它们为“基学习器”,相应的算法称为“基学习算法”。若包含不同类的个体学习器则称为异质的。
集成学习原则:好而不同。个体学习器要有一定的准确性,也要有一定的差异性。
集成学习常见算法:串行(Boosting)、并行(Bagging、决策树)、堆叠型(Stacking)下面依次讲解
2.常见算法
Boosting
核心思想:错过的重点关注。
算法:先从基学习器训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T,最终将这T个基学习器进行加权结合。其中最典型的代表为:Adaboost
Boosting 主要关住降低偏差,因此 Boosting能基于泛化性能相当弱的学习器构建出很强的集成。
流程图如下:
Bagging
算法:对训练样本进行有放回的采样产生T个训练集,对每一个采样集训练出一个基学习器,再通过投票法/平均法将这些学习器的结果结合起来。
算法:
其算法过程如下:
1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
2)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
流程图如下:
优点:高效、可用于多分类、回归,降低方差
Stacking
将训练好的所有基模型对整个训练集进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测:
下面通过下图对stacking算法做简要讲解:
假设原始数据有10300份,我们将其中300份留作测试集,剩下10000份做训练集,并且在每一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作为training data,另外一折作为testing data。每一次的交叉验证包含两个过程:
1. 基于training data训练模型;
2. 基于training data训练生成的模型对testing data进行预测。
在整个第一次的交叉验证完成之后我们将会得到关于当前testing data的预测值,这将会是一个一维2000行的数据,记为a1。注意!在这部分操作完成后,我们还要对数据集原来的整个testing set进行预测,这个过程会生成300个预测值,这部分预测值将会作为下一层模型testing data的一部分,记为b1。因为我们进行的是5折交叉验证,所以以上提及的过程将会进行五次,最终会生成针对testing set数据预测的5列2000行的数据a1,a2,a3,a4,a5,对testing set的预测会是5列2500行数据b1,b2,b3,b4,b5。
在完成对Model1的整个步骤之后,我们可以发现a1,a2,a3,a4,a5其实就是对原来整个training set的预测值,将他们拼凑起来,会形成一个10000行一列的矩阵,记为A1。而对于b1,b2,b3,b4,b5这部分数据,我们将各部分相加取平均值,得到一个300行一列的矩阵,记为B1。通过不同的分类器可得到不同的结果,再将它们的结果进一步融合便得到了最终结果。
3.随机森林
随机森林可以看做Bagging的变体。其主要思想是在样本随机选择的同时,多棵决策树的构建过程中每棵决策树的属性的选择也随机,然后根据选择属性构建最优决策树进行集成。这样基学习器的多样性不仅来自于样本的扰动,同时还来自属性的扰动,也就是说,随机森林的随机性主要体现在两个方面:(1)样本的随机选择(2)属性的随机选择。因此随机森林最终集成的泛华性能和个体学习器的差异进一步加大。此外,由于随机森林每棵树的训练都是独立的,其并不依赖前一棵树的分类结果,因此随机森林天生就适应并行,故其训练效率和模型的泛化误差往往均优于Boosting,然而该模型的精度较低(一般情况下低于Boosting几个百分点)。
在RF中,对基决策树的每个节点,先从该节点的属性集合随机划分大小为k的子集,再从子集中选择最优属性用于划分。k值常取log2d
RF的主要优点有:
1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。
2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
3) 在训练后,可以给出各个特征对于输出的重要性
4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
6) 对部分特征缺失不敏感。
RF的主要缺点有:
1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
RF和GBDT的异同:
主要有以下两点:
1) 模型迭代方式不同,GBDT是boosting模型,RF是bagging模型。
2) GBDT只能使用CART模型,RF默认是CART模型,也可以选择ID3模型。
3) 参数同样也分为两部分,一部分是框架提升部分的参数,另一部分是决策树参数。
sklearn中RF的参数:
参数:
n_estimators:随机森林中树的棵树,默认是10棵。
criterion:样本集切分策略,默认是gini指数
,此时树模型为CART模型,当值选为信息增益
的时候,模型就成了ID3模型,默认为CART模型。
bootstrap:是统计学中的一种重采样技术,可以简单理解成是有放回地抽样,默认是True,即采取有放回抽样这种策略,这不就是bagging的思想么。
oob_score:袋外估计(out-of-bag),这个外是针对于bagging这个袋子而言的,我们知道,bagging采取的随机抽样的方式去建立树模型,那么那些未被抽取到的样本集,也就是未参与建立树模型的数据集就是袋外数据集,我们就可以用这部分数据集去验证模型效果,默认值为False。
classes_:输出样本集的类别。
n_classes_:输出类别数量。
n_features_:特征数量。
n_outputs_:当模型被fit时的输出维度。看看下图来感受一些这个属性。
feature_importances_:特征重要性。
oob_score_:袋外估计准确率得分,必须是oob_score
参数选择True的时候才可用。
oob_decision_function_:袋外估计对应的决策函数。
方法:
apply(X):将训练好的模型应用在数据集X上,并返回数据集X对应的叶指数。
decision_function(X):返回决策函数值(比如svm中的决策距离)
fit(X,Y):在数据集(X,Y)上训练模型。
get_parms():获取模型参数
predict(X):预测数据集X的结果。
predict_log_proba(X):预测数据集X的对数概率。
predict_proba(X):预测数据集X的概率值。
score(X,Y):输出数据集(X,Y)在模型上的准确率。
随机森林的推广
extra trees
extra trees是RF的一个变种, 原理几乎和RF一模一样,仅有区别有:
1) 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
2) 在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。
从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于RF所生成的决策树。也就是说,模型的方差相对于RF进一步减少,但是偏倚相对于RF进一步增大。在某些时候,extra trees的泛化能力比RF更好。
参考:
西瓜书.周志华
https://www.jianshu.com/p/a779f0686acc
https://www.itcodemonkey.com/article/5181.html