《机器学习公式推导与代码实现》chapter10-AdaBoost

news2024/11/25 16:28:21

《机器学习公式推导与代码实现》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。

AdaBoost

将多个单模型组合成一个综合模型的方式早已成为现代机器学习模型采用的主流方法-集成模型(ensemble learning)。AdaBoost是集成学习中Boosting框架的一种经典代表。

1 Boosting

集成学习将多个弱分类器组合成一个强分类器,这个强分类器能取所有弱分类器之所长,达到相对最优性能。我们将Boosting理解为一类将弱分类器提升为强分类器的算法,Boosting算法也叫提升算法。简单来说,Boosting就是串行训练一系列弱分类器,使得被先前弱分类器分类错误的样本在后续得到更多关注,最后将这些分类器组合成最优强分类器的过程。

2 AdaBoost算法原理

AdaBoost全称Adaptive Boosting,翻译为自适应提升算法。AdaBoost是一种通过改变训练样本权重来学习多个弱分类器并线性组合成强分类器的Boosting算法。
Boosting方法的两个关键问题:一是在训练过程中如何改变样本的权重或者概率分布,二是如何将多个弱分类器组合成一个强分类器。
AdaBoost一是提高前一轮被弱分类器分类错误的样本的权重,而降低分类正确的样本的权重,二是对多个弱分类器进行线性组合,提高分类效果好的弱分类器的权重,降低分类误差率高的弱分类器的权重。
在这里插入图片描述
在这里插入图片描述
AdaBoost是以加性模型为模型、指数函数为损失函数、前向分步为算法的分类学习模型。
加性模型(additive model)是由多个基模型求和的形式构造起来的模型。
在这里插入图片描述
在这里插入图片描述

3 AdaBoost算法实现

首先需要先定义基分类器,一般可用一棵决策树或者决策树桩(dicision stump)作为基分类器,决策树桩是一种仅具有单层决策结构的决策树,它仅在一个特征上进行分类决策。而决策树则是一种多层决策结构的树形分类模型,它可以在多个特征上进行分类决策。

# 定义决策树桩类
class DecisionStump: # 作为AdaBoost的弱分类器
    def __init__(self):
        self.label = 1 # 基于划分阈值决定将样本分类为1还是-1
        self.feature_index = None # 特征索引
        self.threshold = None # 特征划分阈值
        self.alpha = None # 基分类器的权重

AdaBoost的经典版算法流程,包括权重初始化训练弱分类器计算当前分类误差计算弱分类器的权重更新训练样本权重

import numpy as np
class Adaboost:

    def __init__(self, n_estimators=5): # 弱分类器个数
        self.n_estimators = n_estimators
    
    def fit(self, X, y): # adaboost拟合函数
        m, n = X.shape
        w = np.full(m, (1/m)) # (1)初始化权重分布为均匀分布1/N
        self.estimators = [] # 初始化基分类器列表
        for _ in range(self.n_estimators):
            estimator = DecisionStump() # (2.a) 训练一个弱分类器:决策树桩
            min_error = float('inf') # 设定一个最小化误差
            for i in range(n): # 遍历数据集特征,根据最小分类误差率选择最优特征
                unique_values = np.unique(X[:, i])
                for threshold in unique_values: # 尝试将每一个特征值作为分类阈值
                    p = 1
                    pred = np.ones(np.shape(y)) # 初始化所有预测值为1
                    pred[X[:, i] < threshold] = -1 # 小于分类阈值的预测值为-1
                    error = sum(w[y != pred]) # (2.b) 计算分类误差率
                    if error > 0.5: # 如果分类误差率大于0.5,则进行正负预测反转,例如error = 0.6 => (1 - error) = 0.4
                        error = 1 - error
                        p = -1
                    if error < min_error: # 一旦获得最小误差,则保存相关参数配置
                        estimator.label = p
                        estimator.threshold = threshold
                        estimator.feature_index = i
                        min_error = error
                        
            estimator.alpha = 0.5 * np.log((1.0 - min_error) / (min_error + 1e-9)) # (2.c)计算基分类器的权重
            preds = np.ones(np.shape(y)) # 初始化所有预测值为1
            negative_idx = (estimator.label * X[:, estimator.feature_index] < estimator.label * estimator.threshold) # 获取所有小于阈值的负类索引
            preds[negative_idx] = -1 # 将负类设为-1
            w *= np.exp(-estimator.alpha * y * preds) # (10-5)
            w /= np.sum(w)
            self.estimators.append(estimator) # 保存该弱分类器

    def predict(self, X): # 定义adaboost预测函数
        m = len(X)
        y_pred = np.zeros((m, 1))
        for estimator in self.estimators: # 计算每个基分类器的预测值
            predictions = np.ones(np.shape(y_pred)) # 初始化所有预测值为1
            negative_idx = (estimator.label * X[:, estimator.feature_index] < estimator.label * estimator.threshold) # 获取所有小于阈值的负类索引
            predictions[negative_idx] = -1 # 将负类设为-1
            y_pred += estimator.alpha * predictions # 对每个基分类器的预测结果进行加权
        y_pred = np.sign(y_pred) # 返回最终预测结果
        return y_pred
