谈谈模型融合之一——集成学习与adaboost(代码片段)

csu-lmw csu-lmw     2023-05-01     229

关键词:

前言

前面的文章中介绍了决策树以及其它一些算法,但是,会发现,有时候使用使用这些算法并不能达到特别好的效果。于是乎就有了集成学习(Ensemble Learning),通过构建多个学习器一起结合来完成具体的学习任务。这篇文章将介绍集成学习,以及其中的一种算法 AdaBoost。

集成学习

首先先来介绍下什么是集成学习:

  • 构建多个学习器一起结合来完成具体的学习任务,常可获得比单一学习器显著优越的泛化性能,对“弱学习器” 尤为明显(三个臭皮匠,顶个诸葛亮)
  • 也称为Multi-Classifier System, Committee-Based Learning
  • 学习器可以是同类型的,也可以是不同类型

这么一看,就感觉集成学习与常说的模型融合很像,甚至可以理解为就是模型融合。

那么,常用的集成学习方法有哪些呢?

  1. Boosting,将各种弱分类器串联起来的集成学习方式,每一个分类器的训练都依赖于前一个分类器的结果,代表:AdaBoost,Gradient Boosting Machine
  2. Bagging,Bootstrap Aggregating 的缩写。这种方法采用的是随机有放回的选择训练数据然后构造分类器,最后进行组合,代表:Random Forest
  3. Voting/Averaging,在不改变模型的情况下,直接对各个不同的模型预测的结果进行投票或者平均
  4. Binning,最近看到的一种方法,还没细看,参考论文
  5. Stacking
  6. Blending

后面几种方法这里暂时不做介绍,后面会单独写博客来介绍这些方法

AdaBoost

算法思想

这里将介绍一个基于 Boosting 方法的一个学习算法 AdaBoost,于1995年由 Freund 和 Schapire 提出。其主要思想为:

  1. 先训练出一个基学习器
  2. 根据该学习器的表现对训练样本权重进行调整,使得现有基学习器做错的样本在后续学习器的训练中受到更多的关注
  3. 基于调整后的权重来训练下一个基学习器
  4. 重复 2、3 直至学习器数目达到事先指定的值 T
  5. 最终将这 T 个学习器进行加权结合

[ H(x)=operatornamesignleft(sum_t=1^T alpha_t h_t(x) ight) ]

具体算法

设训练数据集
[ x^(i), y^(i)_i=1^m,x^(i) in mathbbR^n, y in -1, +1 ]
初始化训练数据的权值分布
[ mathcalD_1left(x^(i) ight)=frac1m ]
for t in range(T):

? 假设训练得到分类器 (h_t(x)) ,则可计算 (h_t(x)) 在当前训练集上的分类误差:
[ epsilon_t=P_x sim mathcalD_tleft[h_t(x) eq y ight]=sum_y^(i) eq h_tleft(x^(i) ight) mathcalD_tleft(x^(i) ight) ]
? 若 (epsilon_t > 0.5), break; 否则计算分类器权重
[ alpha_t=frac12 log frac1-epsilon_tepsilon_t ]
? 然后更新样本权重
[ mathcalD_t+1left(x^(i) ight)=frac1Z_t mathcalD_tleft(x^(i) ight) exp left[-alpha_t y^(i) h_tleft(x^(i) ight) ight] ]
? 其中 (Z_t) 为归一化因子
[ Z_t=sum_i mathcalD_tleft(x^(i) ight) exp left[-alpha_t y^(i) h_tleft(x^(i) ight) ight] ]
构建基本分类器的线性组合
[ f(x)=sum_t=1^T alpha_t h_t(x) ]
得到最终分类器
[ H(x)=operatornamesignleft(sum_t=1^T alpha_t h_t(x) ight) ]

这里我们可以看到 (alpha_t) 是大于 $frac12 $ 的,如果误分类了,那么 (-alpha_t y^(i) h_tleft(x^(i) ight)) 为大于 0 的数,那么样本的权重就会被放大,反之,则会被缩小。并且, (epsilon_t) 越大,(alpha_t) 就越小,即在最终构建强分类器的时候,误差率越小的弱分类器预测结果所占比重越高。

算法推导

思考两个个问题, (alpha_t) 的公式是怎么来的?以及权重更新公式是怎么来的?下面通过公式推导来讲解

假设已经经过 (t-1) 轮迭代,得到(f_t-1(x)),根据前向分布加法算法
[ f_t(x) = f_t-1(x) + alpha_th_t(x) ]
目标是损失函数最小,即
[ minLoss = minsum_i=1^Nexp[-y_i(f_t-1(x_i)+alpha_th_t)] ]
所以,有
[ egineqnarray(alpha_t,h_t(x)) & = & arg min_alpha,hsum_i=1^Nexp[-y_i(f_t-1(x_i)+alpha_th_t()x_i)] \ & = & arg min_alpha,hsum_i=1^Nw_t,iexp[-y_i(alpha_th_t(x_i))] endeqnarray ]

