文章目录
一.简介
1.1 集成学习
一群人的智慧总是比一个人强,这就是集成学习的核心思想。如果你聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果也比最好的单个预测器要好。这样的一组预测器称为集成,这种技术也叫集成学习。
1.2 随机森林
我们训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练。做出预测时,只需要获得所有树各自的预测,然后得票最多的类别作为预测结果。这样一组决策树的集成被称为随机森林,随机森林是迄今可用的最强大的机器学习算法之一。
二.集成学习—投票分类器
2.1 概念
如果我们已经训练好了一些分类器,并且每个分类器的准确率都比较客观,为了创建一个更好的分类器,最简单的方法就是聚合每个分类器的预测,然后将的票最多的结果作为预测类别。这种大多数投票分类器称为硬投票分类器。事实上,即使每个分类器都是弱学习器(意味着它的的预测效果只比随机预测好一点),通过集成依然可以实现一个强学习器
2.2 代码实现
from sklearn.ensemble  import RandomForestClassifier  #随机森林分类器
from sklearn.ensemble  import VotingClassifier  #投票分类器
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris=load_iris()  #加载数据集
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target, test_size=0.3,  random_state=42)
log_clf=LogisticRegression()  #逻辑回归评估
rnd_clf=RandomForestClassifier()
svm_clf=SVC()
voting_clf=VotingClassifier(
 estimators=[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],
 voting='hard'  #硬投票#
)
voting_clf.fit(X_train,Y_train)
print(clf.__class__.__name__,accuracy_score(Y_test,voting_clf.predict(X_test)))
结果输出为预测准确率(预测全对为1)
 
三.集成学习—bagging和pasting
3.1 简介

3.2 Scikit-Learn中使用bagging和pasting
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test) 
3.3 包外评估
- 简介
- API使用
from sklearn.metrics import accuracy_score
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,bootstrap=True,n_jobs=1,oob_score=True)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)
accuracy_score(Y_test,y_pred)
3.4 随机补丁和随机子空间
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
X_train, X_test, Y_train, Y_test = train_test_split(iris.data[:,2:], iris.target, test_size=0.3,  random_state=42)
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_features=2,
                          bootstrap_features=iris.feature_names[2:],bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)  
四.集成学习—随机森林
4.1 简介
4.2 API使用
from sklearn.ensemble import RandomForestClassifier
rnd_clf=RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,n_jobs=-1)#n_jobs表示并行的意思,多余决策树之间并行运行
rnd_clf.fit(X_train,Y_train)
4.3 极端随机树
4.4 特征重要性
from sklearn.datasets import load_iris
iris=load_iris()
rnd_clf=RandomForestClassifier(n_estimators=500,n_jobs=-1)
rnd_clf.fit(iris["data"],iris["target"])
for name ,score in zip(iris["feature_names"],rnd_clf.feature_importances_):
    print(name,score)

五.集成学习—提升法Boosting
5.1 简介
5.2 AdaBoost

5.2 AdaBoost原理解析
- AdaBoost算法的初始时会将每个实例权重
     
      
       
        
         
          w
         
         
          
           (
          
          
           i
          
          
           )
          
         
        
       
       
        w^{(i)}
       
      
     w(i)最初设置为
     
      
       
        
         
          1
         
         
          m
         
        
       
       
        \frac 1 m
       
      
     m1,然后对第一个预测器进行训练,并根据训练集计算其加权错误率
     
      
       
        
         
          r
         
         
          1
         
        
       
       
        r_1
       
      
     r1,第j个预测器的加权错误率的求法
 r j = ∑ i = 1 m w ( i ) ( y ^ j ( i ) ≠ y ( i ) ) ∑ i = 1 m w ( i ) r_j=\frac {\sum_{i=1}^m w^{(i)}(\hat y_j^{(i)}\neq y^{(i)})} {\sum_{i=1}^m w^{(i)}} rj=∑i=1mw(i)∑i=1mw(i)(y^j(i)=y(i))
