【漫话机器学习系列】Adaboost算法

Adaboost(Adaptive Boosting)是一种经典的集成学习方法,主要思想是通过将多个弱学习器(通常是简单模型,如决策树桩)加权组合,来提升整体模型的预测能力。Adaboost 是一种自适应的学习方法,能够不断调整弱学习器的训练过程,专注于难分类的样本,从而逐步提高分类性能。

1. 背景与基本原理

在机器学习中,弱学习器是指其分类准确率略高于随机猜测的学习器。Adaboost的目标是将多个弱学习器组合成一个强学习器,来提高分类精度。它的基本原理是:

  • 每个弱学习器会根据当前的样本权重进行训练,样本权重较大的样本对训练结果影响更大。
  • 在每一轮训练中,Adaboost 会调整样本的权重,使得上一轮分类错误的样本权重增大,上一轮分类正确的样本权重减小,从而让后续的弱学习器更加关注难以分类的样本。
  • 最终,Adaboost 会将所有弱学习器加权组合,形成一个强学习器。

2. 算法步骤

以下是 Adaboost 算法的详细步骤:

2.1 初始化

假设有 N 个训练样本,每个样本的特征为 \mathbf{x}_i​ 和标签为 y_i \in \{-1, 1\},其中 y_i = 1 代表正样本,y_i = -1 代表负样本。所有样本的初始权重设置为均等的:

w_i^{(1)} = \frac{1}{N}, \quad i = 1, 2, \dots, N

2.2 迭代训练弱学习器

Adaboost 会进行 T 次迭代(即训练 T 个弱学习器)。在每一轮 t:

  1. 训练弱学习器
    在当前样本权重的基础上训练一个弱学习器 h_t(x),其目标是最小化加权的训练误差。常用的弱学习器是决策树桩(深度为1的决策树)。

  2. 计算弱学习器的错误率
    计算当前弱学习器的加权错误率(即样本分类错误的权重总和):

    \epsilon_t = \frac{\sum_{i=1}^N w_i^{(t)} \cdot \mathbb{I}(h_t(x_i) \neq y_i)}{\sum_{i=1}^N w_i^{(t)}}

    其中,\mathbb{I}(h_t(x_i) \neq y_i)是指示函数,当 h_t(x_i) 错误时返回1,否则为0。

  3. 计算弱学习器的权重
    基于错误率 \epsilon_t,计算弱学习器 hth_tht​ 的权重 \alpha_t

    \alpha_t = \frac{1}{2} \ln\left(\frac{1 - \epsilon_t}{\epsilon_t}\right)

    该权重反映了弱学习器在最终模型中的重要性。如果弱学习器的误差很小,\alpha_t​ 会很大,反之则很小。

  4. 更新样本权重
    对每个样本 i,根据是否被当前弱学习器错误分类来调整其权重。分类错误的样本会增加权重,分类正确的样本则减少权重:

    w_i^{(t+1)} = w_i^{(t)} \cdot \exp(-\alpha_t y_i h_t(x_i))

    其中,y_i h_t(x_i) 的值为1时表示分类正确,-1时表示分类错误。然后将 w_i^{(t+1)} 归一化:

    sum_{i=1}^N w_i^{(t+1)} = 1i=1

    这样可以保持样本权重的总和不变。

2.3 强学习器的构建

最终的强学习器 H(x) 是所有弱学习器的加权组合:

H(x) = \text{sign}\left(\sum_{t=1}^T \alpha_t h_t(x)\right)

其中,\text{sign}(z) 表示符号函数,若 z \geq 0 则返回 1,否则返回 -1。

2.4 输出结果

最终的分类结果由所有弱学习器的加权输出决定。如果弱学习器的加权输出之和为正,则预测为正类(1),否则为负类(-1)。


3. 误差分析

  • 误差的上界
    Adaboost 通过加权组合弱学习器来减小整体的错误率。理论上,Adaboost 可以将训练误差降到接近于零。如果每个弱学习器的错误率都小于 0.5,且足够多的弱学习器参与训练,最终的强学习器会越来越强。

  • 对噪声敏感
    Adaboost 对噪声(错误标注的样本)比较敏感。如果训练集包含大量噪声,Adaboost 会过度关注这些噪声样本,可能导致过拟合。


4. 优缺点

优点
  • 简单易用:Adaboost 算法实现相对简单,且不需要对弱学习器的构造做特别要求。它能够显著提高弱学习器的性能。
  • 高效性:通过调整样本权重,Adaboost 可以高效地集中学习难分类的样本。
  • 减少过拟合:相较于传统的单一学习器,Adaboost 更能减小过拟合风险,尤其是在弱学习器较弱时。