[ w_t,i = exp[-y_if_t-1(x_i)] ]

我们先来化简损失函数
[ egineqnarrayLoss & = &sum_y_i=h_t(x_i)w_t,iexp(-alpha_t)+sum_y_i e h_t(x_i)w_t,iexp(alpha_t) \ & = & sum_i=1^Nw_t,i(fracsum_y_i=h_t(x_i)w_t,isum_i=1^Nw_t,iexp(-alpha_t)+fracsum_y_i e h_t(x_i)w_t,isum_i=1^Nw_t,iexp(-alpha_t)) endeqnarray ]
仔细以看,后面那项 (fracsum_y_i e h_t(x_i)w_t,isum_i=1^Nw_t,i) 就是分类误差率 (epsilon_t),所以
[ Loss = sum_i=1^Nw_t,i[(1-epsilon_t)exp(-alpha_t)+epsilon_texp(alpha_t)] ]
(alpha_t) 求偏导
[ egineqnarray fracpartial Losspartial alpha_t & = & sum_i=1^Nw_t,i[-(1-epsilon_t)exp(-alpha_t)+epsilon_texp(alpha_t)] endeqnarray ]
(fracpartial Losspartial alpha_t = 0) ,则
[ -(1-epsilon_t)exp(-alpha_t)+epsilon_texp(alpha_t) = 0 ]
推得
[ alpha_t=frac12 log frac1-epsilon_tepsilon_t ]
另,由前向分布加法算法
[ egineqnarray w_t,i & = & exp[-y_if_t-1(x_i)] & = & exp[-y_i(f_t-2(x_i)+alpha_t-1h_t-1(x_i))] & = & w_t-1,iexp[alpha_t-1h_t-1(x_i)] endeqnarray ]
再加上规范化因子即为算法中的更新公式。(公式敲的要累死了~~~)

代码实现

这里为了方便起见,我使用了 sklearn 里面的决策树,之前使用的时候一直没发现 sklearn 里的决策树可以带权重训练 orz。。。决策树带权训练的代码我后面再研究研究

from sklearn.tree import DecisionTreeClassifier
def adaboost(X, y, M, max_depth=None):
    """
    adaboost函数,使用Decision Tree作为弱分类器
    参数:
        X: 训练样本
        y: 样本标签, y = -1, +1
        M: 使用 M 个弱分类器
        max_depth: 基学习器决策树的最大深度
    返回:
        F: 生成的模型
    """
    num_X, num_feature = X.shape
    
    # 初始化训练数据的权值分布
    D = np.ones(num_X) / num_X
    
    G = []
    alpha = []
    
    for m in range(M):
        # 使用具有权值分布 D 的训练数据集学习,得到基本分类器
        # 使用 DecisionTreeClassifier,设置树深度为 max_depth
        G_m = DecisionTreeClassifier(max_depth=max_depth)
        # 开始训练
        G_m.fit(X, y, D)
        # 计算G_m在训练数据集上的分类误差率
        y_pred = G_m.predict(X)
        e_m = np.sum(D[y != y_pred])
        
        if e_m == 0:
            break
        
        if e_m == 1:
            raise ValueError("e_m = ".format(e_m))
            
        # 计算 G_m 的系数
        alpha_m = np.log((1 - e_m) / e_m) / 2
#         print(alpha_m)
        # 更新训练数据集的权值分布
        D = D * np.exp(-alpha_m * y * y_pred)
        D = D / np.sum(D)
        # 保存 G_m 和其系数
        G.append(G_m)
        alpha.append(alpha_m)
    
    # 构建基本分类器的线性组合
    def F(X):
        num_G = len(G)
        score = 0
        for i in range(num_G):
            score += alpha[i] * G[i].predict(X)
        return np.sign(score)
        
    return F

小节

上面介绍了集成学习的一些知识点以及 AdaBoost 的基本原理及实现,下一篇将介绍集成学习中基于 Bagging 的随机森林(Random Forest)。

吴裕雄python机器学习——集成学习adaboost算法回归模型(代码片段)

importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportdatasets,ensemblefromsklearn.model_selectionimporttrain_test_splitdefload_data_classification():‘‘‘加载用于分类问题的数据集‘‘‘#使用scikit-learn自带的digits数据 查看详情

吴裕雄python机器学习——集成学习adaboost算法分类模型(代码片段)

importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportdatasets,ensemblefromsklearn.model_selectionimporttrain_test_splitdefload_data_classification():‘‘‘加载用于分类问题的数据集‘‘‘#使用scikit-learn自带的digits数据 查看详情

集成学习之adaboost算法原理小结

