当前位置: 首页 > news >正文

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 

1.【集成学习】boosting与bagging_哔哩哔哩_bilibili

集成学习——boosting与bagging

强学习器:效果好,模型复杂

弱学习器:效果不是很好,模型简单

优点

        集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能。

集成学习算法需要关注的问题

        1、个体学习器如何训练得到?改变训练数据或概率分布如何改变?

        2、如何将个体学习器组合?

分类

        boosting

        个体学习器存在强依赖关系、必须串行生成序列化方法。

工作机制:

 一、提高那些在前一轮被弱分类器分错的样本权值,减小那些在前一轮被弱分类器分对的样本的权值,使误分的样本在后续受到更多的关注。体现了串行

 二、加法模型将弱分类器进行线性组合。

 举例:

        比如我们现在要去参加期末考,有三个科目。假设你有三个分身,分身A学习语文的成绩比较好,但是数学跟英语的学习比较差。这个时候我们就派分身B上场,我们可以减少他学习语文的时间,增加他学习英语数学的时间,但是我们又发现他数学学的不错,但是语文跟英语学的不好。所以这时候我们就用分身C,同样,我们加大其对英语的学习力度,减少其对语文数学的学习比重,所以学习出来就是英语学的比较好,等到我们期末考的时候我们再将其收回来也就是说组合起来再去参加期末考,这样一来语文数学英语都能得到比较高的分数。

所谓的加法模型其实就是给这些学习器附上一个相应的权重,通过相加让他们组合起来。

代表算法:

Adaboost

GBDT

XGBoost

LightGBM

bagging

个体学习器间不存在强依赖关系、可同时生成并行化方法。

        工作机制:
一、原始样本集中抽出k个训练集。
回答了我们上面所提到问题:改变训练数据或概率分布如何改变?

        意思就是假如我们这里有k个弱学习器,那我们就会抽取k个训练集

分配给这k个学习器去进行学习,他抽样过程中所采取的抽样方式是有放回抽样。

 1、有放回抽样:每轮从原始样本集中使用Bootstraping法(即自助法,是一种有放回的抽样方法可能抽到重复的样本)抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中.共进行k轮抽取,得到k个训练集.(k个训练集相互独立)

2、随机森林中,还会随即抽取一定数量的特征

 二、k个训练集分别训练,得到共k个模型体现了并行。

        

三、将上步得到的k个模型,通过一定方式组合起来。

        1、分类问题:将上步得到的k个模型采用投票的方式得到分类结果,因为我们每个人学到的东西都不一样,面对一个问题的时候,大家就需要通过投票去进行表决,有的人票权比较大 ,有的人票权就比较小,也是一种线性加权的方式组合起来。

        2、回归问题:

计算上述模型的均值作为最后的结果。

                举例:

我们上面提到我们需要给这个数据集有放回的进行采样,比如我们第一个数据集采的是第一个跟第三个样本,构建了我第一个数据集。

采样的时候他除了随机采样之外,他还会对特征进行采样,比如他随机采样了这两个特征。

最后我们的数据集拿到的是这四个格子组成的数据,也就是说他加上了对特征的随机采样。那这就是第一步,采集数据。

将我们这k个训练集分别训练,得到共k个模型,体现了并行,这几个学习器之间是互不影响的,我们可以去同时执行。这就解决了我们上面提到的第一个问题

代表:

随机森林

Adaboost

解决的是二分类问题

        数学表达:

首先其整体的模型采用的是加法模型

这里的G_{1}(X)G_{m}(X)都是弱分类器,也叫做基分类器 。

1、在每一轮中,分别记录好那些被当前弱分类器正确分类错误分类样本在下一轮训练时,提高错误分类样本的权值,同时降低正确分类样本的权值,用以训练新的弱分类器
这样一来,那些没有得到正确分类的数据,由于其权值加大,会受到后一轮的弱分类器的更大关注。

2、加权多数表决:加大分类误差率小的弱分类器的权值,使其在表决中起较大作用。减小分类误差率大的弱分类器的权值,在其表决中起较小的作用。



如何理解权值?

比如在这里我们这一开始三个样本的权值所占的比例都是一样的,都是1/3,假设经过第一轮的学习之后,其成功的将后面的(x_{2},y_{2}),(x_{3},y_{3})这两个样本进行了正确的分类,所以第二轮的时候我们就将第二轮的比例调为了1/6.学习错误的样本 ,我们就将其调整到2/3。也就调到了下面这样的样本。也就是说相当于我们改变了样本的数量,也就是我们将没有正确训练的样本的数量将其增多了。然后这两个正确分类的数量,占比就变少了。在学习的过程中,我们就会更关注被分类错误的样本。

再回到这里,我们的权值也会受到我们的分类误差率的影响,当我们的G_{m}\left ( X \right )分类误差率小的的时候就会给一个较大的权重\alpha _{m},这样做就会在最后做表决的时候起到的作用更大。

算法流程:

二分类训练数据集:

这个数据集就是T。这里面有N个训练样本。x就是我们的实例,也相当于我们的特征值。y指的是我们的标签值,因为我们这里做的是二分类,所以这里就只有两类,这里就分别为\left \{-1,+1 \right \}这两类。

