AdaBoost算法分类问题浅析

(整期优先)网络出版时间:2024-12-30
/ 2

AdaBoost算法分类问题浅析

薛书豪

贵州科学院先进技术与材料研究所 贵州贵阳 550014

  1. 引言

AdaBoost是Boosting算法的应用之一,它是Adaptive Boosting的缩写。其中,Boosting是一种组合多个弱学习器,依次对它们进行训练,并逐步纠正前一个学习器,并将多个弱学习器整合为一个强学习器,最终提高预测准确性的集成方法。Adaboost算法可用于分类和回归问题,但本文只关注其在分类任务中的表现。

  1. AdaBoost算法实施

本文通过Python实现了该算法在分类任务中的运用,包括一些基本的scikit - learn函数来提供支持。强分类器被命名为“AdaBoostClassifier”,并通过代码实现、拟合和预测得到预测结果与其他算法进行比较。

2.1代码实现

使用保留方法定义__init__并初始化属性。括号内的所有属性都可以永久存储。

def __init__(self, n_estimators=50,base_estimator=None,n_iter=50):

        self.n_estimators = n_estimators   

        self.base_estimator = base_estimator

        self.n_iter = n_iter    

self”是对象的实例,有助于将属性与给定的参数绑定。对于的类,在这里定义了3个最重要的超参数,包括n_estimators(分类器数量)、base_estimator(基础分类器)和n_iter(迭代次数)。 n_estimators是迭代训练模型时弱分类器的数量。base_estimator存储使用的弱分类器。n_iter代表迭代次数。默认值都设置为50。由于理论上弱分类器可以是任何分类器,所以没有对其形式进行默认设置。

2.2拟合

2.2.1数据准备

数据集的维度通过shape函数由n定义。每个分类器的权重将存储在w变量中。在第一次迭代中,所有分类器将被赋予相等的权重,其代码为: self.w = np.array([1 / n] * n)

2.2.2 Bootstrapping

为了构建boostrap,遵循惯例,通过self.estimators = []创建一个空列表,作为分类器的容器。同时,为了加快算法的运行速度,预测值将存储在一个维度为n乘以弱分类器数量的矩阵中。 使用random.choice函数随机为数据分配索引,以及Decision stump来指定初始化分类器。

clf = DecisionTreeClassifier(max_depth=1)

clf.fit(X_train_btsp, y_train_btsp) #fit

self.estimators.append(clf)#store

y_pred=clf.predict(X) #predict

self.y_preds[:,i]= y_pred #store at row i

Bootstrap由一个大循环中完成,上面所做的是一个分类器如何拟合和预测的步骤,其循环的次数是分类器的数量。

2.2.3 Ensemble 

误分类通过检查y_pred是否等于实际的y来判断。检查结果将以0和1的列表形式呈现,其中正确分类等于0,误分类等于1。在矩阵计算中,布尔掩码和权重之间的内积得到,即误分类率。

执行AdaBoost的第一步是计算使用的分类器的误分类率。当小于0.5意味着继续添加剩余的分类器并不能使算法表现得更好,循环将在这个时候停止。 在得到所有的之后,需要选择具有最低值的分类器,因为最低的误差代表需要纠正的错误最少。接下来,通过自然对数计算最佳分类器的投票权重。

上式构造了一个误分类率越低,分配的投票权重就越高的方法,使更高模型准确性获得高度信任。

迭代将在误差的绝对值等于0时停止。最后一步是更新数据权重。因为在接下来的迭代中,重点将转移到在最近一次迭代中误分类的数据点上。因此,将为误分类的点分配更大的权重。

  1. 超参数的影响

在这部分有两个需要考虑的超参数,即弱分类器的数量和迭代次数。 同时,考虑到真实业务的复杂性,通过make_classification函数创建了两个合成数据集,其样本大小为5000,有20个特征。将分类器的允许值和迭代次数放在param_grid中,作为一个字符串字典。分类器数量的范围从1设置到201,每隔10个数取一个值。拟合之后的结果如图1所示。

A picture containing clock  Description automatically generated

图1

从上文来看,超参数对预测准确性的影响方向相同。分类器的最大数量和迭代次数是两个重要且可控的超参数,分类器的最大数量限制了每次迭代时自助法的大小。一个明显的模式是,当保持迭代次数不变时,分类器数量的增加会提高模型准确性,因为应用的分类器越多,从原始数据到模型中实现的信息就越多。迭代次数的最大数量以类似的方式起作用,即当保持分类器数量不变时,迭代次数的增加可以提高模型准确性,因为每个弱分类器往往会获得更合理的投票权重。 然而,这种性能的提高总是会遇到过拟合的问题,并且应该考虑它们之间的权衡。为了平衡这种权衡,算法中实现了三个提前停止标准。第一个停止点是当发现剩余分类器的误分类率都大于0.5时,这意味着它们不比随机猜测好。另一个是在集成结束时,当当前可用分类器做出的分类都是正确的。这两个停止标准与AdaBoost的优化性质一致,可以显著减少模型训练时间并节省成本。

  1. AdaBoost与Random Forrest分类器的比较

随机森林与 AdaBoost 共享基础分类器 —— 决策树。引入来自 scikit - learn 的乳腺癌二分类数据集,以了解随机森林和 AdaBoost 在噪声较小的数据方面的特征。它是一个相对较小的数据集,有 569 个样本和 30 个维度。

这两个模型也使用相同的超参数进行训练,其中分类器的最大数量范围从 1 到 201,迭代的最大次数范围从 1 到 9。AdaBoost 的拟合结果如图2所示。

A picture containing clock  Description automatically generated

图2

由上图可以看出,Adaboost 在该数据集上的表现不错,取得了较高的f1-。更稳定的数据集证明了模型的准确性。构建的合成数据集具有很高的随机性,这会在一定程度上影响模型性能。

随机森林的结果如图 3 所示。

A picture containing clock  Description automatically generated

图 3

随机森林的准确性与 AdaBoost 相似。根据最佳分类器,当保持深度不变时,分数应该在 51 个分类器时达到峰值。这实际上与绘制的分数是一致的。在分类器数量为 51 之后,可以观察到在很多点上,训练分数在增加,而测试分数在下降。这显然代表了过拟合,之后曲线变得波动,在大约 16 的分类器处有大幅下降。这是过拟合问题的一个很好的例子,而随机森林通过其装袋算法解决了这个问题。AdaBoost 可能比随机森林更稳定,因为它允许提前停止并减少过拟合的负面影响。