AdaBoost(Adaptive Boosting)算法
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 算法能够逐步提高模型的性能,最终得到一个强大的分类器。
原文地址:https://blog.csdn.net/weixin_44748456/article/details/145207843
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!