...代表算法就是是boosting系列算法。在boosting系列算法中,Adaboost是最著名的算法之一。Adaboost既可以用作分类,也可以用作回归。本文就对Adaboost算法做一个总结。1.回顾boosting算 查看详情

机器学习算法学习---模型融合和提升的算法

...整。缺点:对离群点敏感适用数据:数值型、标称型 AdaBoost算法的具体步骤如下:1.给定训练样本集S,其中X和Y分别对应于正例样本和负例样本;T为训练的最大循环次数;2.初始化样本权重为1/n,即为训练样本的初始概率分... 查看详情

集成学习之adaboost算法

1.回顾Boosting提升算法AdaBoost是典型的Boosting算法,属于Boosting家族的一员。在说AdaBoost之前,先说说Boosting提升算法。Boosting算法是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛... 查看详情

adaboost算法详解及python实现python机器学习系列(十八)

文章目录1.AdaBoost算法简介2.AdaBoost算法逻辑详解2.1数据2.2带权错误率2.3损失函数与确定样本权重2.3确定模型权重2.4输出模型3.AdaBoost算法的python实现1.AdaBoost算法简介Boosting是机器学习的三大框架之一,其特点是,训练过程... 查看详情

统计学习方法--提升方法adaboost算法(集成学习)

...集成学习,然后讲述boosting和bagging的区别与联系,同时对adaBoost进行推导然后进行gbdt的推导,最后比较随机森林和gdbt的区别和联系。2、集成学习  集成学习(ensamblelearning)通过构建多个学习器来完成任务。集成学习的一般结... 查看详情

多模态融合综述

...中的多模态融合技术(MultimodalityFusionTechnology,MFT)[1]是模型在完成分析和识别任务时处理不同形式的数据的过程。多模态数据的融合可以为模型决策提供更多的信息,从而提高了决策总体结果的准确率,目的是建立能够处理和... 查看详情

ml-6-2集成学习-boosting(adaboost和gbdt)

目录简述集成学习Boosting介绍AdaBoost算法GBDT算法总结一、简述集成学习上一篇博文已经介绍了:集成算法是由多个弱学习器组成的算法,根据个体学习器的生成方式不同,集成算法分成两类:个体学习器之间不存在强依赖关系,... 查看详情

机器学习如何与大数据融合?

】机器学习如何与大数据融合?【英文标题】:HowMachineLearningintgreatewithBigData?【发布时间】:2020-03-1101:49:26【问题描述】:机器学习如何与大数据集成机器学习和MapReduce有什么区别我应该考虑的主要概念是什么三者中的哪一个(... 查看详情

十大经典预测算法六---集成学习(模型融合算法)

模型融合算法概念  它不是具体的指某一个算法,而是一种把多个弱模型融合合并在一起变成一个强模型的思想用模型融合算法的原因  1、单个模型容易过拟合,多个模型融合可以提高范化能力  2、单个模型预测能力不... 查看详情

机器学习之adaboost算法原理

...代表算法就是是boosting系列算法。在boosting系列算法中,Adaboost是最著名的算法之一。Adaboost 查看详情

r语言基于bagging算法(融合多个决策树)构建集成学习bagging分类模型并评估模型在测试集和训练集上的分类效果(accurayf1偏差deviance):bagging算法与随机森林对比

R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比目录 查看详情

机器学习算法集成学习-1强学习器的融合学习

目录集成学习*前言引入:集成学习概述模型融合(强学习器融合)概述模型融合方法:多数法平均法:加权平均法。堆叠法:混合法:总结:我的主页:晴天qt01的博客_CSDN博客-数据分析师领域... 查看详情

集成学习

...、linear组合(有权重)组合弱模型,降低偏差,提高准确度Adaboost、GBRTStacking组合不同模型组合强模型-偏差与方差在统计学中,一个模型好坏,是根据偏差和方差来衡量的,所以我们先来普及一下偏差(bias)和方差(variance):偏差:描... 查看详情

树模型与集成学习(task6)梯度提升树gbdt+lr

...函数都很方便:前者是用指数损失函数,所以可以当做是Adaboost的个例,Aadaboost的流程;而后者是当使用平方误差损失时,可以直接拟合残差。而使用不同的损失函数,对应 查看详情

机器学习——adaboost元算法

...他算法进行组合的一种方式,其中最流行的一种算法就是AdaBoost算法。某些人认为AdaBoost是最好的监督学习的方法,所以该方法是机器学习工具箱中最强有力的工具之一。  集成学习或者元算法的一般结构是:先产生一组“个... 查看详情

深度学习入门比赛——街景字符识别(代码片段)

这是比赛的最后一个阶段,模型的集成融合在传统的机器学习中,模型集成融合有stack,投票等方式,在深度学习中,竟然也可以使用模型集成融合,这让我学到了很多,下面就将这些方法进行一下罗列记录,方便日后思考学习:... 查看详情