头歌-机器学习 第12次实验 Adaboost算法

news2025/2/26 15:43:49

第1关:什么是集成学习

任务描述

本关任务:根据本节课所学知识完成本关所设置的选择题。

相关知识

为了完成本关任务,你需要掌握:1.什么是集成学习。

什么是集成学习

集成学习方法是一种常用的机器学习方法,分为baggingboosting两种方法,应用十分广泛。集成学习基本思想是:对于一个复杂的学习任务,我们首先构造多个简单的学习模型,然后再把这些简单模型组合成一个高效的学习模型。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。

集成学习采取投票的方式来综合多个简单模型的结果,按bagging投票思想,如下面例子:

假设一共训练了5个简单模型,每个模型对分类结果预测如上图,则最终预测结果为: A:2 B:3 3>2 结果为B

不过在有的时候,每个模型对分类结果的确定性不一样,即有的对分类结果非常肯定,有的不是很肯定,说明每个模型投的一票应该是有相应的权重来衡量这一票的重要性。就像在歌手比赛中,每个观众投的票记1分,而专家投票记10分。按boosting投票思想,如下例:

A:(0.9+0.4+0.3+0.8+0.2)/5=0.52 B:(0.1+0.6+0.7+0.2+0.8)/5=0.48 0.52>0.48 结果为A

闯关要求

根据所学知识完成右侧选择题!!!

1、对于一个二分类问题,假如现在训练了500个子模型,每个模型权重大小一样。若每个子模型正确率为51%,则整体正确率为多少?若把每个子模型正确率提升到60%,则整体正确率为多少?(C)


A、51%,60%

B、60%,90%

C、65.7%,99.99%

D、65.7%,90%

第2关: Boosting

任务描述

本关任务:根据本节课所学知识完成本关所设置的选择题。 ####相关知识 为了完成本关任务,你需要掌握:1.Boosting。 #####Boosting 提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。

历史上,KearnsValiant首先提出了强可学习弱可学习的概念。指出:在PAC学习的框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。

这样一来,问题便成为,在学习中,如果已经发现了弱学习算法,那么能否将它提升强学习算法。大家知道,发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。

bagging不同,boosting采用的是一个串行训练的方法。首先,它训练出一个弱分类器,然后在此基础上,再训练出一个稍好点的弱分类器,以此类推,不断的训练出多个弱分类器,最终再将这些分类器相结合,这就是boosting的基本思想,流程如下图:

可以看出,子模型之间存在强依赖关系,必须串行生成。boosting是利用不同模型的相加,构成一个更好的模型,求取模型一般都采用序列化方法,后面的模型依据前面的模型。

1、现在有一份数据,你随机的将数据分成了n份,然后同时训练n个子模型,再将模型最后相结合得到一个强学习器,这属于boosting方法吗?(B)

A、是

B、不是

C、不确定

第3关:Adaboost算法流程

任务描述

本关任务:用Python实现Adaboost,并通过鸢尾花数据集中鸢尾花的2种属性与种类对Adaboost模型进行训练。我们会调用你训练好的Adaboost模型,来对未知的鸢尾花进行分类。

相关知识

为了完成本关任务,你需要掌握:1.Adaboost算法原理,2.Adaboost算法流程。

数据集介绍

数据集为鸢尾花数据,一共有150个样本,每个样本有4个特征,由于Adaboost是一个串行的迭代二分类算法,运算成本较大,为了减轻运算成本,我们只利用其中两个特征与两种类别构造与训练模型,且adaboost算法返回的值为1-1,所以要将标签为0的数据改为-1部分数据如下图:

数据获取代码:

 
  1. #获取并处理鸢尾花数据
  2. def create_data():
  3. iris = load_iris()
  4. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  5. df['label'] = iris.target
  6. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  7. data = np.array(df.iloc[:100, [0, 1, -1]])
  8. #将标签为0的数据标签改为-1
  9. for i in range(len(data)):
  10. if data[i,-1] == 0:
  11. data[i,-1] = -1
  12. return data[:,:2], data[:,-1]