定义基分类器(弱分类器)G_{\left (x \right )}

一般来讲我们这里的G_{1}\left ( x \right )G_{m}\left ( x \right )他们一般都属于同一种类型,我可以是逻辑回归,也可以是决策树。通常来讲,在你指定了基分类器具体是哪一个之后,G_{1}\left ( x \right )G_{m}\left ( x \right )用的就都是同一种。比如你这里G_{1}\left ( x \right )是逻辑回归了,那这里就都是逻辑回归了。

在我们的基分类器定下来之后,他的之后的随之的方法也就确定下来了,比如当我们的G_{}\left ( x \right )是逻辑回归的时候,我们就可以用交叉熵损失和梯度下降来进行训练,

,我们的书上也有这样一个最简单的二分类取值器,也就是说它只需要去给定一个阈值,当我们的X大于这个阈值的时候他就为1,小于这个值的时候就为-1.通过这个阈值来进行划分。这也是我们最简单的一种分类器了。

循环M次:

在上面两个都准备好了之后,我们就可以去训练我们的模型。

循环m次就是说,我们每一次去训练一个基分类器以及他的权重,然后我们有m个所以这里我们就循环m次。

1、初始化/更新当前训练数据的权值分布:

if初始化,初始化的时候我们就用D1这个权值来表示,

每一个样本我们都给其赋了权值,我们认为其是均匀的,1/N,

更新数据的权值分布:

之前我们是计算了G_{1}\left ( X \right ),之前的数据是进行了一个权值的初始化,之后我们的G_{2}\left ( X \right )需要用到的数据就不一样,我那么知道我们要提高前一轮“错误分类"的样本的权值,降低前一轮"正确分类"的样本的权值以此来构建我们的训练样本去训练我们G_{2}\left ( X \right ),如果我们不是第一次了我们就是执行我们样本更新。

这里我们D_{m}的这个m下标表示的就是第几个弱分类器训练样本的权值,然后我们这里有N个样本,每个样本都会有它的权值,这里的重点就是我们w_{m,i}这个权值的更新的这个公式,我们也可以清楚的看到这是一个递推公式,它的更新跟前一轮的权值是有关系的,看着比较复杂,但是目的就是为了满足我们下面绿色的那些字。

解释w_{m,i}

也就是说,当我们是正确分类的时候(假设为二分类问题,正确分类的标签值为1),我们的弱分类器G_{m-1}\left ( x_{i} \right )得出来的结果跟我们的标签值y_{i}是同号的,所以\frac{w_{m-1}}{Z_{m-1}}exp(-\alpha_{m-1} y_{i}G_{m-1}\left ( x_{i} \right ))=\frac{w_{m-1}}{Z_{m-1}}e^{-\alpha_{m-1} },如果是异号的那就是上图下面的结果。

我们也提到了我们的\alpha肯定也是大于0小于等于1/2的,

当我们分类正确时,当前面加了符号之后呢这个整体就是一个小于1大于0的数。

当我们分类错误时,这个整体就是大于1的

我们再来看我们的规范化因子

规范化因子

上图我们针对的是某一个样本,在下图我们针对的是所有的样本

在下图中我们将所有样本的分子部分加起来,本质上相当于是一个归一化的操作 

 其实 就是将我们下面红色部分映射到0到1之间的范围,也就相当于一个归一化的操作

2、训练当前基础分类器G_{m}\left (X \right )

紧接着我们就要拿训练的样本去训练,使用具有权值分布D_{m}的训练数据集学习,得到基分类器G_{m}\left (X \right ),那么我们应该如何训练呢,具体怎么训练就应该看我们当初选择的基分类器的类型是什么样的,如果我们用的是逻辑回归,那么我们用的就是交叉熵损失作为我们的损失函数,训练好了之后我们就要去计算我们的权值\alpha _{m}

3、计算当前基分类器的权值\alpha _{m}:

我们知道我们的\alpha _{m}由我们的分类误差率所决定,比如我我们的分类误差率比较大的话就得让我们的\alpha _{m}比较小,如果分类误差率比较小的话就说明比较准。

第一步:

所以我们先计算当前G_{m}\left ( X \right )在训练数据集上的分类误差率

这个就是我们的公式,当我们的G_{m}\left (x_{i} \right )的结果不等于我们真实值标签y_{i}的时候就说明我们分类错误了。这里面I的含义就是当括号里的条件满足的时候,这个I的值就是1,表达的意思就是在我们1到N那么多个样本里面,我们要找到他分类错误的这些点,然后让他们这些样本点的这些权值让他们加起来,这里的w_{mi}指的就是我们的权值,即样本数据的权值部分,如下图所示。所以进一步的可以写成我们最右边的那个式子。

代表的就是分类错误的那些点的权值给他进行一个相加求和。

但这里我们值得一提的是我们这里分类误差e_{m}的范围,其范围也是确定的。

