集成学习与Python

一、基本概念

集成方法(ensemble method)的目标是:将不同的分类器组合成一个元分类器,与包含于其中的单个分类器相比,元分类器具有更好的泛化性能。通常基于多数投票原则。

集成学习与Python_第1张图片

       假定二类别分类中的n个成员分类器有相同的出错率ε,并且各分类器相互之间独立。

集成学习与Python_第2张图片

  1. # Title     : TODO  
    # Objective : TODO  
    # Created by: Chen Da  
    # Created on: 2018/9/14  
      
    from scipy.misc import comb  
    import math  
      
    def ensemble_error(n_classifier,error):  
        ''''' 
        成员分类器集成后的概率密度函数 
        :param n_classifier: 分类器数目 
        :param error: 单个分类器出错率 
        :return: 
        '''  
        k_start = math.ceil(n_classifier / 2)  
        probs = [comb(n_classifier,k) *  
                 error**k *  
                 (1-error)**(n_classifier - k)  
                 for k in range(k_start, n_classifier + 1)]  
        return sum(probs)  
      
    print(ensemble_error(11,0.25))  
    
    0.03432750701904297
      
      
    import numpy as np  
    import matplotlib.pyplot as plt  
      
    error_range = np.arange(0,1.01,0.01)  
    ens_errors = [ensemble_error(n_classifier=11,error=error)  
                  for error in error_range]  
    plt.plot(error_range,ens_errors,  
             label='Ensemble error',  
             linewidth=2)  
    plt.plot(error_range,error_range,  
             linestyle='--',  
             label='Base error',  
             linewidth=2)  
    plt.xlabel('Base error')  
    plt.ylabel('Base/Ensemble error')  
    plt.legend(loc='upper left')  
    plt.grid()  
    plt.savefig('111.png')  
    plt.show()  

     

集成学习与Python_第3张图片

       可以看出,当单个分类器的错误率都小于0.5时,集成分类器的出错率要低于单个分类器。

       集成方法的目标是把多个给定学习算法构建的基估计器的预测结果结合起来,从而获得比单个估计器更好的泛华能力/鲁棒性。

       集成学习通常分为两种:

  • 平均方法——构建多个独立的估计器,然后取平均;
  • Boosting方法——基估计器是依次构建的,并且每一个基估计器都尝试去减少组合估计器的偏差。

二、Bagging meta-estimator

       Bagging算法基于自主采样,即在原始数据集进行随机抽样,并且抽样是有放回的,这样原始数据集中有63.2%的数据出现在训练集中。基于每次抽样得到的训练集训练出一个基学习器,然后将这些基学习器进行结合。

  1. from sklearn.ensemble import BaggingClassifier  
    from sklearn.neighbors import KNeighborsClassifier  
      
    #max_samples和max_features控制子集的大小(样例和特征),其余两个控制是否放回  
    #构造一个KNN估计器的bagging集成实例  
    bagging = BaggingClassifier(KNeighborsClassifier(),  
            max_samples=0.5,max_features=0.5,  
            bootstrap=True,bootstrap_features=True  
            )  

     

bagging 方法有很多种,其主要区别在于随机抽取训练子集的方法不同:

  • 如果抽取的数据集的随机子集是样例的随机子集,我们叫做粘贴(Pasting)。
  • 如果样例抽取是有放回的,我们称为Bagging。
  • 如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间(Random Subspaces) 。
  • 最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁(Random Patches)。

三、随机森林

       在随机森林中,集成模型中的每棵树构建时的样本都是由训练集经过有放回抽样得来的(例如,自助采样法-bootstrap sample)。另外,在构建树的过程中进行结点分割时,选择的分割点不再是所有特征中最佳分割点,而是特征的一个随机子集中的最佳分割点。 由于这种随机性,森林的偏差通常会有略微的增大(相对于单个非随机树的偏差),但是由于取了平均,其方差也会减小,通常能够补偿偏差的增加,从而产生一个总体上更好的模型。

       在随机森林中,使用的特征是候选特征的随机子集;不同于寻找最具有区分度的阈值, 这里的阈值是针对每个候选特征随机生成的,并且选择这些随机生成的阈值中的最佳者作为分割规则。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差。

from sklearn.ensemble import RandomForestClassifier  

四、AdaBoost

       AdaBoost 的核心思想是用反复修改的数据(修正数据的权重)来训练一系列的弱学习器(一个弱学习器模型仅仅比随机猜测好一点, 比如一个简单的决策树),由这些弱学习器的预测结果通过加权投票(或加权求和)的方式组合, 得到我们最终的预测结果。

在每一次所谓的提升(boosting)迭代中,数据的修改由应用于每一个训练样本的(新) 的权重 W1,W2 , …,Wn 组成(即修改每一个训练样本应用于新一轮学习器的权重)。 初始化时,将所有弱学习器的权重都设置为Wi=1/N ,因此第一次迭代仅仅是通过原始数据训练出一个弱学习器。在接下来的连续迭代中,样本的权重逐个地被修改,学习算法也因此要重新应用这些已经修改的权重。在给定的一个迭代中, 那些在上一轮迭代中被预测为错误结果的样本的权重将会被增加,而那些被预测为正确结果的样本的权重将会被降低。随着迭代次数的增加,那些难以预测的样例的影响将会越来越大,每一个随后的弱学习器都将会被强迫更加关注那些在之前被错误预测的样例。

from sklearn.ensemble import AdaBoostClassifier  

五、Gradient Tree Boosting(梯度树提升)

       或梯度提升回归树(GBRT)是对于任意的可微损失函数的提升算法的泛化。GBRT 是一个准确高效的现有程序, 它既能用于分类问题也可以用于回归问题。梯度树提升模型被应用到各种领域,包括网页搜索排名和生态领域。

GBRT 的优点:

对混合型数据的自然处理(异构特征)

强大的预测能力

在输出空间中对异常点的鲁棒性(通过具有鲁棒性的损失函数实现)

GBRT 的缺点:

可扩展性差(此处的可扩展性特指在更大规模的数据集/复杂度更高的模型上使用的能力,而非我们通常说的功能的扩展性;GBRT 支持自定义的损失函数,从这个角度看它的扩展性还是很强的!)。由于提升算法的有序性(也就是说下一步的结果依赖于上一步),因此很难做并行.

 

 

 

 

 

 

 

你可能感兴趣的:(机器学习常用算法)