缺点
  • 对噪声敏感:由于样本权重会随着分类错误的次数增加,如果数据中含有噪声,Adaboost 可能会对噪声过度拟合,导致性能下降。
  • 计算开销较大:每轮训练都需要根据样本权重来训练弱学习器,计算开销较大,特别是对于样本数非常大的数据集。

5. 应用场景

Adaboost 广泛应用于分类问题,尤其适用于:

  • 二分类问题:如文本分类、面部识别、疾病预测等。
  • 异常检测:通过提高难分类样本的权重,Adaboost 能有效地识别异常数据。
  • 特征选择:在特征较多的情况下,Adaboost 可以通过选择适合的弱学习器,逐步提升分类效果。

6. 实际应用与优化

  • 弱学习器的选择:虽然决策树桩是常见的弱学习器,但你也可以选择其他简单的模型(如 SVM、神经网络)作为弱学习器,根据任务的不同选择合适的模型。
  • 与其他方法结合:Adaboost 可以与其他集成学习方法(如 Bagging、Gradient Boosting)结合,或与其他算法结合使用,进一步提高模型的性能。

7.示例代码

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score# 生成示例数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=2, n_redundant=0, random_state=42)
y = np.where(y == 0, -1, 1)  # 将标签转化为 -1 和 1class AdaBoost:def __init__(self, n_estimators=50):self.n_estimators = n_estimatorsself.models = []  # 弱学习器self.model_weights = []  # 弱学习器的权重def fit(self, X, y):n_samples, _ = X.shape# 初始化样本权重sample_weights = np.ones(n_samples) / n_samplesfor _ in range(self.n_estimators):# 初始化弱学习器(决策树桩)model = DecisionTreeClassifier(max_depth=1)model.fit(X, y, sample_weight=sample_weights)predictions = model.predict(X)# 计算误差率error = np.sum(sample_weights * (predictions != y)) / np.sum(sample_weights)# 计算弱学习器权重alpha = 0.5 * np.log((1 - error) / max(error, 1e-10))# 更新样本权重sample_weights *= np.exp(-alpha * y * predictions)sample_weights /= np.sum(sample_weights)  # 归一化# 保存弱学习器及其权重self.models.append(model)self.model_weights.append(alpha)def predict(self, X):# 强学习器的预测pred = np.zeros(X.shape[0])for model, alpha in zip(self.models, self.model_weights):pred += alpha * model.predict(X)return np.sign(pred)# 初始化并训练 Adaboost 模型
adaboost = AdaBoost(n_estimators=50)
adaboost.fit(X, y)# 进行预测并评估性能
y_pred = adaboost.predict(X)
accuracy = accuracy_score(y, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 可视化结果(可选)
import matplotlib.pyplot as pltdef plot_decision_boundary(model, X, y):x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),np.arange(y_min, y_max, 0.01))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', marker='o')plt.show()plot_decision_boundary(adaboost, X, y)

 代码说明

  1. 初始化权重sample_weights 对每个样本初始化为相等的权重。
  2. 弱学习器:使用 sklearnDecisionTreeClassifier,限制深度为 1(决策树桩)。
  3. 误差和权重更新:根据 Adaboost 的公式计算误差、弱学习器权重 α\alphaα,并更新样本权重。
  4. 强学习器预测:通过对所有弱学习器的加权预测求和来得到最终分类结果。
  5. 可视化:通过绘制决策边界直观展示 Adaboost 分类结果。

输出结果

Accuracy: 1.00


8. 总结

Adaboost 是一种非常强大的集成学习方法,通过加权组合多个弱学习器,提升模型的预测能力。其基本思路是通过加权关注难以分类的样本,并通过简单的弱学习器(如决策树桩)来逐步改善分类性能。尽管 Adaboost 在大多数情况下能提供良好的分类效果,但它对噪声和离群点非常敏感,需要小心使用。

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

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

相关文章

SQL靶场第四关

sql靶场第四关攻略 输入?id1页面正常 输入?id1发现页面也正常 输入?id1",页面异常,说明存在sql报错注入 在输入?id1" --页面还是报错 1.判断闭合点 我们需要找到闭合点,尝试在双引号后面加个) 输入?id1") --我们发现…

Trunk链路操作题

Trunk链路操作题 论证:

Alogrithm:三色棋