这里我们的e_{m}>0我们不再解释,这里的≤0.5是如何来的呢,比如说当我们的G_{m}\left (X \right )训练出来的一个模型去做预测的时候,跟我们的的y呈现的是上图这样的关系,比如他预测的时候错了三个,只有一个是预测对了,又因为我们这里是二分类的问题,所以我们的G_{m}\left (X \right )不是-1就是1,所以我们只需要在G_{m}\left ( X\right )前面加一个负号就会从上面变换到下面的1,1,1。也就是说我们将从三个错误的结果当中变成了三个正确的一个错误的,也就是说我们 分类误差率从原本的3/4变到了1/4。也就是当我们的分类误差率大于0.5的时候就可以得到一个小于等于0.5的一个数,所以这个范围就是小于等于0.5。

将我们的分率误差率e_{m}计算出来就可以计算我们的\alpha _{m}

在这里我们对这个公式进行分析

我们画一下这个的函数图像,这里的e_{m}是未知数

然后我们又知道e_{m}是满足

故函数图像为,带入我们的e_{m}=1/2。得到他的值为1

,由上面e_{m}的定义域可以知道我们蓝色部分就是当前讨论函数的取值范围,然后我们继续探讨log的部分。

这个就是我们log的图像,然后我们的为大于等于1,所以我们的

log的部分就可以这样画。

所以他的值域就在上面的部分我们也知道\alpha _{m}就是大于等于0的。

故我们的图像也会往右边移动,所以我们的\alpha _{m}就会跟着变大

4、将\alpha _{m}G_{m}\left ( x \right )更新到加法模型f\left ( x \right )

5、判断是否满足循环退出条件:

分类器个数是否达到M:比如可以设置我们M的值,到达了循环三次,M为3,我们就退出。或者给定一个精度,当我们的准确率sign\left [ f\left ( x \right ) \right ]到达了多少的时候我们就去退出。

总分类器误差率是否低于设定的精度:因为我们这里的f\left ( x \right )他最终算出来的其实是一个数,他不是某一个类别,所以我们需要通过一个函数sign去转换到我们所需要的一个类别,比如说我们在这里sign\left [ f\left ( x \right ) \right ],它的f\left ( x \right )≥0的时候,那我们最终的结果就是1,当f\left ( x \right )<0的时候分配出来的结果就是-1。

假设我们这里循环退出的条件并没有达到,也就是说m=1的时候,那我们就接着进行第二次循环去计算G_{2}(X),我们回到上面的更新。

例题:

二分类训练数据集:

首先我们有一个二分类的训练数据集,我们需要去运用adaboost去训练出一个二分类的学习器,能够根据他给出的x能够去判断出他给出的y值是属于1还是-1

定义基分类器(弱分类器):

G\left ( X \right ),我们就采用这种最简单的二分类学习器,也就是给定义一个阈值,通过这个阈值去判断。

训练方法:

在x中划分出候选阈值,从中选出使得误差率e_{m}最小的,作为我们的最终阈值构建好G\left ( X \right )

循环M次:

m=1时:

1、初始化/更新当前[训练数据的权值分布]

if初始化:

D_{1}=\left ( w_{11}, w_{12},..., w_{110}\right )

看到我们的训练数据,可以肯定的是一个均值分布,所以是w_{1i}就是1/10

w_{1i}=0.1,i=1,2,...,10

if更新:

2、训练当前基分类器

使用具有权值分布D_{m}的训练数据集学习,得到基分类器G_{m}\left (X \right )

训练方法:在x中划分出各候选阈值,构建好各候选G_{m}\left ( X \right )。找到使误差率e_{m}最小的G_{m}\left (X \right ),作为本轮的基分类器

3、计算当前基分类器的权值

计算当前G_{m}\left ( X \right )在训练数据集上的[分类误差率]

根据这个表可以看出来,绿色部分就是我们分类错误的部分

根据分类误差率e_{m},计算基分类器G_{m}\left ( X \right )的权重系数

 

4、将\alpha _{m}G_{m}\left ( x\right )更新到加法模型f\left ( x \right )

5、判断是否满足循环退出条件

①分类器个数是否达到M

②总分类器误差率是否低于设定的精度

在这里我们使用第二个

因为这一题的最终答案是可以做到最终完全是零错误的,所以就还没有达到我们的精度要求,所以我们就继续进行下一个循环

m=2时:

1、初始化/更新当前[训练数据的权值分布]

if初始化:

将我们上一轮得到的\alpha还有G_{m}\left ( X \right )还有y_{i},还有上一轮样本数据的权值带入就可以的出来就可以得到D_{2}

if更新:

上图就是我们算出来的一个结果,就是这些

2、训练当前基分类器

使用具有权值分布D_{m}的训练数据集学习,得到基分类器G_{m}\left (X \right )

训练方法:在x中划分出各候选阈值,构建好各候选G_{m}\left ( X \right )。找到使误差率e_{m}最小的G_{m}\left (X \right ),作为本轮的基分类器

3、计算当前基分类器的权值

计算当前G_{m}\left ( X \right )在训练数据集上的[分类误差率]

我们G_{2}\left ( X \right )这个分类器还是存在着三个错误分类的点,然后我们将三个错误分类的点 三个权值给他加起来得到了e_{m}

 根据分类误差率e_{m},计算基分类器G_{m}\left ( X \right )的权重系数

4、将\alpha _{m}G_{m}\left ( x\right )更新到加法模型f\left ( x \right )