Adaboost算法原理

对提升方法来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或概率分布;二是如何将弱分类器组合成一个强分类器。关于第1个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。于是,分类问题被一系列的弱分类器“分而治之”。至于第2个问题,即弱分类器的组合,AdaBoost采取加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用

Adaboost算法流程

AdaBoostAdaptiveBoost的缩写,表明该算法是具有适应性的提升算法。

算法的步骤如下:

1.给每个训练样本(x1​,x2​,..,xN​)分配权重,初始权重w1​均为1/N

2.针对带有权值的样本进行训练,得到模型Gm​(初始模型为$$G _1$$)

3.计算模型Gm​的误分率:

em​=i∑N​wi​I(yi​​=GM​(Xi​))

其中:

I(yi​​=GM​(Xi​)

为指示函数,表示括号内成立时函数值为1,否则为0

4.计算模型Gm​的系数:

αm​=21​log[em​1−em​​]

5.根据误分率e和当前权重向量wm​更新权重向量:

wm+1,i​=zm​wm​​exp(−αm​yi​Gm​(xi​))

其中Zm​为规范化因子:

zm​=i=1∑m​wmi​exp(−αm​yi​Gm​(xi​))

6.计算组合模型f(x)=∑m=1M​αm​Gm​(xi​)的误分率

7.当组合模型的误分率或迭代次数低于一定阈值,停止迭代;否则,回到步骤 2

编程要求

根据提示,在右侧编辑器补充 Python 代码,实现Adaboost算法,并利用训练好的模型对鸢尾花数据进行分类。

测试说明

只需返回分类结果即可,程序内部会检测您的代码,预测正确率高于95%视为过关。

#encoding=utf8

import numpy as np

#adaboost算法
class AdaBoost:
    '''
    input:n_estimators(int):迭代轮数
          learning_rate(float):弱分类器权重缩减系数
    '''
    def __init__(self, n_estimators=50, learning_rate=1.0):
        self.clf_num = n_estimators
        self.learning_rate = learning_rate
    
    def init_args(self, datasets, labels):
        
        self.X = datasets
        self.Y = labels
        self.M, self.N = datasets.shape
        
        # 弱分类器数目和集合
        self.clf_sets = []
        
        # 初始化weights
        self.weights = [1.0/self.M]*self.M
        
        # G(x)系数 alpha
        self.alpha = []    
    def _G(self, features, labels, weights):
        '''
        input:features(ndarray):数据特征
              labels(ndarray):数据标签
              weights(ndarray):样本权重系数
        '''
        #********* Begin *********#
        m = len(features)
        error = 100000.0 # 无穷大
        beat_v = 0.0
        #单维features
        features_min = min(features)
        features_max = max(features)
        n_step = (features_max-features_min+self.learning_rate) // self.learning_rate
        direct,compare_array = None,None
        for i in range(1,int(n_step)):
            v = features_min + self.learning_rate * i

            if v not in features:
                # 误分类计算
                compare_array_positive = np.array(
                    [1 if features[k] > v else -1 for k in range(m)])
                weight_error_positive = sum([
                    weights[k] for k in range(m)
                    if compare_array_positive[k] != labels[k]
                ])

                compare_array_nagetive = np.array(
                    [-1 if features[k] > v else 1 for k in range(m)])
                weight_error_nagetive = sum([
                    weights[k] for k in range(m)
                    if compare_array_nagetive[k] != labels[k]
                ])

                if weight_error_positive < weight_error_nagetive:
                    weight_error = weight_error_positive
                    _compare_array = compare_array_positive
                    direct = 'positive'
                else:
                    weight_error = weight_error_nagetive
                    _compare_array = compare_array_nagetive
                    direct = 'nagetive'

                # print('v:{} error:{}'.format(v, weight_error))
                if weight_error < error:
                    error = weight_error
                    compare_array = _compare_array
                    best_v = v
        return best_v, direct, error, compare_array
    # 计算alpha
    def _alpha(self, error):
        return 0.5 * np.log((1 - error) / error)

    # 规范化因子
    def _Z(self, weights, a, clf):
        return sum([
            weights[i] * np.exp(-1 * a * self.Y[i] * clf[i])
            for i in range(self.M)
        ])

    # 权值更新
    def _w(self, a, clf, Z):
        for i in range(self.M):
            self.weights[i] = self.weights[i] * np.exp(
                -1 * a * self.Y[i] * clf[i]) / Z

    # G(x)的线性组合
    def _f(self, alpha, clf_sets):
        pass

    def G(self, x, v, direct):
        if direct == 'positive':
            return 1 if x > v else -1
        else:
            return -1 if x > v else 1

    def fit(self, X, y):
        self.init_args(X, y)

        for epoch in range(self.clf_num):
            axis = 0
            final_direct = 'null'
            best_clf_error, best_v, clf_result = 100000, None, None
            # 根据特征维度, 选择误差最小的
            for j in range(self.N):
                features = self.X[:, j]
                # 分类阈值,分类误差,分类结果
                v, direct, error, compare_array = self._G(
                    features, self.Y, self.weights)

                if error < best_clf_error:
                    best_clf_error = error
                    best_v = v
                    final_direct = direct
                    clf_result = compare_array
                    axis = j  # axis数字代表第几个属性列

                # print('epoch:{}/{} feature:{} error:{} v:{}'.format(epoch, self.clf_num, j, error, best_v))
                if best_clf_error == 0:
                    break

            # 计算G(x)系数a
            a = self._alpha(best_clf_error)
            self.alpha.append(a)
            # 记录分类器
            self.clf_sets.append((axis, best_v, final_direct))
            # 规范化因子
            Z = self._Z(self.weights, a, clf_result)
            # 权值更新
            self._w(a, clf_result, Z)
                

        #********* End *********#            
    def predict(self, feature):
        result = 0.0
        for i in range(len(self.clf_sets)):
            axis, clf_v, direct = self.clf_sets[i]
            f_input = feature[axis]
            result += self.alpha[i] * self.G(f_input, clf_v, direct)
        # sign
        return 1 if result > 0 else -1
    
    def score(self, X_test, y_test):
        right_count = 0
        for i in range(len(X_test)):
            feature = X_test[i]
            if self.predict(feature) == y_test[i]:
                right_count += 1
        
        return right_count / len(X_test)





























第4关:sklearn中的Adaboost

任务描述

本关任务:你需要调用sklearn中的Adaboost模型,并通过鸢尾花数据集中鸢尾花的2种属性与种类对Adaboost模型进行训练。我们会调用你训练好的Adaboost模型,来对未知的鸢尾花进行分类。

相关知识

为了完成本关任务,你需要掌握:1.AdaBoostClassifier

数据介绍

数据集为鸢尾花数据,一共有150个样本,每个样本有4个特征,由于Adaboost是一个串行的迭代二分类算法,运算成本较大,为了减轻运算成本,我们只利用其中两个特征与两种类别构造与训练模型,且adaboost算法返回的值为1-1,所以要将标签为0的数据改为-1部分数据如下图:

数据获取代码:

 
  1. #获取并处理鸢尾花数据
  2. def create_data():
  3. iris = load_iris()
  4. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  5. df['label'] = iris.target
  6. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  7. data = np.array(df.iloc[:100, [0, 1, -1]])
  8. #将标签为0的数据标签改为-1
  9. for i in range(len(data)):
  10. if data[i,-1] == 0:
  11. data[i,-1] = -1
  12. return data[:,:2], data[:,-1]
AdaBoostClassifier

AdaBoostClassifier 的构造函数中有四个常用的参数可以设置:

  • algorithm:这个参数只有 AdaBoostClassifier 有。主要原因是scikit-learn 实现了两种 Adaboost 分类算法,SAMMESAMME.R。两者的主要区别是弱学习器权重的度量,SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此 AdaBoostClassifier 的默认算法algorithm的值也是SAMME.R
  • n_estimators:弱学习器的最大迭代次数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50
  • learning_rate: AdaBoostClassifier 和 AdaBoostRegressor 都有,即每个弱学习器的权重缩减系数ν,默认为1.0
  • base_estimator:弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是 CART 决策树或者神经网络 MLP。

sklearn中其他分类器一样,AdaBoostClassifier 类中的fit函数用于训练模型,fit函数有两个向量输入:

  • X:大小为**[样本数量,特征数量]**的ndarray,存放训练样本
  • Y:值为整型,大小为[样本数量]的ndarray,存放训练样本的分类标签

AdaBoostClassifier 类中的predict函数用于预测,返回预测标签,predict函数有一个向量输入:

X:大小为**[样本数量,特征数量]**的ndarray,存放预测样本 AdaBoostClassifier的使用代码如下:

 
  1. ada=AdaBoostClassifier(n_estimators=5,learning_rate=1.0)
  2. ada.fit(train_data,train_label)
  3. predict = ada.predict(test_data)
编程要求

填写ada_classifier(train_data,train_label,test_data)函数完成鸢尾花分类任务,其中:

  • train_data:训练样本
  • train_label:训练标签
  • test_data:测试样本
测试说明

只需返回预测结果即可,程序内部会检测您的代码,预测正确率高于95%视为过关。

#encoding=utf8
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

def ada_classifier(train_data,train_label,test_data):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
          test_data(ndarray):测试标签
    output:predict(ndarray):预测结果
    '''
    #********* Begin *********#
    ada=AdaBoostClassifier(base_estimator=DecisionTreeClassifier
         (max_depth=2,min_samples_split=10,min_samples_leaf=5),
         n_estimators=50,learning_rate=0.2)
    ada.fit(train_data,train_label)
    predict=ada.predict(test_data)

    

    #********* End *********# 
    return predict

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3新手笔记

setup&#xff08;&#xff09;{}函数&#xff0c;是启动页面后&#xff0c;自动执行的一个函数。所有数据&#xff08;常量、变量&#xff09;、函数等等&#xff0c;都要return 出去。 ref函数(可用于基本数据类型&#xff0c;也可以用于复杂数据类型)&#xff1a;让页面上的…

【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss

往期回顾&#xff1a; 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton点击按钮弹出菜单-CSDN博客 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-CSDN博客 【QT入门】 Qt自定义控件与样式…

MPT - 原理及应用

前文回顾 Merkle原理及应用Merkle代码实现Patricia原理及应用Patricia代码实现 什么是MPT&#xff08;Merkle Patricia Tree&#xff09;树 MPT树是一种数据结构&#xff0c;用于在以太坊区块链中高效地存储和检索账户状态、交易历史和其他重要数据。MPT树的设计旨在结合Merk…

激光点云-无监督语义分割方法

深度学习和人工智能是点云分割的良好且强大的解决方案,但语义分割对于数据处理方式能否更加简单和快速?如今,我们仍然关注深度学习,但人工智能是以数据为中心的。生成这些数据是一个劳动密集型的解决方案,我们是否可以尝试采用简单的无监督语义分割来有效地“预标记”点云…

【noVNC】使用noVNC实现浏览器远程VNC(基于web的远程桌面)

一、操作的环境 windows 10系统乌班图 Ubuntu 22 二、noVNC 部署方式 原理&#xff1a;开启 Websockify 代理来做 WebSocket 和 TCP Socket 之间的转换 2.1 noVNC和VNC服务端同一台机器 使用方式&#xff0c;查看另一篇博文 &#xff1a;【noVNC】使用noVNC实现浏览器网页访…

基于8086方波信号发生器仿真设计

**单片机设计介绍&#xff0c;基于8086方波信号发生器仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 二、功能设计 文件夹内包含工程文件&#xff0c;可直接运行或者二次开发&#xff1b; 此设计可作为毕业设计和课程…

从“看见”工程活动和研发模式开始,提升团队工程交付能力

提升团队工程交付能力&#xff0c;从“看见”工程活动和研发模式开始 理想中的研发团队应当具有以下特征&#xff1a; 总是工作在最高优先级的事项上理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力&#x…

andorid 矢量图fillColor设置无效

问题&#xff1a;andorid 矢量图fillColor设置无效 解决&#xff1a;去掉如下 android:tint一行

考研数学|全程跟汤家凤,还是强化换张宇?

考研高数的复习策略因人而异&#xff0c;选择跟哪位老师的课程取决于个人的学习习惯、基础水平和目标院校的要求。 汤家凤老师的教学特点是注重基础知识的讲解和概念的理解&#xff0c;适合基础薄弱或者零基础的考生。他的课程通常从基础概念讲起&#xff0c;逐步深入&#xf…

手动实现简易版RPC(上)

手动实现简易版RPC(上) 前言 什么是RPC&#xff1f;它的原理是什么&#xff1f;它有什么特点&#xff1f;如果让你实现一个RPC框架&#xff0c;你会如何是实现&#xff1f;带着这些问题&#xff0c;开始今天的学习。 本文主要介绍RPC概述以及一些关于RPC的知识&#xff0c;为…

前端代码规范系列,今天聊聊代码注释

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

一文带你了解Material, Texture Mapping, Shading, Shader

作者&#xff1a;caven chen 在计算机图形学和三维开发过程中&#xff0c;有几个容易混淆的概念。今天我们来一举拿下。 又可以学习新的知识啦。冲鸭。。。。。。 基础概念 首先我们来介绍一些基础概念: 英文 中文 本质 释义 Material 材质 数据集 表现物体对光的交互…

勒索软件漏洞?在不支付赎金的情况下解密文件

概述 在上一篇文章中&#xff0c;笔者对BianLian勒索软件进行了研究剖析&#xff0c;并且尝试模拟构建了一款针对BianLian勒索软件的解密工具&#xff0c;研究分析过程中&#xff0c;笔者感觉构建勒索软件的解密工具还挺有成就感&#xff0c;因此&#xff0c;笔者准备再找一款…

Elasticsearch8.x 设置密码

文章目录 一、环境说明二、使用elasticsearch-reset-password工具修改1、elasticsearch-reset-password工具位置2、设置密码 一、环境说明 elasticsearch版本&#xff1a;8.13.0 系统版本&#xff1a;Ubuntu 18.04.6 二、使用elasticsearch-reset-password工具修改 1、elast…

Mac环境 llamafile 部署大型语言模型LLM

文章目录 Github官网本地部署 llamafile 是一种可在你自己的电脑上运行的可执行大型语言模型&#xff08;LLM&#xff09;&#xff0c;它包含了给定的开放 LLM 的权重&#xff0c;以及运行该模型所需的一切。让人惊喜的是&#xff0c;你无需进行任何安装或配置。 Github https…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(1)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(1) 零、00时光宝盒 1009 Rejections 1009 拒绝 Once, there was an old man, who was broke, living in a tiny house and owned a beat-up car. 有一次&#xff0c;有一个老人&#xff0c;他破产了&#…

VTK 动画:框架、流程与实现

VTK 动画&#xff1a;框架、流程与实现 VTK 动画&#xff1a;框架、流程与实现vtkAnimationCue 和 vtkAnimationScene 简介vtkAnimationScene 类的重要方法vtkAnimationCue 类的重要方法VTK 动画的基本流程实例&#xff1a;一个简单的 VTK 动画演示程序 VTK是一个非常强大的图形…

报表控件 Stimulsoft 常见问题:从代码启用缓存

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Day 20 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉…

django模板的继承

模板的继承 我们在访问一些访问的网站 这些网站页面整体都差不多 &#xff0c; 只是某一些局部在变化。 模板的继承&#xff0c; 就是自己先选好一个想要继承的模板页面 {% extends home.html %}​ 在继承之后子页面跟模板页面长的是一模一样的&#xff0c; 你需要在模板页面…