2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。
一、引言
集成学习方式大致分为两种,一种是Boosting架构,采用模型之间串行的方式,典型算法代表为AdaBoost、GBDT等,第二种为Bagging,它是采用模型独立并行的架构,典型算法代表随机森林。
我们集成模型是为了提高模型的泛化能力,希望每个学习器能够有各自的特点,而且不同的学习器之间尽可能地独立,但是我们的数据只有一份,所以想要每个算法不想关是很难办到的,我们希望能够从原始数据集衍生n个数据集共给不同的基学习器进行学习,这样不但可以降低模型之间的独立性而且还能够使每个基学习器尽可能不同。
这里产生n个数据集的原因是我们要使每个基学习器尽量不同,所以需要喂不同的数据进行拟合,如果我们每个基学习器都是拟合原始数据,那么每个基学习器都是大体一样的,这样集成学习就没意义了。
二、随机森林
Bagging架构最著名的算法就属随机森林了,随机森林是Bagging+决策树构成的,也就是我们每个基学习器使用cart决策树,根据上面所述,为了提高模型的泛化能力,我们要根据原始数据构造n棵不同的决策树。
1.数据抽样
为了使每棵树不同,所以我们需要构造n个数据集来给基学习器训练,那么我们就可以使用抽样的方法构造新的数据集,但是抽样分为又放回和无放回抽样,如果采用无放回抽样的化,构造的数据集虽然是独立的,但是如果数据集不够的话,会导致每个学习器训练的数据非常少,导致模型欠拟合的风险,所以随机森林采用了有放回抽样。
每个数据都有可能被重复抽到,我们又放回采样n次,这样就构成了n个不同的数据集供给每个基学习器进行训练。
这里假设每个样本被抽到的概率为 1 m \frac{1}{m}m1 ,那么没有被抽打的概率就为 1 − 1 m 1-\frac{1}{m}1−m1 ,我们需要抽取m次,所以针对一个样本m次都没有被抽到的概率为 ( 1 − 1 m ) m (1-\frac{1}{m})^m(1−m1)m ,当m区域无穷大时,该概率值近似为 1 e = 0.368 \frac{1}{e}=0.368e1=0.368 ,那么也就是说我们数据集中经过m次抽样大概会有 36.8 36.836.8%的数据不会被抽到,这些数据一般被称作袋外数据,针对于这个特性有时候可以使用它们作为验证集使用。
2.集成模型结果
Bagging架构是多个模型独立的,所以每个模型的输出结果无关,最终我们需要参考每棵树的结果生成最终结果。
一般针对于分类问题,每个树输出的为目标类别,此时我们可以使用投票的方式,少数服从多数的方式,类似于专家评选一样,如果出现票数相同那么就随机挑选一个。
如果是回归问题,每棵树输出的为连续值,所以此时可以使用加权平均的方式作为最终预测结果。
3.生成单棵树
针对于每棵树的训练其实是和单棵决策树差不多的,都是按照特征计算信息增益,然后选取最优特征进行区分样本,但是随机森林还改进了一个地方就是选取最优特征时,对于普通的决策树是计算所有特征的信息增益选取最大的,但是随机森林采用的是不适用所有的特征,而是从所有特征中随机选取n个特征作为特征子集,然后基于这个特征子集计算信息增益。
举个例子,一个样本集有100个特征,如果针对于普通的决策树,它会分别计算这100个特征的信息增益,然后选取最优特征,而随机森林在初期我们可以设定一个值作为特征子集的数量,比如我们设定该数值为50,那么我们建树之前,会从100个特征中随机选取50个特征作为特征子集,之后这颗树的生成都时基于这个特征子集,只需要计算这50个特征的信息增益。
随机森林增加特征随机选取是为了提高模型泛化能力,不仅从样本抽样上而且还从特征选取上,这样就会使每个学习器之间的差异度进一步提升,模型的泛化能力进一步提高。
这样也会有一定后果,每个基学习器的精度会有所下降,因为加入了属性扰动,没有考虑所有的特征,但是随着基学习器个数的增大,模型的总体误差会更低,单个学习器的降低不会大幅度降低模型的能力。
三、学习器多样性增强
针对于集成学习,我们需要每个基学习器好而不同,对于集成更关注的是不同,也就是每个基学习器都会有自己的一些特性,这样模型的泛化能力才会高,对于未知的数据集拟合的才会更好,下面给出几种方式增加学习器的多样性。
1.数据样本扰动
所谓的数据样本扰动就是我们要给每个基学习器训练不同的数据集,对于随机森林来说,采用的是通过采样的方式来构造不同的样本子集,像AdaBoost采用的就是通过改变样本权重的方式生成不同的样本集。
但是有些模型使用数据扰动不太管用,你比如说SVM、线性模型等,这些模型一般是不会随着数据的变动发生较大的变化的,这些一般称为稳定学习器,像决策树这种模型,如果样本稍加变化就会导致模型大幅度变化,这种称为不稳定学习器,对于不稳定学习器使用数据样本扰动很管用,如果是稳定学习器,那么就需要使用特征扰动。
2.特征属性扰动
特征扰动就是我们在构造模型时只是使用一部分特征,这样每个基学习器就会学习到不同的特征集,那么生成的模型自然不同,这种方法对于哪些稳定学习器较为管用。
比如本篇文章讲的随机森林,在构建每棵树时,采用随机采集特征子集的方式进行建模,一方面这样不但可以使获得不同的学习器,而且还因为特征数的减少,模型的训练效率大大提高,尽管这样可能造成一定精度损失。
3.模型参数扰动
一般的模型中都会有参数的设置,将不同的学习器初始参数设置的不一样,一般情况下也会获得不同的模型,你比如说,随机森林中每个树我设定每棵树的最大深度不同,或者分割最小样本数,修改每个基学习器模型的参数也会导致获得不同的基学习器。