5、判断是否满足循环退出条件

①分类器个数是否达到M

②总分类器误差率是否低于设定的精度

在这里我们还是有三个错误分类的点,所以还是没有达到我们的要求,之前我们也说过这是可以达到我们的百分百分类的,所以我们继续进行循环。

m=3时:

跟上面的一样

1、初始化/更新当前[训练数据的权值分布]

2、训练当前基分类器

3、计算当前基分类器的权值

4、将\alpha _{m}G_{m}\left ( x\right )更新到加法模型f\left ( x \right )

5、判断是否满足循环退出条件

①分类器个数是否达到M

②总分类器误差率是否低于设定的精度

在这里我们还是有三个错误分类的点,所以还是没有达到我们的要求,之前我们也说过这是可以达到我们的百分百分类的,所以我们继续进行循环。

这个时候我们就发现完完全全都对的上了,就是没有错误分类的那些点了。

最终分类器

加法模型

预测函数

首先加法模型就是将很多学习器进行一个线性加权的组合,所以是一个累加的符号。

这里的b\left (x;y_{m} \right )指的就是我们Adaboost里的弱分类器,y_{m}指的就是我们弱分类器里面的训练参数

类比一下我们Adaboost的预测函数:可知道Adaboost就是一个加法模型当然他只包含线性的部分,不包含做决策的部分,因为我们最后还要通过Sign函数,唯一长得不太一样的地方就是其中的参数部分,只是我们省略没有写而已。

损失函数

自定义,y就是我们的label值(标签值),f(x)就是我们这里的加法模型

当我们面临

回归问题:我们可以使用MSE均方误差

分类问题:指数函数,交叉熵损失

损失函数我们需要看具体的情况来定,也可以定义属于自己的损失函数。

优化方法

像逻辑回归,FM,FFM等等用的就是梯度下降来优化损失函数来找到参数。

在这里我们的加法模型不太适合用梯度下降,而是适合用前向分布算法的方式。

梯度下降的缺点:整体损失极小化:

首先要把我们的目标函数写出来,所以我们需要我们的整体损失极小化,因此我们的损失函数指的是我们总体的一个损失,也就是从我们的1到M都加起来去求损失,这样一来我们的复杂度就高。

举例

假设我们的M再大一点比如说3,那我们就还要优化\beta _{3}\gamma _{3},就要同时优化3*M个参数,这也只是一个理想情况,\gamma _{1}这里只代表了一个参数,很多情况下\gamma _{1}代表的不只是一个参数,也很有可能表示的是一个向量,比如在逻辑回归里,这里代表的是很多个w,很多个特征权重值,需要同时优化的参数就非常多。

前向分布算法:

对比梯度下降(蓝色方框部分) ,我们就没有了累加的符号。

这样做会有什么效果呢?

我们刚刚说了,在我们的传统梯度下降当中,我们需要同时对β还有γ同时进行优化跟迭代。但是在我们的前向分布算法当中,我们会将这些参数进行分布的计算。比如我们会先计算\beta _{1}\gamma _{1},然后再计算\beta _{2}\gamma _{2},然后再计算\beta _{3}\gamma _{3},也就是对应了这里的循环m。也就是我们计算的时候只会拿到一个\beta一个\gamma

并且我们观察到,在这个式子里面,这个部分属于上一步得到的加法模型,上一步计算出来的东西在这一步已经是一个定值了,也就是说里面以及没有所谓的参数了,所以我们只需把精力集中在当前需要去优化的基分类器还有它的权重参数就可以了,这样也体现了一个串行的思想。

比如这个部分我们就代表了语文,我们语文已经学习的很好了,那我们下一步就是重点去学习我们其他的科目,y_{i}是标签值。

然后学完了之后我们就去更新,然后一步一步的去循环整个过程,直到把这M个给学到最后就可以得到我们总体的一个加法模型。

Adaboost算法原理解析

在讲完我们的加法模型之后,我们再来讲讲adaboost是如何利用加法模型还有前向分布算法来结合巧妙的构思从而去实现我们这两个要求的。

优化问题:二分类

二分类训练数据集,下图是其定义

在这里我们的类别标签分别用-1跟+1表示。在逻辑回归的时候,我们习惯性的用0跟1表示类别,但在Adaboost里面我们习惯性用-1跟+1表示类别。

模型:加法模型

最终分类器:

这里Sign函数的意思就是当我们上面的加法模型得到的f\left ( x\right ),当它的值是大于等于0的时候,G\left ( x \right )就属于1;当他小于0的时候,G\left ( x \right )就为-1,从而去把两个类给分开,所以我们这里的0来作为他分割类别的阈值。

损失函数:指数损失函数

二分类问题,使用指数损失函数:

,exp是以e的底的指数函数

y是标签值

当G(x)分类正确时,与y同号,L(y,f(x))≤1.

当G(x)分类错误时,与y异号,L(y,f(x))>1.

为什么不用交叉熵损失?

交叉熵损失是用极大似然估计去计算出来的一个表达式,它的分类是0跟1,不是我们的-1跟1

