AdaBoost(Adaptive Boosting)算法

news/2025/1/21 21:05:49/

AdaBoost(Adaptive Boosting,自适应提升)是一种迭代的机器学习算法,它通过组合多个弱分类器来构建一个强分类器。AdaBoost 是最早且最著名的提升方法之一,因其简单性和有效性而在实践中得到广泛应用。以下是 AdaBoost 算法的详细介绍:

AdaBoost 的核心思想

- **弱分类器**:每个弱分类器都是一个简单的模型,其性能略好于随机猜测。
- **加权投票**:最终的强分类器由多个弱分类器组成,这些弱分类器的预测结果通过加权投票的方式结合起来。
- **样本权重调整**:在每次迭代中,AdaBoost 会根据当前弱分类器的表现调整训练数据集中每个样本的权重。错误分类的样本权重增加,而正确分类的样本权重减少,从而使得后续的弱分类器更加关注那些难以分类的样本。

### AdaBoost 算法步骤

1. **初始化样本权重**:
   - 所有样本的初始权重 \( w_i^{(0)} \) 相等,通常设为 \( \frac{1}{N} \),其中 \( N \) 是样本总数。

2. **迭代选择弱分类器**:
   - 对于每一轮迭代 \( t = 1, 2, ..., T \):
     1. 使用当前样本权重 \( w_i^{(t-1)} \) 训练一个弱分类器 \( h_t \)。
     2. 计算弱分类器 \( h_t \) 的加权错误率 \( \epsilon_t \):
        \[
        \epsilon_t = \sum_{i=1}^{N} w_i^{(t-1)} [y_i \neq h_t(x_i)]
        \]
     3. 计算弱分类器 \( h_t \) 的权重 \( \alpha_t \):
        \[
        \alpha_t = \frac{1}{2} \ln \left( \frac{1 - \epsilon_t}{\epsilon_t} \right)
        \]
     4. 更新样本权重 \( w_i^{(t)} \):
        \[
        w_i^{(t)} = w_i^{(t-1)} \times \exp(-\alpha_t y_i h_t(x_i))
        \]
     5. 归一化样本权重,确保它们之和为 1。

3. **组合弱分类器**:
   - 最终的强分类器 \( H(x) \) 通过加权投票的方式结合所有弱分类器:
     \[
     H(x) = \text{sign} \left( \sum_{t=1}^{T} \alpha_t h_t(x) \right)
     \]

### AdaBoost 的特点

- **简单性**:AdaBoost 实现相对简单,易于理解和实现。
- **无需调参**:相比其他集成方法,AdaBoost 需要调整的参数较少,主要是弱分类器的数量 \( T \) 和弱分类器的类型。
- **对噪声敏感**:由于 AdaBoost 强调错误分类的样本,因此它可能对噪声数据或异常值比较敏感。
- **过拟合风险较低**:尽管 AdaBoost 强调错误分类的样本,但在实际应用中,它往往不会过度拟合训练数据。

### 示例代码

以下是一个使用 `scikit-learn` 库实现 AdaBoost 分类器的示例代码:

```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 数据切分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化分类器
clf = AdaBoostClassifier(
    base_estimator=DecisionTreeClassifier(max_depth=1),
    n_estimators=50,
    learning_rate=1.0,
    random_state=42
)

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
```

算法中权重更新的原理

### 公式和概念

1. **目标**:
   \[
   \frac{\sum_{n=1}^{N} u_n^{(t+1)} [y_n \neq g_t(\mathbf{x}_n)]}{\sum_{n=1}^{N} u_n^{(t+1)}} = \frac{1}{2}
   \]
   这个目标是希望在下一次迭代中,错误分类样本的加权比例接近于总样本的一半。