1. 说明 三色旗的问题最早由 E.W.Diikstra 所提出,他所使用的用语为 Dutch Nation Flag(Dijkstra 为荷兰人),而多数的作者则使用 Three-Color Flag 来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子&#xff0…

需要排序的子数组

题目描述 给定一个无序数组arr,求出需要排序的最短子数组长度 要求:O(N) 如输入:arr{2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序。 分析 以{2,3,7,5,4,6,8,9}为例: 前端小于最小波谷(3…

Python酷库之旅-第三方库Pandas(154)

目录 一、用法精讲 701、pandas.Timestamp.utcnow方法 701-1、语法 701-2、参数 701-3、功能 701-4、返回值 701-5、说明 701-6、用法 701-6-1、数据准备 701-6-2、代码示例 701-6-3、结果输出 702、pandas.Timestamp.utcoffset方法 702-1、语法 702-2、参数 70…

如何启动神通数据库?神通数据库的启动方式一共有几种?

简单总结,神通数据库启动有三种方式: 1、dba管理工具方式 2、服务方式 (1)service oscardb_OSRDBd restart (2)/etc/init.d/oscardb_OSRDBd restart (3)systemctl start oscardb_OS…

Modbus Poll的使用

最近从串口调试助手接触到了Modbus Poll,一开始用的时候有些生疏,了解之后不得不说真香。 相对于串口调试助手,有些设备厂家会给一些点表和指令码,有些也可以通过modbus协议解析出来,相对来说,使用Modbus …

第四学期-智能数据分析-期末复习题

智能数据分析期末复习(2024春) 【考试形式】:闭卷,90分钟,笔试 【题型分布】: 单选题10题,每题3分,共计30分 判断题10题,每题2分,共计20分 填空题5题&…

总结的一些MySql面试题

目录 一:基础篇 二:索引原理和SQL优化 三:事务原理 四:缓存策略 一:基础篇 1:定义:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的…

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型(如通义千问),来开发一个chat对话类型的ai应用,我需要先了解OpenAI的API文档,请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

python游戏设计---飞机大战

1.前言 上次做飞机大战游戏有人这么说: 好好好!今天必须整一个,今天我们来详细讲解一下,底部找素材文件下载!!! 2.游戏制作 目录如下: 1.导入的包 import pygame import sys imp…

Final Vision Get Picture Pos Send 2 Python Control Robot

import tkinter as tk from tkinter import messagebox, filedialog from tkinter import ttk import socket import threading import subprocess from datetime import datetime from PIL import Image, ImageTk import time # 全局变量 client_socket None connected Fal…

Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML 1 IoC使用-基于XML 使用SpringIoC组件创建并管理对象 1.1 创建实体类 package com.feng.ioc.bean;import java.util.Date;/*** program: spring-ioc-demo1* description: 学生实体类* author: FF* create: 2024-12-04 18:53**/ public class Stud…

C++编程控制舵机的实现与应用

在嵌入式编程和物联网应用中,舵机是一种非常重要的执行器,广泛应用于机器人、遥控玩具、机械臂、摄像头云台等多个领域。舵机不仅能够精准地控制角度位置,还能在一定的工作范围内持续保持该位置。在本篇文章中,我们将站在 C 编程教…

对于MySQL中视图的相关实验

以下用该表举例: /*Table structure for table employees */ DROP TABLE IF EXISTS employees; CREATE TABLE employees ( employee_id int(6) NOT NULL DEFAULT 0, first_name varchar(20) DEFAULT NULL, last_name varchar(25) NOT NULL, email varc…

day-90 使数组为空的最少操作次数

思路 统计每个数字出现的次数,计算每个数字的操作次数,将所有操作次数累加返回即可 解题过程 对于每个数字(假设出现次数num),如果num等于1,返回-1;如果num%3等于0,返回num/3;如果num%3不等于0…

6.xftp使用教程

xftp用于windows和linux之间进行文件互传 1.先安装xftp软件,并双击打开 2.文件 – 新建 3.配置参数 4.连接 5.把需要的文件扯到右边

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

前言 nmap网络连接端扫描软件,用于主机发现、端口扫描、版本侦测、操作系统侦测 namp 链接:https://pan.quark.cn/s/4ea55a2d62c3 提取码:aXnr 下载压缩包后解压 !!安装路径不要有中文 链接失效(可能被官…

详解组合模式

引言 有一种情况,当一组对象具有“整体—部分”关系时,如果我们处理其中一个对象或对象组合(区别对待),就可能会出现牵一发而动全身的情况,造成代码复杂。这个时候,组合模式就是一种可以用一致的…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…