所以当我们标签值y为1的时候,当我们G(x)分类正确的时候,那我们对应的f(x)肯定也是一个大于等于0的一个数,故L(y,f(x))≤1,并且我们这个f(x)越大的话我们L的这个损失就会越小,反之亦然。

将损失函数视为训练数据的权值:

 这样的一个损失函数就非常适合在作为我们训练数据的权值

这个公式的意义就是我们第m轮训练数据的里面每一个训练数据的样本的权值就可以通过这个公式来进行计算。f_{m-1}\left (x_{i} \right )就是前一轮的。由这个公式就去更新我们训练数据的权重。

单个样本损失函数 

总体损失函数(把所有样本放进去)

我们有N个样本

优化方法:前向分布算法

算法流程我们之前讲加法模型的时候就讲过了

第m轮

我们将我们要极小化的损失函数放下来

L换成了exp指数函数。

式子变换:

推导过程:

求解

1、优化G_{m}\left ( X \right )

用构建好的训练样本去训练G_{m}\left ( X \right )的时侯,会得出分类误差率最小的一个效果,那就是最优的。

G_{m}\left ( X \right )本身的意义上来讲,最优的G_{m}\left ( X \right )当然要使得误差最小

当括号里面条件成立的时候I就是1,\bar{w}_{mi}指的就是样本的权重

2、优化\alpha _{m}

推导过程:

式子变换:

凸优化:

红色的部分就是我们的定值了,只有蓝色箭头的\alpha _{m}是一个变量,我们只需对这个函数的\alpha _{m}求导,让其导数等于0,就可以知道其最小值了。

导数为0

公式转换

这里我们分类误差率e_{m}就是所有分类错误的点除以样本点

3、前向更新f_{m}\left ( x \right )

4、更新训练数据权值\bar{w}_{m+1,i}

如果我们这里是第m轮的话,这里就是m+1轮

将第二个式子与我们之前的式子做对比,这个式子相比于上面的显然没有递推的关系,我们可以看一下其是如何推导出来的

注意事项

在我们的例题这里的分类误差率e_{m}跟我们算法原理解析不一样的原因是上图的w_{mi}其实是已经规范过了的,也就是说他已经将他已经映射到我们0到1之间的概率空间了,已经是一个概率了。而我们下图的\bar{w}_{mi}不是概率,而是损失。

如果要讨论这两个不同的地方,我们需要去看训练数据更新的他们的区别在哪里。分别对应的如下。

上图是例题的w_{mi},下图是算法原理里面的

我们可以看到他们之间的区别只是在于第一个他除了Z_{m-1},他的作用也只是说把其概率限制在了0到1之间,区别就是一个做了归一化一个没有做归一化,其凸优化求解过程都是一样的。

代码

资料参考:

import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, recall_score, f1_score, precision_score
import seaborn as sns
import matplotlib.pyplot as plt# 创建一些模拟的多类别数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=0,random_state=42, n_classes=3, n_clusters_per_class=1)# 将数据集分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建AdaBoost模型实例
# 使用决策树桩作为基本分类器
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=10,algorithm="SAMME", learning_rate=0.5, random_state=42)# 训练AdaBoost模型
ada_clf.fit(X_train, y_train)print("建立的弱分类器:", ada_clf.estimators_)
print("分类误差:", ada_clf.estimator_errors_)
print("分类器权重:", ada_clf.estimator_weights_)
print("迭代速率:", ada_clf.learning_rate)# 进行预测
y_pred = ada_clf.predict(X_test)print("\n---------- 模型评价 ----------")
cm = confusion_matrix(y_test, y_pred)  # 混淆矩阵
df_cm = pd.DataFrame(cm)  # 构建DataFrame
print("ConfusionMatrix", df_cm)
print('Accuracy score:', accuracy_score(y_test, y_pred))  # 准确率
print('Recall:', recall_score(y_test, y_pred, average='weighted'))  # 召回率
print('F1-score:', f1_score(y_test, y_pred, average='weighted'))  # F1分数
print('Precision score:', precision_score(y_test, y_pred, average='weighted'))  # 精确度# 绘制混淆矩阵的热图
plt.figure(figsize=(8, 6))
sns.heatmap(df_cm, annot=True, fmt="d", cmap="Blues")
plt.title("Confusion Matrix")
plt.xlabel("Predicted label")
plt.ylabel("True label")
plt.show()# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Model accuracy: {accuracy:.2f}")

参考资料

【集成学习系列教程1】AdaBoost分类算法原理及sklearn应用_adaboost sklearn-CSDN博客

Adaboost分类算法原理及代码实例 python_adaboost python-CSDN博客

集成学习算法:AdaBoost详解以及代码实现-CSDN博客

相关文章:

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…...

串口通信标准RS232 RS485 RS422的区别

很多工程师经常把RS-232、RS-422、RS-485称为通讯协议&#xff0c;其实这是不对的&#xff0c;它们仅仅是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;那它们又有哪些区别呢&#xff1a; 第一…...

jdk环境安装

jdk安装 创建软件安装的目录 mkdir -p /bigdata/{soft,server} /bigdata/soft 安装文件的存放目录 /bigdata/server 软件安装的目录 把安装的软件上传到/bigdata/soft 目录 解压到指定目录 -C :指定解压到指定目录 tar -zxvf /bigdata/soft/jdk-8u241-linux-x64.tar.gz -C /b…...