2. **权重更新**:
   - \( u_n^{(t+1)} \): 第 \( n \) 个样本在第 \( t+1 \) 次迭代中的权重。
   - \( [y_n \neq g_t(\mathbf{x}_n)] \): 如果第 \( n \) 个样本被弱分类器 \( g_t \) 错误分类,则该项为 1;否则为 0。
   - \( [y_n = g_t(\mathbf{x}_n)] \): 如果第 \( n \) 个样本被弱分类器 \( g_t \) 正确分类,则该项为 1;否则为 0。

3. **重新分配权重**:
   - 目标是使得错误分类样本的权重与正确分类样本的权重相等。
   - 通过重新缩放(re-scaling)权重来实现这一目标。

### 示例计算

假设:
- 总共有 7337 个样本。
- 错误分类样本的总数为 1126。
- 正确分类样本的总数为 6211。

#### 重新分配权重的步骤:

1. **计算错误率和正确率**:
   - 错误率 (\( \epsilon_t \)): 
     \[
     \epsilon_t = \frac{1126}{7337}
     \]
   - 正确率:
     \[
     1 - \epsilon_t = \frac{6211}{7337}
     \]

2. **重新分配权重**:
   - 错误分类样本的新权重:
     \[
     u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \frac{6211}{1126}
     \]
   - 正确分类样本的新权重:
     \[
     u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \frac{1126}{6211}
     \]

### 解释

- **增加错误分类样本的权重**:
  - 通过增加错误分类样本的权重,AdaBoost 算法在后续迭代中会更加关注这些难分类的样本,从而提高整体分类性能。

- **减少正确分类样本的权重**:
  - 通过减少正确分类样本的权重,算法在后续迭代中会减少对这些已经正确分类样本的关注,从而将更多的注意力放在那些更难分类的样本上。

### 公式的数学意义

- **目标函数**:
  \[
  \frac{\sum_{n=1}^{N} u_n^{(t+1)} [y_n \neq g_t(\mathbf{x}_n)]}{\sum_{n=1}^{N} u_n^{(t+1)}} = \frac{1}{2}
  \]
  表示希望在下一次迭代中,错误分类样本的加权比例接近于总样本的一半。

- **权重更新规则**:
  \[
  u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \beta_t
  \]
  其中 \(\beta_t\) 是一个缩放因子,用于调整权重。

缩放因子

1. **定义缩放因子**:
   \[
   \diamond_t = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}}
   \]
   其中:
   - \(\epsilon_t\) 是弱分类器 \(g_t\) 在第 \(t\) 次迭代中的加权错误率。
   - \(1 - \epsilon_t\) 是弱分类器 \(g_t\) 在第 \(t\) 次迭代中的加权正确率。

2. **权重更新规则**:
   - 错误分类样本的新权重:
     \[
     u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \diamond_t
     \]
   - 正确分类样本的新权重:
     \[
     u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \frac{1}{\diamond_t}
     \]

3. **等价于最优重新分配权重**:
   - 这种权重更新方式是等价于最优的重新分配权重方法。

4. **物理意义**:
   - 当 \(\epsilon_t \leq \frac{1}{2}\) 时,\(\diamond_t \geq 1\)。
   - 物理意义:增加错误分类样本的权重,减少正确分类样本的权重。

### 示例计算

假设:
- 总共有 7337 个样本。
- 错误分类样本的总数为 1126。
- 正确分类样本的总数为 6211。

#### 计算错误率和正确率

1. **错误率 (\(\epsilon_t\))**:
   \[
   \epsilon_t = \frac{1126}{7337}
   \]

2. **正确率**:
   \[
   1 - \epsilon_t = \frac{6211}{7337}
   \]

#### 计算缩放因子

\[
\diamond_t = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}} = \sqrt{\frac{\frac{6211}{7337}}{\frac{1126}{7337}}} = \sqrt{\frac{6211}{1126}}
\]

#### 更新权重

1. **错误分类样本的新权重**:
   \[
   u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \diamond_t
   \]

2. **正确分类样本的新权重**:
   \[
   u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \frac{1}{\diamond_t}
   \]

