以下内容仅作为自己的学习记录。
集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。
集成学习中的个体学习器通常由一个现有的算法从训练数据集产生,比如决策树算法、神经网络算法。集成学习主要有两种方式:同质集成(个体学习器都是一个类型的,比如都是神经网络算法)和异质集成。
要获得好的集成,个体学习器应“好而不同”,即个体学习器的准确率要高,同时个体学习器之间的差异要高,即要有多样性。
集成学习方法主要分为两大类:
boosting算法是一族可以将弱学习器提升为强学习器的算法。boosting族算法最著名的是AdaBoost算法。AdaBoost算法可以这样理解:属于加性模型,学习算法为前向分步算法;具体地,对于AdaBoost二分类算法而言,损失函数为指数损失函数,对于AdaBoost回归而言,损失函数为均方差损失函数。
从偏差-方差均衡的角度看,boosting算法主要关注降低偏差,因此boosting算法能基于泛化性能相当弱的学习器构建出很强的集成。
Bagging在采样生成具体的训练样本集的时候使用的是bootstrap sampling。在对预测输出进行结合时,bagging对分类任务使用简单投票法;对回归任务使用简单平均法。
训练一个bagging集成 与直接使用基学习器训练一个学习器的复杂度同阶,说明bagging是一个非常高效的集成学习算法;与标准的adaboost算法只能适用于二分类不同,bagging算法可以不经修改地适用于分类和回归任务。
bagging所采用的自助采样法给bagging带来了另外一个优点:由于每个基学习器只使用了初始训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对泛化性能进行“包外估计”(out-of-bag estimation)。(和K折交叉验证的作用很像)
包外样本还要很多其他用途。比如当基学习器是决策树时,可以利用包外样本来辅助剪枝;当基学习器是神经网络时,可以使用包外样本来进行early stopping以减少过拟合的风险。
从偏差-方差均衡角度来看,bagging更关注于减少方差,因此bagging在不剪枝的决策树、神经网络等易受样本扰动的学习器上效果更为显著。
是Bagging的扩展变体。RF的基学习器同样是决策树,但是和bagging不同的地方在于RF在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时,是在当前节点的属性集合中选择一个最优属性(对于CART而言,选择标准为平方误差最小或者基尼指数最小);但是在RF中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含 k k k个属性的子集,然后在这个子集中选择一个最优属性用于划分。这里的 k k k值控制了随机性的引入程度,一般而言 k = log 2 b k=\log_2b k=log2b(b表示总的属性个数)。
bagging中基学习器的不同(即多样性)来自于对样本的扰动(通过对初始训练集进行自助采样),而RF的不同还来自于对属性的扰动,这使得RF的集成泛化性能能够通过基学习器的多样性的增加而提升。
学习器结合可能从三个方面带来好处:
主要针对回归问题而言;主要有两种:
主要针对分类问题而言,主要有三种:
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合,Stacking是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或者元学习器。
Stacking先从初始数据集训练处初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新的数据集中,初级学习器的输出被当做次级学习器的输入,初始样本的标记仍被当做样例标记。在次级学习器的训练阶段,用的是初级学习器产生的新的数据集,如果直接用初始训练集来训练次级学习器,会产生比较大的过拟合风险。
在集成学习中需要有效地生成多样性大的个体学习器,那么如何增强多样性呢?一般的思路是在学习过程中引入随机性,常见做法是对数据样本、输入属性、输出表示、算法参数进行扰动。
书中在最后提到一句:为什么Adaboost在训练误差达到零之后继续训练仍能提高泛化性能?但是如果一直训练下去,过拟合还是会出现。(没有给出理论的分析和解释)
后续再补充完善。
突然想到一点:在偏差一定的情况下,学习器的方差越大,是不是说明这个学习器越容易过拟合? 由于RF是bagging,关注于减少方差,并且我们知道RF是不容易过拟合的,即RF方差小,不容易过拟合;所以想到是不是方差大,学习器容易过拟合呢?即学习器的方差和学习器的过拟合间有没有什么联系呢?
过拟合的本质是学习器学到了数据集中的异常数据模式(噪声数据导致),导致模型复杂度高;而RF由于是bagging,引入了样本随机和属性随机,所以可能只有部分基学习器会遇到噪声数据(假设噪声数据比较少,那么在自助抽样的时候采样到噪声数据的可能性就比较少),导致该基学习器学习的是异常的数据模式,并且由于两个随机的引入,基学习器本身的学习能力就比较弱,所以可能学习不了异常的数据模式,即使学习到了异常的数据模式,导致基学习器过于复杂(决策树过深,叶子节点过多),但是也只有少数的基学习器会这样,由于bagging算法的特性,这些异常的基学习器对于最终的强学习器的影响比较弱(平均,投票),所以整体而言bagging算法的方差比较低,不容易过拟合。相对的,boosting算法就容易过拟合,因为boosting算法关注的是减少偏差,在串行训练基学习器的时候,都是用的整个训练数据集,一旦训练数据集中存在异常的数据模式,那么在每一轮的训练过程中,每个基学习器都会受到这些异常数据模式的影响,从而导致最终的强学习器容易过拟合,方差大。
还有一个问题:bagging中的树(比如RF)和boosting中的树(比如GBDT)平均而言谁更深?
个人理解:bagging中的树更深。我们知道bagging中的每棵树在生成的时候都是尽可能生长,尽可能的去拟合该棵树的训练数据集,尽可能减少单棵树的偏差,增强单棵树的学习能力;而boosting中的树如果都完全生长,则过拟合风险大大增加,所以相对而言boosting中的树会浅一些。既然bagging中的树更深,boosting中的树相对浅,那为什么说boosting是专注于减少偏差呢?虽然bagging中的树可能深一些,但是由于两个随机性的引入(RF),导致训练每棵树的样本和属性都只是部分的,但是boosting训练的时候用的是整个数据集,没有引入随机性,所以虽然相对浅一些,但偏差肯定更小,所以说boosting专注减少偏差。
《机器学习》,周志华