一、AdaBoost介绍
AdaBoost的全称是ADAPTIVE BOOSTING(自适应增强算法),是一种经典的集成学习算法,它通过组合多个弱学习器来构建一个强学习器。
从表意上看,AdaBoost就是在不断对于错误的知识点进行加深印象,其加深印象的方式则是通过每一轮中根据前一轮的表现对训练样本的权重进行调整,使得后续的弱学习器更加关注之前分类错误的样本,最终将这些弱学习器组合起来形成一个强学习器来实现的。
相关定义
弱学习器:通常是简单的模型,如单层决策树(决策树桩)。
强学习器:通过加权组合多个弱学习器得到的最终模型。
二、具体实现步骤
现在以选择弱学习器为决策树:学习方式实现如下:
1. 初始化样本权重
在训练开始时,AdaBoost会为每个样本分配一个初始权重。假设训练集中有 N 个样本,那么每个样本的初始权重为:
这些权重表示每个样本在训练过程中的“重要性”,初始时所有样本的重要性是相同的。
2. 训练弱学习器
AdaBoost会依次训练多个弱学习器。在每一轮训练中,它会根据当前的样本权重来训练一个弱学习器。弱学习器的目标是根据当前的权重分布找到一个能够较好区分样本的模型。
3. 计算弱学习器的错误率
在训练完一个弱学习器后,AdaBoost会计算该弱学习器在当前样本权重分布下的错误率 :
含义为:当预测值与真实标签相等,指示函数输出结果为1(否则为0),此时权重越高惩罚就会越大
4. 更新样本权重
根据弱学习器的错误率,AdaBoost会更新样本权重。对于第 t 轮训练后的样本权重更新公式为:
其中:
y·h(x)表示真实标签与弱机器学习预测标签的乘积,若预测正确则为1,预测错误则是-1
5. 归一化样本权重
更新后的样本权重需要进行归一化,以确保所有样本权重之和为 1:
6. 重复训练和更新
AdaBoost会重复上述步骤,训练多个弱学习器,并逐步调整样本权重。随着训练的进行,那些被弱学习器错误分类的样本权重会不断增加,从而在后续的训练中受到更多的关注。
三、实例应用
1.导入必要的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score, classification_report
解析:
• `numpy`和`pandas`用于数据处理。
• `load_iris`用于加载鸢尾花数据集。
• `train_test_split`用于将数据集划分为训练集和测试集。
• `DecisionTreeClassifier`是我们选择的弱学习器。
• `AdaBoostClassifier`是AdaBoost算法的实现。
• `accuracy_score`和`classification_report`用于评估模型性能。
2.加载数据集
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征数据
y = iris.target # 标签数据
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
解析:
• `load_iris()`加载鸢尾花数据集,返回一个包含特征和标签的Bunch对象。
• `X`是特征数据,`y`是标签数据。
• `train_test_split`将数据集划分为训练集和测试集,其中测试集占30%。`random_state=42`确保每次划分结果一致。
3.定义弱学习器和AdaBoost模型
# 定义弱学习器
base_estimator = DecisionTreeClassifier(max_depth=1)
# 使用兼容所有版本的参数名
adaboost = AdaBoostClassifier(
estimator=base_estimator,
n_estimators=50,
random_state=42
)
解析:
• `DecisionTreeClassifier(max_depth=1)`定义了一个深度为1的决策树作为弱学习器。这种决策树也称为决策树桩,是AdaBoost中常用的弱学习器。
• `AdaBoostClassifier`是AdaBoost算法的实现。`base_estimator`指定了弱学习器,`n_estimators=50`表示训练50个弱学习器,`random_state=42`确保每次训练结果一致。
4.训练模型
# 训练AdaBoost模型
adaboost.fit(X_train, y_train)
解析:
• `adaboost.fit(X_train, y_train)`使用训练集数据训练AdaBoost模型。在训练过程中,AdaBoost会逐步调整样本权重,并训练多个弱学习器。
5.预测和评估
# 在测试集上进行预测
y_pred = adaboost.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
# 打印分类报告
print("Classification Report:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
解析:
• `adaboost.predict(X_test)`使用训练好的模型对测试集进行预测。
• `accuracy_score(y_test, y_pred)`计算模型的准确率。
• `classification_report(y_test, y_pred, target_names=iris.target_names)`打印详细的分类报告,包括每个类别的精确率、召回率和F1分数。
四、模型评价
优点
1. 自动关注少数类样本:
AdaBoost通过增加错误分类样本的权重,使得模型在后续迭代中更加关注这些样本。在类别不平衡的情况下,少数类样本往往更容易被错误分类,因此它们的权重会逐渐增加。这种机制可以帮助模型更好地学习少数类样本的特征,从而提高对少数类的分类性能,笔者在进行打板风控预测时,选择这个模型简单尝试了一下,因为打板就属于一种比较少见的情况,且数据正样本过少SMOTE等方法数据增强也有难度,但仅仅只是把随机森林换成AdaBoost这一举动就令回测时的收益率提升了将近百分之十。
2. 动态调整权重:
AdaBoost的权重调整机制是动态的,它会根据每轮弱学习器的预测结果实时调整样本权重。这意味着即使少数类样本在初始阶段被错误分类,后续的弱学习器也会逐渐关注它们。这种动态调整能力使得AdaBoost在处理类别不平衡问题时具有一定的适应性。
3. 集成学习的优势:
AdaBoost通过组合多个弱学习器来构建强学习器,每个弱学习器都有机会对少数类样本进行优化。这种集成学习的方式可以有效提高对少数类的分类能力。
缺点
1. 少数类样本权重过高可能导致过拟合:
在类别不平衡的情况下,少数类样本的权重可能会迅速增加,尤其是在它们被频繁错误分类时。这可能导致模型过度关注少数类样本,而忽视了多数类样本。这种情况可能会导致模型在少数类样本上表现良好,但在多数类样本上表现较差,从而降低整体的泛化能力。
2. 训练过程可能不稳定:
由于少数类样本的权重增加,模型可能会在后续迭代中过度调整以适应这些样本。这可能导致训练过程不稳定,甚至出现权重波动较大的情况。这种不稳定性可能会影响模型的收敛速度和最终性能。
3. 对噪声敏感:
少数类样本由于数量较少,更容易受到噪声的影响。如果少数类样本中存在噪声(即错误标注的样本),AdaBoost可能会过度关注这些噪声样本,从而导致模型性能下降。