QT+网络调试助手+TCP服务器

一、UI界面设计 二、单线程 代码设计 1、 查找合法的本地地址&#xff0c;用于当作服务器的IP地址 #include <QThread> #include <QTcpSocket> #include <QNetworkInterface> #include <QMessageBox>QList<QHostAddress> ipAddressesList QNe…...

【unity】(1)场景

Unity的场景&#xff08;Scene&#xff09;是构建游戏中各种环境和级别的基础。一个场景可以包含游戏中的所有对象&#xff0c;如角色、道具、地形等。 创建和管理场景 创建新场景&#xff1a; 在Unity编辑器中&#xff0c;选择File > New Scene&#xff0c;或者使用快捷键…...

【Linux】进程间通信IPC机制

目录 一、无名管道 二、有名管道 三、共享内存 四、信号量 五、消息队列 六、套接字 一、无名管道 1.只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程)。 2.是一个单工的通信模式&#xff0c;具有固定的读端和写端。 3.管道也可以看成是一种特殊的文件…...

【如此简单!数据库入门系列】之效率基石 -- 磁盘空间管理

文章目录 1 前言2 磁盘空间管理3 磁盘空间管理的实现4 存储对象关系5 总结6 系列文章 1 前言 如何将表中的记录存储在物理磁盘上呢&#xff1f; 概念模式中&#xff0c;记录&#xff08;Record&#xff09;表示表中的一行数据&#xff0c;由多个列&#xff08;字段或者属性&…...

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(五)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 在下面的图片中&#…...

5月7日监控二叉树+斐波那契数

968.监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&#xff…...

C++类的设计编程示例

一、银行账户类 【问题描述】 定义银行账户BankAccount类。 私有数据成员&#xff1a;余额balance&#xff08;整型&#xff09;。 公有成员方法&#xff1a; 无参构造方法BankAccount()&#xff1a;将账户余额初始化为0&#xff1b; 带参构造方法BankAccount(int m)&#xff1…...

YOLOv5 V7.0 - rknn模型的验证 输出精度(P)、召回率(R)、mAP50、mAP50-95

1.简介 RKNN官方没有提供YOLOv5模型的验证工具&#xff0c;而YOLOv5自带的验证工具只能验证pytorch、ONNX等常见格式的模型性能&#xff0c;无法运行rknn格式。考虑到YOLOv5模型转换为rknn会有一定的精度损失&#xff0c;但是需要具体数值才能进行评估&#xff0c;所以需要一个…...

CUDA、CUDNN、Pytorch三者之间的关系

这个东西嘛&#xff0c;我一开始真的是一头雾水&#xff0c;安装起来真是麻烦死了。但是随着要复现的项目越来越多&#xff0c;我也不得不去学会他们是什么&#xff0c;以及他们之间的关系。 首先&#xff0c;一台电脑里面允许有多种版本的cuda存在&#xff0c;然后cuda分为run…...

vue-cli2,vue-cli3,vite 生产环境去掉console.log

console.log一般都是在开发环境下使用的&#xff0c;在生产环境下需要去除 &#xff0c;如果手动删除未免也太累了&#xff0c;我们可以用插件对于具体环境全局处理。 vue-cli2 项目build 下面webpack.prod.config.js 文件中: plugins: [new webpack.DefinePlugin({process.en…...

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …...

附录C:招聘流程

< 回到目录 附录C&#xff1a;招聘流程 _xxx_公司的招聘 使命 只雇佣顶级人才。 他们是能够胜任工作&#xff0c;并与 _&#xff08;你的公司名称&#xff09;_ 的企业文化相匹配的超级明星。 方法 记分卡。招聘经理创建一份文件&#xff0c;详细描述此职位的工作内容…...

1688快速获取整店铺列表 采集接口php Python

在电子商务的浪潮中&#xff0c;1688平台作为中国领先的批发交易平台&#xff0c;为广大商家提供了一个展示和销售商品的广阔舞台&#xff1b;然而&#xff0c;要在众多店铺中脱颖而出&#xff0c;快速获取商品列表并进行有效营销是关键。 竞争对手分析 价格比较&#xff1a;…...

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF&#xff08;Exchangeable Image File&#xff09;是…...

Ubuntu如何更换 PyTorch 版本

环境&#xff1a; Ubuntu22.04 WLS2 问题描述&#xff1a; Ubuntu如何更换 PyTorch 版本考虑安装一个为 CUDA 11.5 编译的 PyTorch 版本。如何安装旧版本 解决方案&#xff1a; 决定不升级CUDA版本&#xff0c;而是使用一个与CUDA 11.5兼容的PyTorch版本&#xff0c;您可…...

python flask css样式无效

解释&#xff1a; Flask是一个Python的轻量级Web框架&#xff0c;它没有为CSS提供任何内置的支持。如果你在Flask项目中引入了CSS文件&#xff0c;但是这个CSS没有生效&#xff0c;可能的原因有&#xff1a; 路径不正确&#xff1a;你的CSS文件没有放在正确的目录下&#xff0…...

