栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python浅试Bagging集成学习

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python浅试Bagging集成学习

文章目录
  • 前言
  • 一、Bagging的主要思想
  • 二、相关代码
    • 1.随机抽取采样集
    • 2.生成各个采样集的贝叶斯概率表
    • 3.对每个基分类器进行结果预测并集成
  • 效果


前言

集成学习(Ensemble Learning)是指用一系列分类回归器共同对一个问题进行分类或回归的学习方法。其中,如果分类器都是同一类型的,比如都是决策树,那么这样的分类器称为同质分类器;反之如果分类器是不同类型的,那么就是异质分类器。常见的集成学习方法有Boost、Bagging、随机森林等等。其中Boost方法是主要用于二分类问题的用于减小偏差的一类方法,其主要通过将一系列基础分类器进行线性加权最终得到集成结果,并且其迭代及优化的过程有严谨的数学支撑。本文要实现的Bagging方法是一种可以减小方差的方法。而随机森林是将多个决策树回归树的结果进行集成的方法。


一、Bagging的主要思想

Bagging是并行式集成学习方法最著名的代表。该方法基于自助采样法:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中。这样经过m次随机采样操作,我们得到一个含有m个样本的采样集。初试训练集中的样本有的在采样集中多次出现,有的则从未出现。一个样本从未出现的概率为 lim ⁡ m → ∞ ( 1 − 1 m ) m = 1 e ≈ 0.268 lim_{mrightarrow infty}{(1-dfrac{1}{m})^{m}}=dfrac{1}{e} approx0.268 m→∞lim​(1−m1​)m=e1​≈0.268,也就是说,训练集中大概有63.2%的样本出现在了采样集中。
按照上述步骤,我们可以采样出 T T T个含有 m m m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些学习器进行组合。在对预测输出进行组合时,Bagging通常采用简单的投票法,即最终以数量较多的结果作为预测结果。其算法流程简化如下:
输入: 训练集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) D=(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m}) D=(x1​,y1​),(x2​,y2​),...,(xm​,ym​);
基学习算法 Σ mathcal{Sigma} Σ;
训练轮数 T T T。
过程:
1: for t=1,2,…,T do
2: h t = Σ ( D , D b s ) h_{t}=Sigma(D,D_{bs}) ht​=Σ(D,Dbs​)
3:end for
输出: H ( x ) = arg max ⁡ y ∈ Y ∑ t = 1 T I ( h t ( x ) = y ) H(x)=argmax_{yin Y}sum_{t=1}^{T}{I(h_{t}(x)=y)} H(x)=y∈Yargmax​∑t=1T​I(ht​(x)=y)

二、相关代码

可以看到,Bagging的流程其实非常简单,只需要以基学习器为基础,然后通过对训练集进行抽样出采样集,然后训练出T个基学习器,再简单搞个投票就可以了。本文使用上一篇的朴素贝叶斯分类器进行集成。

1.随机抽取采样集

代码如下:

sampleSetNum=10     #设定采样集的数量

length=data.shape[0]    #获取原数据集的样本数
columns=data.columns
dataList=[]
for i in range(sampleSetNum):
    indexs=np.random.randint(1,length,length)
    dataFrame=pd.DataFrame(columns=columns)
    for j in indexs:
        dataFrame=pd.DataFrame.append(dataFrame,data.loc[j],ignore_index=True)
    dataList.append(dataFrame)
2.生成各个采样集的贝叶斯概率表

代码如下:

pathList=[]
for i in range(sampleSetNum):
    string="../Tabel/Tabel%i.npy"%i
    pathList.append(string)


priorProbList=[]      #保存先验概率
posterProbDict=[]     #保存后验概率表
for i in range(len(dataList)):
    temp=PosteriorProbDivided(dataList[i],columns[:-1],columns[-1],pathList[i])
    priorProbList.append(temp)
    posterProbDict.append(np.load(pathList[i],allow_pickle=True).item())

3.对每个基分类器进行结果预测并集成
def EnsembleBayes(data,label,priorProbList,posterProbDict):
    length=data.shape[0]
    acc=0
    for i in range(length):
        preList=[]
        for j in range(len(priorProbList)):
            tempPre=PosteriorFind(data.loc[i],posterProbDict[j],priorProbList[j])
            preList.append(tempPre)

        pre=np.argmax(np.bincount(preList))    #找出投票数最多的标签
        if data[label][i]==pre:
            acc+=1

    ratio=acc/length
    return ratio

效果

朴素贝叶斯对鸢尾花数据集的分类正确率


Bagging对鸢尾花数据集的分类正确率

嗯…还是有所提升的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011838.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号