• 集成学习综述笔记


    集成学习

    **Ensemble methods 组合模型的方式大致为四个:/bagging / boosting / voting / stacking **

    机器学习的算法有很多,对于每一种机器学习算法,考虑问题的方式都略微有所不同,所以对于同一个问题,不同的算法可能会给出不同的结果,那么在这种情况下,我们选择哪个算法的结果作为最终结果呢?那么此时,我们完全可以把多种算法集中起来,让不同算法对同一种问题都进行预测,最终少数服从多数,这就是集成学习的思路。
    en's一种机器学习算法,考虑问题的方式都略微有所不同,所以对于同一个问题,不同的算法可能会给出不同的结果,那么在这种情况下,我们选择哪个算法的结果作为最终结果呢?那么此时,我们完全可以把多种算法集中起来,让不同算法对同一种问题都进行预测,最终少数服从多数,这就是集成学习的思路。

    # Set seed for reproducibility
    SEED=1
    
    # Instantiate lr
    lr = LogisticRegression(random_state=SEED)
    
    # Instantiate knn
    knn = KNN(n_neighbors=27)
    
    # Instantiate dt
    dt = DecisionTreeClassifier(min_samples_leaf=0.13, random_state=SEED)
    
    # Define the list classifiers
    classifiers = [('Logistic Regression', lr), ('K Nearest Neighbours', knn), ('Classification Tree', dt)]
    
    # Iterate over the pre-defined list of classifiers
    for clf_name, clf in classifiers:    
      
        # Fit clf to the training set
        clf.fit(X_train, y_train)    
      
        # Predict y_pred
        y_pred = clf.predict(X_test)
        
        # Calculate accuracy
        accuracy = accuracy_score(y_test, y_pred)
      
        # Evaluate clf's accuracy on the test set
        print('{:s} : {:.3f}'.format(clf_name, accuracy))
    
    
    <script.py> output:
        Logistic Regression : 0.747
        K Nearest Neighbours : 0.724
        Classification Tree : 0.730
    

    VotingClassifier

    # Import VotingClassifier from sklearn.ensemble
    from sklearn.ensemble import VotingClassifier
    
    # Instantiate a VotingClassifier vc
    vc = VotingClassifier(estimators=classifiers)     
    
    # Fit vc to the training set
    vc.fit(X_train,y_train)   
    
    # Evaluate the test set predictions
    y_pred = vc.predict(X_test)
    
    # Calculate accuracy score
    accuracy = accuracy_score(y_test, y_pred)
    print('Voting Classifier: {:.3f}'.format(accuracy))
    
    <script.py> output:
        Voting Classifier: 0.753
    

    惊喜的发现Voting Classifier的集成学习率达到了0.753,而集成之前的单个学习率Logistic Regression : 0.747, K Nearest Neighbours : 0.724,Classification Tree : 0.730,集成的魅力

    我现在可不可以这样理解,我在做智能算法,两个算法两两组合,例如:花授粉算法与粒子群算法进行组合,不过这也不是完全的集成学习,只是集成了一部分,确实可以提升收敛效果。

    bagging

    特点

    平行合奏:每个模型独立构建

    旨在减少方差,而不是偏差(因此很可能存在过拟合)

    适用于高方差低偏差模型(复杂模型)

    基于树的方法的示例是随机森林,其开发完全生长的树(注意,RF修改生长的过程以减少树之间的相关性)

    推导

    输入
    训练集(D=left{left(oldsymbol{x}_{1}, y_{1} ight),left(oldsymbol{x}_{2}, y_{2} ight), ldots,left(oldsymbol{x}_{m}, y_{m} ight) ight})
    基学习算法:(mathcal{L})
    训练次数:(T)
    过程
    for (t=1,2, dots, T mathrm{do})
    (h_{t}=mathfrak{L}left(D, mathcal{D}_{b s} ight))
    end for
    输出
    (H(oldsymbol{x})=underset{y in mathcal{Y}}{arg max } sum_{t=1}^{T} mathbb{I}left(h_{t}(oldsymbol{x})=y ight))

    流程图

    实现描述

    在scikit-learn中,
    参数 max_samples 和 max_features 控制子集的大小(在样本和特征方面)
    参数 bootstrap 和 bootstrap_features 控制是否在有或没有替换的情况下绘制样本和特征。

    Bagging又叫自助聚集,是一种根据均匀概率分布从数据中重复抽样(有放回)的技术。
    每个抽样生成的自助样本集上,训练一个基分类器;对训练过的分类器进行投票,将测试样本指派到得票最高的类中。
    每个自助样本集都和原数据一样大
    有放回抽样,一些样本可能在同一训练集中出现多次,一些可能被忽略。
    csdn

    评价

    Bagging通过降低基分类器的方差,改善了泛化误差
    其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起
    由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例

    BaggingClassifier参数介绍

       base_estimator:Object or None。None代表默认是DecisionTree,Object可以指定基估计器(base estimator)。
    

        n_estimators:int, optional (default=10) 。 要集成的基估计器的个数。

        max_samples: int or float, optional (default=1.0)。决定从x_train抽取去训练基估计器的样本数量。int 代表抽取数量,float代表抽取比例

        max_features : int or float, optional (default=1.0)。决定从x_train抽取去训练基估计器的特征数量。int 代表抽取数量,float代表抽取比例

        bootstrap : boolean, optional (default=True) 决定样本子集的抽样方式(有放回和不放回)

        bootstrap_features : boolean, optional (default=False)决定特征子集的抽样方式(有放回和不放回)

        oob_score : bool 决定是否使用包外估计(out of bag estimate)泛化误差

        warm_start : bool, optional (default=False) true代表

        n_jobs : int, optional (default=1)

        random_state : int, RandomState instance or None, optional (default=None)。如果int,random_state是随机数生成器使用的种子; 如果RandomState的实例,random_state是随机数生成器; 如果None,则随机数生成器是由np.random使用的RandomState实例。

        verbose : int, optional (default=0)

    属性介绍:

        estimators_ : list of estimators。The collection of fitted sub-estimators.

        estimators_samples_ : list of arrays

        estimators_features_ : list of arrays

        oob_score_ : float,使用包外估计这个训练数据集的得分。

        oob_prediction_ : array of shape = [n_samples]。在训练集上用out-of-bag估计计算的预测。 如果n_estimator很小,则可能在抽样过程中数据点不会被忽略。 在这种情况下,oob_prediction_可能包含NaN。

    # Import DecisionTreeClassifier
    from sklearn.tree import DecisionTreeClassifier
    
    # Import BaggingClassifier
    from sklearn.ensemble import BaggingClassifier
    
    # Instantiate dt
    dt = DecisionTreeClassifier(random_state=1)
    
    # Instantiate bc
    bc = BaggingClassifier(base_estimator=dt, n_estimators=50, random_state=1)
    
    # Fit bc to the training set
    bc.fit(X_train, y_train)
    
    # Predict test set labels
    y_pred = bc.predict(X_test)
    
    # Evaluate acc_test
    acc_test = accuracy_score(y_test, y_pred)
    print('Test set accuracy of bc: {:.2f}'.format(acc_test))
    
    <script.py> output:
        Test set accuracy of bc: 0.71
    

    Out of Bag Evaluation

    OOB_score

    # Import DecisionTreeClassifier
    from sklearn.tree import DecisionTreeClassifier
    
    # Import BaggingClassifier
    from sklearn.ensemble import BaggingClassifier
    
    # Instantiate dt
    dt = DecisionTreeClassifier(min_samples_leaf=8, random_state=1)
    
    # Instantiate bc
    bc = BaggingClassifier(base_estimator=dt, 
                           n_estimators=50,
                           oob_score=True,
                           random_state=1)
    
    # Fit bc to the training set 
    bc.fit(X_train, y_train)
    
    # Predict test set labels
    y_pred = bc.predict(X_test)
    
    # Evaluate test set accuracy
    acc_test = accuracy_score(y_test, y_pred)
    
    # Evaluate OOB accuracy
    acc_oob = bc.oob_score_
    
    # Print acc_test and acc_oob
    print('Test set accuracy: {:.3f}, OOB accuracy: {:.3f}'.format(acc_test, acc_oob))
    
    <script.py> output:
        Test set accuracy: 0.698, OOB accuracy: 0.704
    

    Random Forests (RF)

    参考这篇文章
    个人觉得,先搞明白每个分类器的原理然后,在进行集成学习于我个人而言比较有效果
    https://www.cnblogs.com/gaowenxingxing/p/12345225.html

    boosting

    Adaboost

  • 相关阅读:
    selenium实战
    selenium+unittest实现po模型
    IDE自动化脚本实现
    web 自动化测试
    requests 遇到报错UnicodeEncodeError: 'latin-1' codec can't encode character 'u86c7' in position 8: Body ('蛇') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
    通过requests + pytest + allure 实现接口自动化测试
    python pytest单元测试
    python unittest单元测试
    laili和网路知识
    网络-单臂路由
  • 原文地址:https://www.cnblogs.com/gaowenxingxing/p/12355856.html
Copyright © 2020-2023  润新知