- 预测器的权重这里我们记为 a j a_j aj,它的计算方法如下列公式所示。其中 β \beta β是我们的学习率超参数(默认为1),可以看出我们的预测器越准确( r j r_j rj越小)其权重就越高。
a j = β l o g 1 − r j r j a_j=\beta log \frac {1-r_j} {r_j} aj=βlogrj1−rj
- 然后AdaBoost算法使用下面公式来更新实例的权重,从而提高了错误分类的实例的权重
     
      
       
        
         对于
        
        
         i
        
        
         =
        
        
         1
        
        
         ,
        
        
         2
        
        
         ,
        
        
         .
        
        
         .
        
        
         .
        
        
         .
        
        
         .
        
        
         ,
        
        
         m
        
       
       
        对于i=1,2,.....,m
       
      
     对于i=1,2,.....,m
 
     
      
       
        
         
          w
         
         
          
           (
          
          
           i
          
          
           )
          
         
        
        
         ←
        
        
         
          {
         
         
          
           
            
             
              
               
                w
               
               
                
                 (
                
                
                 i
                
                
                 )
                
               
              
              
               ,
              
              
               如果
              
              
               
                
                 y
                
                
                 ^
                
               
               
                j
               
               
                
                 (
                
                
                 i
                
                
                 )
                
               
              
              
               =
              
              
               
                y
               
               
                
                 (
                
                
                 i
                
                
                 )
                
               
              
             
            
           
          
          
           
            
             
              
               
                w
               
               
                
                 (
                
                
                 i
                
                
                 )
                
               
              
              
               e
              
              
               x
              
              
               p
              
              
               (
              
              
               
                a
               
               
                j
               
              
              
               )
              
             
            
           
          
         
        
       
       
        w^{(i)}\leftarrow \begin{cases} w^{(i)},如果 \hat y_j^{(i)}=y^{(i)}\\ w^{(i)}exp(a_j)\\ \end{cases}
       
      
     w(i)←{w(i),如果y^j(i)=y(i)w(i)exp(aj)
 4. 然后对所有实例权重进行归一化(除以
    
     
      
       
        
         ∑
        
        
         
          i
         
         
          =
         
         
          1
         
        
        
         m
        
       
       
        
         w
        
        
         
          (
         
         
          i
         
         
          )
         
        
       
      
      
       \sum_{i=1}^m w^{(i)}
      
     
    ∑i=1mw(i))
 5. 最后使用更新后的权重训练一个新的预测器,然后重复整个过程(计算新预测器的权重,更新实例权重)直到达到所需的预测器或得到完美的预测器时算法结束
 
     
      
       
        
         
          a
         
         
          1
         
        
        
         
          f
         
         
          1
         
        
        
         +
        
        
         
          a
         
         
          2
         
        
        
         
          f
         
         
          2
         
        
        
         +
        
        
         .
        
        
         .
        
        
         .
        
        
         +
        
        
         
          a
         
         
          n
         
        
        
         
          f
         
         
          n
         
        
        
         =
        
        
         F
        
       
       
        a_1f_1+a_2f_2+...+a_nf_n=F
       
      
     a1f1+a2f2+...+anfn=F
- 最后进行预测,AdaBoost就是简单地计算所有预测器的预测结果,并使用预测器权重 a j a_j aj对他们进行加权,最后得到大多数加权投票的类就是预测器给出的预测类
5.3 AdaBoost的API使用
Scikitlearn使用的是AdaBoost的多分类版本,叫做SAMME(基于多类指数损失函数的逐步添加模型),如果使用的预测器可以估算出每类的概率,可以使用SAMME的变体,SAMME.R,它和SAMME不同的是,它依赖的是类概率而不是类预测。
from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada_clf.fit(X_train,Y_train)
5.4 梯度提升
5.5 梯度提升原理
- 初始:训练集上训练第一个决策树
from sklearn.tree import DecisionTreeClassifier
tree_reg1=DecisionTreeClassifier(max_depth=2)
tree_reg1.fit(X_train,Y_train)
- 第二步:针对第一个预测器的残差训练第二个决策树
y2=Y_train-tree_reg1.predict(X_train)  #计算残差
tree_reg2=DecisionTreeRegressor(max_depth=2)
tree_reg2.fit(X_train,y2)
- 第三步:将前面得到的两棵树的预测相加,对性实例进行预测
y_pred=sum(tree.predict(iris.data[2:3,2:]) for tree in(tree_reg1,tree_reg2))
y_pred
5.6 梯度提升API使用
from sklearn.ensemble import GradientBoostingRegressor
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=3,learning_rate=1.0)
gbrt.fit(X_train,Y_train)







