# 集成学习

By [jeccxiong](https://paragraph.com/@jeccxiong) · 2023-02-05

---

1.  **比较Boosting和Bagging的异同**
    
    二者都是集成学习算法，都是将多个弱学习器组合成强学习器的方法。
    
    Bagging：**代表是随机森林、dropout**
    
    从原始数据集中每一轮有放回地抽取训练集，训练得到k个弱学习器，将这k个弱学习器以投票的方式得到最终的分类结果。
    
    *   s1：利用自助采样法对训练集随机采样，重复进行 T 次;
        
    *   s2：基于每个采样集训练一个基学习器，并得到 T 个基学习器；
        
    *   s3：预测时，集体\*\*投票决策\*\*\*\*。
        
    
    Boosting：**代表是adaboost，gbdt**
    
    每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重，训练得到k个弱分类器，他们都有各自的权重，通过加权组合的方式得到最终的分类结果。
    
    *   s1：先从初始训练集训练一个基学习器；初始训练集中各样本的权重是相同的；
        
    *   s2：根据上一个基学习器的表现，调整样本权重，使分类错误的样本得到更多的关注；
        
    *   s3：基于调整后的样本分布，训练下一个基学习器；
        
    *   s4：测试时，对各基学习器加权得到最终结果；
        
    
    \*\*stacking：\*\*训练一个汇总模型来对子分类器结果进行汇总
    
    **模型堆叠**是一种有效的集成方法，其中使用各种机器学习算法生成的预测被用作第二层学习算法的输入。该第二层算法经过训练，可以优化组合模型预测以形成一组新的预测。例如，当线性回归用作第二层建模时，它通过最小化最小二乘误差来估计这些权重。但是，第二层建模不仅限于线性模型；预测变量之间的关系可能更复杂，从而为采用其他机器学习算法打开了大门
    
    **第一层**：表现出色的基本模型；**第二层**：将第一层模型们的输出作为训练集得到的模型。第二层模型又被称作”[meta-model](https://www.zhihu.com/search?q=meta-model&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2651021286%7D)“，关键作用在于将第一层的所有模型的结果整合起来，进行输出。也就是说，第二层模型将第一层模型的输出作为特征进行训练。
    
    *   **无Cross-Validation Stacking**
        
        1、将Train输入给Classfication models，每个model都会得到一个预测结果，分别为P1，P2···同样的，我们也可以在Test上做一样的事情，得到在Test上的预测结果，设为L1，L2···
        
        2、将P1，P2···和Trian中的目标变量合并成一个新的数据集，如下图。矩阵Z由P1，P2等组成，y表示Train中原本目标变量的值（也就是实际值）。这样我们就得到了一个新的数据集，这个数据集中有：Classfication models们的预测结果（图中的Z），也有目标变量的实际值（图中的y）。我们设这个数据集为D
        
        3、在刚刚产生的数据集D上，训练Meta-Classifier。这样，Meta-Classifier学习的是第一层模型们的预测结果和实际值的关系。至此，我们Stacking的模型训练过程就结束了。使用这个Meta—Classifier，你就可以得到Stacking后的结果了。
        
        lg ：**什么样的Stacking才是有效的？**
        
        答：衡量一个Stacking是否有效很简单，Stacking 后的模型的performance不能比原先模型们的performance差。这里的performance指的是你自己选择的衡量模型好坏的指标。
        
        4、**应该Stacking什么样的模型最好？**
        
        答：第一层的模型之间差异性越大越好，这样Stacking的效果才越显著。例如，笔者在kaggle Titanic比赛中，选择Stacking了XGboost、svm、[knn](https://www.zhihu.com/search?q=knn&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2651021286%7D)。因为XGboost是一个梯度提升树，是树形模型；SVM是基于线性划分的模型；knn是基于距离的模型。笔者认为三者在算法上是存在差异性的，也就是捕捉数据的能力和捕捉到的数据的特征是不一样的。最后得到Stacking结果，相较于单一的模型，确实有提高。
        
    *   有**Cross-Validation Stacking**
        
        众所周知，[Cross-Validation](https://www.zhihu.com/search?q=Cross-Validation&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2651021286%7D)（交叉验证）是一种避免模型过拟合的方法。通过在Stacking中使用交叉验证，使得Meta-Classifier将要拟合的数据更加复杂，减小Meta-Classifier过拟合的可能性，提升其泛化能力。当然，想要避免过拟合，你也可以在Meta-Classifier的目标函数中增加L1，L2正则化项。
        
        1、先根据k-fold数量，将Train划分为5份，每一份我们都称之为该k折的Validation（验证集）。就是交叉验证的基本操作。Test不做变动
        
        2、对于每个第一层的model，从k=1开始，都在Train划分的Training（下图中的绿色部分）上训练模型，在该k折的Validation（验证集）（下图中的白色部分）上进行预测。**重点来了**，保存"在Validation（验证集）上的预测结果"，将其作为第二层模型的输入数据。
        
        其实，有cv与无cv的区别很简单。"无cv"是将一次性在Trian上得到预测结果，作为第二层的输入数据。而"有cv"是利用交叉验证，每次都基于该模型的超参数，在Training上重新拟合一个模型（instance），之后将在Validation上的预测结果，作为为第二层的输入数据。所以也就是说，第二层模型的输入数据，是基于5个不一样的模型（instance）得到的。当然，这些模型（instance）是基于同样的超参数，只是拟合的数据不一样。
        
        举个例子：下图就是第二层模型的输入数据。我们关注P1这一列：k=1时候，P1的值是0.6。表明在k=1时，基于第一层的model1的超参数首先拟合了划分的Training（上图的绿色部分），得到一个模型（instance），然后该模型（instance）在Validation（验证集）（上图的白色部分）上，做出的预测结果为0.6。同理，[k=2··5](https://www.zhihu.com/search?q=k%3D2%C2%B7%C2%B75&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2651021286%7D)都是这样的。所以，P1的这五行，是五个不同的模型（instance），在五个不同的Validation（验证集）上得到的结果。
        
        **那图中的Holdout呢？**
        
        Holdout其实就是Test，刚刚我们得到了第二层模型的输入数据，现在我们要得到第二层模型的Test数据。
        
        刚刚提到，从k=1到5，我们得到了5个模型（instance）。我们将这个5个模型（instance）分别在Test上进行拟合，得到的数据应该是如下图的。下图表示的是，第一层模型中的model1，在Train中进行Cross-Validation时，得到的五个模型（instance），分别在Test上拟合的预测结果。笔者假设这里Test只有3行。我们将5个模型（instance）的结果进行平均，得到的Final，就可以作为第二层模型的Test（Holdout）了。
        
        将所有第一层model的Final整合起来，就得到第二层的Test了，如下图
        
        3、**到这里，我们得到了：a. 第二层模型的Train2数据；b.第二层模型的Test2数据。**
        
        **训练第二层模型（meta classifier）**
        
        这里有两个做法：**a.简单的**：直接在Train2上拟合，Test2上检查performance；**b.复杂的**：也在Train2上进行Cross-Validation，再在Test2上检查performance
        
        **a.简单的**：与无cv时第二层模型的训练方法一样，拟合第一层得到的Train2，在Test2上查看performance
        
        **b.复杂的**：在拟合Train2时，也使用Cross-Validation。只是：我们使用Stacking model在Test2上进行拟合，是一个没有cv的过程。查看performance：使用我们在Trian2上训练好的meta- classifier，去拟合Test2（这里的Test2指第一层模型在原始Test上的输出）。这样我们可以得到：1、meta- classifier**在Train2**上的平均performance，这样的performance更具有普遍性；2、meta- classifier在Test2上的performance
        
    
    **为什么基分类器是决策树**，因为它不稳定，所谓不稳定，指的是数据样本的扰动会对决策树的结果产生较大的影响。
    
    **决策树的划分准则**：信息增益（划分后熵越小，信息增益越大）、信息增益比、gini系数（基尼不纯度，表示集合的不确定性）

---

*Originally published on [jeccxiong](https://paragraph.com/@jeccxiong/chDVhf50raMmLfWQGyPx)*