大数据学习笔记14-Hive基础2

一、数据字段类型 数据类型 &#xff1a;LanguageManual Types - Apache Hive - Apache Software Foundation 基本数据类型 数值相关类型 整数 tinyint smallint int bigint 小数 float double decimal 精度最高 日期类型 date 日期 timestamps 日期时间 字符串类型 s…...

vue3 下载图片(包括多图片下载)

单图片下载 //使用 download(https://img1.baidu.com/it/u1493209339,2544178769&fm253&app138&sizew931&n0&fJPEG&fmtauto?sec1715101200&t854f3434686cfd2cba9d6a528597d15c)//下载逻辑 const download async (modelUrl) > {const respons…...

LabVIEW如何通过子VI更改主VI控件属性?

在LabVIEW中&#xff0c;可以通过使用Local Variable或Property Node来实现主VI控件属性的更改。这些方法可以在主VI和子VI之间传递数据和控件属性。 Local Variable: 使用Local Variable可以在子VI中直接访问并修改主VI中的控件属性。在子VI中创建Local Variable&#xff0c;并…...

关于MS-DOS时代的回忆

目录 一、MS-DOS是什么&#xff1f; 二、MS-DOS的主要功能有哪些&#xff1f; 三、MS-DOS的怎么运行的&#xff1f; 四、微软开源MS-DOS源代码 五、高手与漂亮女同学 一、MS-DOS是什么&#xff1f; MS-DOS&#xff08;Microsoft Disk Operating System&#xff09;是微软公…...

数据库索引(Mysql)

简述:数据库索引是加速数据检索,提高查询效率的一种数据结构 语法规则 创建索引 --通用语法规则 --[内容] 可选参数 --UNIQUE: 可选关键字&#xff0c;用于创建唯一索引&#xff0c;确保索引列的值是唯一的 CREATE [UNIQUE] INDEX 索引名 ON 表名(字段名,...) [ASC | DESC];…...

异常-Exception

异常介绍 基本概念 Java语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09;执行过程中所发生的异常事件可分为两大类 1&#xff0c;Error&#xff08;错误&#xff09;&#xff1a;Java虚拟机无法…...

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…...

第十三章 计算机网络

这里写目录标题 1.网络设备2.协议簇2.1电子邮件(传输层)2.2地址解析(网际层)2.3DHCP(动态主动配置协议)2.4URL(统一资源定位器)2.5IP地址和子网掩码 1.网络设备 物理层&#xff1a;中继器&#xff0c;集线器(多路中继器) 数据链路层&#xff1a;网桥&#xff0c;交换机(多端口…...

商品详情 API 返回值说明

商品详情API接口在多个领域和场景中都有广泛的应用&#xff0c;以下是一些常见的应用场景&#xff1a; 竞品分析&#xff1a;企业可以利用商品详情API接口获取竞品的所有详细信息&#xff0c;如价格、发货地、上架时间、销售量等。通过分析这些竞品信息&#xff0c;企业可以更…...

层级实例化静态网格体组件:开启大量模型处理之门

前言 在数字孪生的世界里&#xff0c;我们常常需要构建大量的模型来呈现真实而丰富的场景。然而&#xff0c;当使用静态网格体 &#xff08;StaticMesh &#xff09;构建大量模型时&#xff0c;可能会遇到卡顿的问题&#xff0c;这给我们带来了不小的困扰&#x1f623;。那么&…...

【网络知识】光猫、路由器 和 交换机 的作用和区别?

数字信号&#xff1a;是指自变量是离散的、因变量也是离散的信号&#xff0c;这种信号的自变量用整数表示&#xff0c;因变量用有限数字中的一个数字来表示。在计算机中&#xff0c;数字信号的大小常用有限位的二进制数表示。 模拟信号&#xff1a;模拟信号是指用连续变化的物…...

初识Electron,创建桌面应用

历史小剧场 呜呼&#xff01;古有匈奴犯汉&#xff0c;晋室不纲&#xff0c;铁木夺宋&#xff0c;虏清入关&#xff0c;神舟陆沉二百年有余&#xff0c;中国之见灭于满清初非满人能灭之&#xff0c;能有之也因有汉奸以作虎怅&#xff0c;残同胞媚异种&#xff0c;始有吴三桂洪承…...

AI编码时代到来?实现编程梦想的利器—Baidu Comate测评

文章目录 Comate智能编码是什么&#xff1f;Comate支持的环境 Comate应用安装实际操作对话式生成代码生成代码注释智能单测项目测试调优功能 总结 Comate智能编码是什么&#xff1f; 在如今这个拥抱AI的时代&#xff0c;市面上已经产出了很多Ai代码助手&#xff0c;如果你还没…...

去中心化自治组织(DAO)

文章目录 一、DAO (Decentralized Autonomous Organization) 去中心化自治组织 二、举例说明 1、例子1 2、例子2 总结 一、DAO (Decentralized Autonomous Organization) 去中心化自治组织 DAO是一种基于区块链平台上的组织结构&#xff0c;它通过智能合约来实现组织的…...

MySQL之多表查询