### 解释

- **增加错误分类样本的权重**:
  - 通过增加错误分类样本的权重,AdaBoost 算法在后续迭代中会更加关注这些难分类的样本,从而提高整体分类性能。

- **减少正确分类样本的权重**:
  - 通过减少正确分类样本的权重,算法在后续迭代中会减少对这些已经正确分类样本的关注,从而将更多的注意力放在那些更难分类的样本上。

### 公式的数学意义

- **目标函数**:
  \[
  \frac{\sum_{n=1}^{N} u_n^{(t+1)} [y_n \neq g_t(\mathbf{x}_n)]}{\sum_{n=1}^{N} u_n^{(t+1)}} = \frac{1}{2}
  \]
  表示希望在下一次迭代中,错误分类样本的加权比例接近于总样本的一半。

- **权重更新规则**:
  \[
  u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \beta_t
  \]
  其中 \(\beta_t\) 是一个缩放因子,用于调整权重。

### 示例代码

下面是一个简单的示例代码,展示了如何使用 `scikit-learn` 库实现 AdaBoost 分类器,并展示权重更新的过程:

```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 数据切分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化分类器
clf = AdaBoostClassifier(
    base_estimator=DecisionTreeClassifier(max_depth=1),
    n_estimators=50,
    learning_rate=1.0,
    random_state=42
)

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
```

通过这些步骤,AdaBoost 算法能够逐步提高模型的性能,最终得到一个强大的分类器。


http://www.ppmy.cn/news/1565042.html

相关文章

STM32-串口-UART-Asynchronous

一,发送数据 #include "stdio.h" uint8_t hello[]"Hello,blocking\r\n"; HAL_UART_Transmit(&huart1,hello,sizeof(hello),500); 二,MicroLIB-printf(" hello\r\n") #include "stdio.h" #ifdef __GNUC…

大数据学习(36)- Hive和YARN

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

统信V20 1070e X86系统编译安装mysql-5.7.44版本以及主从构建

设备信息 操作系统版本架构CPU内存备注统信UOS V20 1070eX864C8G此配置仅做编译安装验证,持续运行或数据量增长大请自行评估资源配置。统信UOS V20 1070eX864C8G 资源包 该包包含mysql-5.7.44源码包、boost资源包、统信编译mysql-5.7.44安装包 通过网盘分享的文件…

客户端/服务端 负载均衡

在分布式系统中,负载均衡是确保系统高可用性、提高系统吞吐量和响应时间的一种关键技术手段。负载均衡可以分为 客户端负载均衡 和 服务端负载均衡,它们各自有不同的实现方式,适用于不同的应用场景。 1. 客户端负载均衡(Client-S…

Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南

Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南 node-gyp Node.js native addon build tool [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/no/node-gyp 项目基础介绍及主要编程语言 Node.js NativeAddon 构建工具(node-gyp…

Learning Prompt

说明:这是我的学习笔记,很多内容转自网络,请查阅文章末尾的参考资料。 目录 基本要求(C.R.E.A.T.E)总结文章(Summarise)改写文章(Rewrite)根据参考资料回答问题(Question & Answer)参考资料 基本要求(C.R.E.A.T.E) Character This is th…

[实战]Ubuntu使用工具和命令无法ssh,但使用另一台Ubuntu机器可以用命令ssh,非root用户。

现象 新安装一台Ubuntu 22.04服务器,各种远程工具都无法SSH,但使用公司的另一台Ubuntu 22.04的机器可以正常SSH。并且我使用的是非root用户。 百度、谷哥上能试的方案全试了一遍,使用命令ssh仍然提示 permission denied please try again。…

vue3 跨级传递数据

假设我们我们有3层组件 顶层,中间层,底层 如果我们的顶层想给底层传递数据 常规的我们可以用父传子的方式props,顶层传递给中间层,中间层再传给底层,如果中间有很多层,那不炸杠了吗 所以接下来要用vue3推…