美文网首页
机器学习中的集成方法(3)--Boosting(分步法)

机器学习中的集成方法(3)--Boosting(分步法)

作者: Byte猫 | 来源:发表于2019-05-30 00:33 被阅读0次

    一、概念理解

    Boosting 是指个体学习器之间存在强依赖关系,必须串行序列化生成的集成学习方法。Boosting意为提升,意思是希望将每个弱学习器提升为强学习器。
    Bagging中所有的分类器是可以同时生成的,之间没有什么关系,而Boosting中则必须先生成第一个分类器,然后根据第一个分类器的结果生成第二个分类器(基学习器间存在强依赖关系),依次往后进行。

    首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重(被错分的样本权重加大,反之减小),使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。Boosting算法的本质旨在减小学习的偏差,能够基于泛化精度很差的学习器个体构建出强集成。

    二、执行步骤

    假设有1000个样本,70%的样本作为训练集,30%的样本作为测试集。
    STEP1:开始时,所有样本的权重相同,训练得到第一个基分类器。
    STEP2:根据上一轮基分类器的分类效果调整每个样本的权重(上一轮分错的样本权重提高,分对的样本权重降低),之后根据新得到样本的权重指导本轮中的基分类器训练,即在考虑样本不同权重的情况下得到本轮错误率最低的基分类器。
    STEP3:重复以上步骤2直至训练到约定的轮数结束(例如100轮),每一轮训练得到一个基分类器
    STEP4:用这100个基学习器对测试集的每一个样本都进行测试,然后通过投票的方式决定测集样本的预测结果。如果一个样本被这100个基学习器投票,即预测分类,被分为1的票数有80票,被分为0的有20票,显然,这个样本的预测结果为1。

    三、使用sklearn库实现Boosting方法

    #-*- coding:utf-8 -*-
    '''
    Boosting方法
    '''
    from sklearn.datasets import load_iris
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.metrics import accuracy_score
    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import classification_report
    
    #========================================================
    #  载入iris数据集
    #========================================================
    
    iris = load_iris()
    X = iris.data[:,:5]
    y = iris.target
    
    print('feature=',X)
    print('target=',y)
    
    #========================================================
    #  实现Boosting集成
    #========================================================
    
    def BoostingMethod(X, y):
        '''
        Boosting方法实现分类
        INPUT -> 特征, 分类标签
        '''
        scaler = StandardScaler() # 标准化转换
        scaler.fit(X)  # 训练标准化对象
        traffic_feature= scaler.transform(X)   # 转换数据集
        feature_train, feature_test, target_train, target_test = train_test_split(X, y, test_size=0.3, random_state=0)
        tree = DecisionTreeClassifier(criterion='entropy', max_depth=1)
    
        clf = AdaBoostClassifier(base_estimator=tree, 
                                n_estimators=200,   # 生成200个决策树
                                algorithm="SAMME")   # 'SAMME'这个是针对离散的变量
    
        clf.fit(feature_train, target_train)
    
        # 模型测试
        predict_results = clf.predict(feature_test)
        print(accuracy_score(predict_results, target_test))
        conf_mat = confusion_matrix(target_test, predict_results)
        print(conf_mat)
        print(classification_report(target_test, predict_results))
    
        return clf
    
    #========================================================
    #  主程序
    #========================================================
    
    if __name__ == '__main__':
    
        model = BoostingMethod(X, y)
    

    注意:Boosting有两种,一种是用于回归的AdaBoostRegressor,另一种是用于分类的AdaBoostClassifier。
    https://blog.csdn.net/changzoe/article/details/78921624

    相关文章

      网友评论

          本文标题:机器学习中的集成方法(3)--Boosting(分步法)

          本文链接:https://www.haomeiwen.com/subject/yheptctx.html