from sklearn.model_selection import train_test_split
from sklearn.datasets._samples_generator import make_blobs # 导入模拟二分类数据生成模块
from sklearn.metrics import accuracy_score
X, y = make_blobs(n_samples=150, n_features=2, centers=2, cluster_std=1.2, random_state=40) # 生成模拟二分类数据集
y_ = y.copy()
y_[y_==0] = -1
y_ = y_.astype(float)
X_train, X_test, y_train, y_test = train_test_split(X, y_, test_size=0.3, random_state=40)
clf = Adaboost(n_estimators=5)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(accuracy)
0.9777777777777777

4.基于sklearn实现AdaBoost算法

AdaBoost分类模型在sklearnensembleAdaBoostClassifier模块下调用。

from sklearn.ensemble import AdaBoostClassifier
clf_ = AdaBoostClassifier(n_estimators=5, random_state=40)
y_pred_ = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(accuracy)
0.9777777777777777

使用最广泛的弱分类器是决策树和神经网络,决策树使用CART。
笔记本_Github地址

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

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

相关文章

python获取热搜数据并保存成Excel

python获取百度热搜数据 一、获取目标、准备工作二、开始编码三、总结 一、获取目标、准备工作 1、获取目标&#xff1a; 本次获取教程目标&#xff1a;某度热搜 2、准备工作 环境python3.xrequestspandas requests跟pandas为本次教程所需的库&#xff0c;requests用于模拟h…

牛客网基础语法51~60题

牛客网基础语法51~60题&#x1f618;&#x1f618;&#x1f618; &#x1f4ab;前言&#xff1a;今天是咱们第六期刷牛客网上的题目。 &#x1f4ab;目标&#xff1a;对每种的循环知识掌握熟练&#xff0c;用数学知识和循环结合运用熟练&#xff0c;对逻辑操作符运用熟练。 &am…

接口测试入门神器 —— Requests

起源 众所周知&#xff0c;自动化测试是软件测试爱好者毕生探索的课题。我认为&#xff0c;只要把 接口测试 做好&#xff0c;你的自动化测试就至少成功了一半。 应部分热情读者要求&#xff0c;今天跟大家一起了解 python 接口测试库- Requests 的基本用法并进行实践&#x…

【跑实验03】如何可视化GT边界框,如何选择边界框内部的边界框,如何可视化GT框和预测框,如何定义IoU阈值下的不同边界框?

文章目录 一、如何可视化GT边界框&#xff1f;二、GT框和预测框的可视化三、根据IoU阈值来选择 一、如何可视化GT边界框&#xff1f; from PIL import Image, ImageDrawdef draw_bboxes(image, bboxes, color"red", thickness2):draw ImageDraw.Draw(image)for bbo…

精雕细琢,Smartbi电子表格软件重构、新增、完善

Smartbi SpreadSheet电子表格软件自发布以来&#xff0c;我们一直关注着用户的诉求&#xff0c;也在不断地对产品进行改进和优化&#xff0c;确保产品能够持续满足用户需求。经过一段时间的努力&#xff0c;产品在各方面都有了明显的改进&#xff0c;接下来&#xff0c;让我们一…

全网最详细的postman接口测试教程,一篇文章满足你

1、前言   之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;现在呢是各种各样的接口都丢过来&#xff0c;总算是有了个实际的认识。因为只是接口的…

不写单元测试的我,被批了 ,怎么说?

我是凡哥&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手 最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&…

k8s 的 Deployment控制器

1. RS与RC与Deployment关联 RC&#xff08;Replication Controller&#xff09;主要作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出&#xff0c;会自动创建新的pod来替代&#xff1b;而如果异常多出来的容器也会自动回收。K8S官方建议使用…

JDBC BasicDAO详解(通俗易懂)

目录 一、前言 二、BasicDAO的引入 1.为什么需要BasicDAO&#xff1f; 2.BasicDAO示意图 : 三、BasicDAO的分析 1.基本说明 : 2.简单设计 : 四、BasicDAO的实现 0.准备工作 : 1.工具类 : 2.JavaBean类 : 3.BasicDAO类 / StusDAO类 : 4.测试类 : 一、前言 第七节内容…