1. 前言 多表查询&#xff0c;也称为关联查询.指两个或两个以上的表一起完成查询操作.前提条件 : 这些一起查询的表之间是有关系的(一对一/一对多).他们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;也可能没有建立外键. 2. 笛卡尔积现象(交叉连接…...

极端天气频发,我们普通人如何保全自己

随着全球气候变暖的加剧&#xff0c;极端天气事件如同一位不请自来的“不速之客”&#xff0c;频繁地闯入我们的生活。暴风雨、暴风雪、台风、干旱、热浪等极端天气现象&#xff0c;不仅给人们的生命和财产安全带来了前所未有的挑战&#xff0c;更对社会的正常秩序构成了严重威…...

直面市场乱价,品牌商家该如何解决?

在当今的商业世界中&#xff0c;品牌商面临着一系列严峻挑战&#xff0c;其中如何有效管理经销商价格是一个关键难题。经销商随意调整价格的行为&#xff0c;不仅会损害品牌的信誉与形象&#xff0c;还可能导致市场秩序混乱&#xff0c;使品牌利润大幅缩水。因此&#xff0c;采…...

Spring中的Bean相关理解

在Spring框架中&#xff0c;Bean是一个由Spring IoC容器实例化、配置和管理的对象。Bean是一个被Spring框架管理并且被应用程序各个部分所使用的对象。Spring IoC容器负责Bean的创建、初始化、依赖注入以及销毁等生命周期管理。 注&#xff1a;喜欢的朋友可以关注公众号“JAVA学…...

操作系统实战(二)(linux+C语言)

实验内容 通过Linux 系统中管道通信机制&#xff0c;加深对于进程通信概念的理解&#xff0c;观察和体验并发进程间的通信和协作的效果 &#xff0c;练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…...

哪些情况下会触发MySQL的预读机制?

MySQL的预读机制主要与其底层存储引擎的实现有关&#xff0c;尤其是InnoDB存储引擎。预读&#xff08;Pre-reading&#xff09;或预取&#xff08;Prefetching&#xff09;是一种性能优化技术&#xff0c;其中数据库系统主动读取可能很快就会被查询到的数据页到缓冲池&#xff…...

react使用谷歌人机验证

在项目中&#xff0c;需要对请求验证&#xff0c;防止被爆破&#xff0c;这里使用的是谷歌的recaptcha-v3。 1.申请谷歌人机验证的api 申请链接,申请完后需要将两个谷歌颁发的key分别写入前&#xff0c;后端的配置环境中&#xff0c;后面会使用. 2.前端部分 前端使用的是viteC…...

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…...

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model&#xff0c;是指包含超大规模参数&#xff08;通常在十亿个以上&#xff09;的神经网络模型。2022年11月底&#xff0c;人工智能对话聊天机器人ChatGPT一经推出&#xff0c;人们利用ChatGPT这样的大模型帮助解决很多事情&am…...

图像处理:时域、空域、频率的滤波介绍

首先要搞清楚为什么会呈现出不同域的维度&#xff0c;来理解和处理图像&#xff0c;原因是图像的构成有多个维度的信息特点。比如一段视频从时间顺序来看&#xff0c;相邻的2个图像帧绝大部分信息是相同的&#xff0c;这就构成了前向预测的理论基础&#xff1b;比如一帧图像从空…...

TC8002D 是一颗带关断模式的音频功放IC

一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时&#xff0c;负载(3Ω)上的平均功率 为3 W&#xff0c;且失真度不超过10%。而对于手提设备而言&#xff0c;当VDD作用于关断端时&#xff0c;TC8002D将会进入关断模式&#xff0c;此时的功耗极…...

深度学习之基于Vgg19预训练卷积神经网络图像风格迁移系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在数字艺术和图像处理领域&#xff0c;图像风格迁移技术一直备受关注。该技术可以将一幅图像的内容和…...

MySQL:多表查询练习

#1.出版社信息 与 图书信息 交叉连接 select * from 出版社信息 cross join 图书信息; #2.从“客户信息”和“订单信息”两张数据表中查询购买了商品的客户信息&#xff0c;要求查询结果显示客户姓名、订单编号、订单状态。 select 客户信息.客户姓名,订单信息.订单编号,订单…...

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;八&#xff09;Sentinel&#xff08;1&#xff09; 一、sentinel&#xff1a;概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1&#xff09;2018年底 Netflix 官方宣布 Hystrix 已经足够稳定&#xff0c;不再积极开发 Hys…...

[微信小程序] 入门笔记2-自定义一个显示组件

[微信小程序] 入门笔记2-自定义一个显示组件 0. 准备工程 新建一个工程,删除清空app的内容和其余文件夹.然后自己新建pages和components创建1个空组件和1个空页面. 设定 view 组件的默认样式,使其自动居中靠上,符合习惯.在app.wxss内定义,作用做个工程. /**app.wxss**/ /* 所…...

YOLO代码复现

睿智的目标检测66——Pytorch搭建YoloV8目标检测平台_pytorch_quantization yolov8-CSDN博客 Mask rcnn代码实现_pytorch版_适用30系列显卡_mask rcnn 30显卡-CSDN博客 完整且详细的Yolov8复现训练自己的数据集-CSDN博客...

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…...