一文读懂物联网平台如何搞定80%以上的物联网项目

太卷了&#xff01;一套物联网平台就能搞定80%以上的项目&#xff1f;&#xff01; 在刚刚结束的AIRIOT4.0物联网平台发布会上&#xff0c;航天科技控股集团股份有限公司智慧物联事业部总经理田淼给出答案。 在主题演讲环节&#xff0c;田总以【80%的物联网项目服务商都会面临…

分组函数group by使用技巧

一、需求&#xff1a;获取销售版本组合 颜色&#xff08;属性名&#xff09; (黑色&#xff0c;白色…) 属性值集合 Datapublic static class ItemSaleAttrsVo{private Long attrId;private String attrName;//当前属性有多少种版本&#xff1a;黑色,白色,蓝色&#xff0c;这里…

奇妙敏捷之旅·青岛站,真的太酷啦!

高手的世界里&#xff0c;一块小小的积木&#xff0c;也能立刻感受敏捷的乐趣&#xff01; 2023奇妙敏捷之旅青岛站&#xff0c;希望将理论知识、实践应用融入互动过程&#xff0c;实现思维的交流、碰撞以及面对面的沟通。因此&#xff0c;大家看到的奇妙敏捷之旅的现场&#…

Linux:课后习题及其答案

第一章 Linux系统初步了解 Q1&#xff1a;简述Linux系统的应用领域 Linux服务器、嵌入式Linux系统、软件开发平台、桌面应用 Q2&#xff1a;Linux系统的特点 开放性、多用户、多任务、良好的用户界面、设备独立性、丰富的网络功能、可靠的系统安全、良好的可移植性 Q3&#…

oracle19c rac、nfs部署教程

本文基于19c进行部署&#xff0c;使用centos7.9,nfs做共享存储 一、首先进行网络规划和配置 该实验一共三台机器一台是nfs,另外两台做rac 1.每台机器至少2块网卡,网卡名字必须一样&#xff08;publicip和VIP使用的是同一张网卡&#xff0c;privilegeip是另外一张网卡改ip 仅做r…

C语言中断言库与断言函数assert()的用法总结

断言库与断言函数的相关使用总结&#xff01; 断言函数的使用断言函数及断言库总结#define NDEBUG 断言函数在实现常见算法中的使用 断言函数的使用 话不多说&#xff0c;先来个例子感受一番断言函数assert()到底有什么功能。 由上面例子可知&#xff0c;assert()函数中在z的…

快速开发框架:一招解锁企业流程化管理!

在流程化管理时代&#xff0c;什么样的平台可以帮助企业实现高效率发展&#xff1f;在信息化爆炸式发展的今天&#xff0c;有很多企业期望能通过专用的快速开发框架实现提质增效发展。目前&#xff0c;低代码技术平台是较为盛行的平台&#xff0c;拥有易操作、灵活、增效等优势…

AntDB数据库灾备方案介绍

AntDB灾备方案(双中心方案) AntDB数据库节点分布于两个机房&#xff0c;并使用 patroni etcd 组件进行HA管理&#xff0c;主节点故障时能自动切换。切换时优先选择同机房的同步slave节点选举为new master。 部署图中相关组件说明&#xff1a; ⚫patroni&#xff1a;通过参…

Revit中楼梯该怎么画?包教包会!

绘制楼梯是室内装修中必不可少的一部分&#xff0c;因为楼梯的安装不仅仅是为了连接不同楼层&#xff0c;更是装饰整个室内空间的重要组成部分。 在楼梯的绘制过程中&#xff0c;需要结合实际情况进行设计&#xff0c;包括楼层高度、楼梯数量、台阶宽度、扶手高度等因素&#…

AntDB数据冷热分离方案

数据冷热分离 数据的存在价值&#xff0c;在于其被使用的程度&#xff0c;即被查询或更新的频率。在不同的业务系统中&#xff0c;人们对处于不同时期的数据有着不同的使用需求。比如&#xff0c;在网络流量行为分析系统中&#xff0c;客户会对最近一个月公司发生的安全事件和…

树莓派系统卸载桌面环境及系统瘦身

在我们刚入门树莓派时使用都是带桌面环境的系统&#xff0c;系统自带了非常多的实用软件&#xff0c;在学习和使用了一段时间后&#xff0c;我发现已经完全用不到桌面环境了&#xff0c;平时几乎都是通过 ssh 远程工具进行交互&#xff0c;并以命令形式来对系统进行操作。 Ras…