AdaBoost

AdaBoost

  • adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,然后把这些弱分类器集合起来,构成一个更强的最终分类器。

  • 优点:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。

  • 缺点:对离群点敏感。

  • 适用数据类型:数值型和标称型数据

bagging:基于数据随机重抽样的分类器构建方法

  • 自举汇聚法(bootstrap aggregating),也称为bagging方法,是在从原始数据集选择S次后得到S个新数据集的一种技术。
  • 新数据集和原数据集的大小相等。每个数据集都是通过在原始 数据集中随机选择一个样本来进行替换而得到的。

boosting:

  • boosting是一种与bagging很类似的技术。不论是在boosting还是bagging当中,所使用的多个
    分类器的类型都是一致的。但是在前者当中,不同的分类器是通过串行训练而获得的,每个新分 类器都根据已训练出的分类器的性能来进行训练。
  • boosting是通过集中关注被已有分类器错分的 那些数据来获得新的分类器

AdaBoost的一般流程
(1) 收集数据:可以使用任意方法。
(2) 准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可 以处理任何数据类型。当然也可以使用任意分类器作为弱分类器,第2章到第6章中的 任一分类器都可以充当弱分类器。作为弱分类器,简单分类器的效果更好。
(3) 分析数据:可以使用任意方法。
(4) 训练算法:AdaBoost的大部分时间都用在训练上,分类器将多次在同一数据集上训练 弱分类器。
(5) 测试算法:计算分类的错误率。
(6) 使用算法:同SVM一样,AdaBoost预测两个类别中的一个。如果想把它应用到多个类 别的场合,那么就要像多类SVM中的做法一样对AdaBoost进行修改
算法流程
AdaBoost是adaptive boosting(自适应boosting)的缩写,其运行过程如下:训练数据中的每 个样本,并赋予其一个权重,这些权重构成了向量D。为了从所有弱分类器中得到终的分类结 果,AdaBoost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误 率进行计算的。其中,错误率ε的定义为:
在这里插入图片描述
而alpha的计算公式如下:
在这里插入图片描述
AdaBoost算法的流程如图所示
在这里插入图片描述
如果某个样本被正确分类,那么该样本的权重更改为
在这里插入图片描述
而如果某个样本被错分,那么该样本的权重更改为
在这里插入图片描述
基于单层决策树构建弱分类器
这个程序的伪代码看起来大致如下:

将最小错误率minError设为+∞
对数据集中的每一个特征(第一层循环):  
	对每个步长(第二层循环):
		对每个不等号(第三层循环):
                  	 建立一棵单层决策树并利用加权数据集对它进行测试        
                   	 如果错误率低于minError,则将当前单层决策树设为最佳单层决策树   
返回最佳单层决策树

单层决策树生成函数

def buildStump(dataArr, classLabels, D):
    dataMat = mat(dataArr); labelMat = mat(classLabels).T
    m,n = shape(dataMat)
    numSteps = 10.0; bestStump = {}; bestClassErrorList = mat(zeros((m, 1)))
    minError = inf
    for i in range(n):
        rangeMin = dataMat[:,i].min()
        rangeMax = dataMat[:, i].max()
        stepSize = (rangeMax - rangeMin)/numSteps
        for j in range(-1, int(numSteps)+1):
            threshod = rangeMin + float(j) * stepSize
            for ineq in ['lt', 'gt']:
                predictVal = stumpClassify(dataMat, i, threshod, ineq)
                errArr = mat(ones((m,1)))
                errArr[predictVal == labelMat] = 0
                weightedError = D.T * errArr
                #print("split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshod, ineq, weightedError))
                if weightedError < minError:
                    minError = weightedError
                    bestClassErrorList = predictVal.copy()
                    bestStump['dim'] = i
                    bestStump['threshod'] = threshod
                    bestStump['ineq'] = ineq
	 return bestStump,minError,bestClassErrorList
                

完整AdaBoost算法的实现
整个实现的伪代码如下:

对每次迭代:    
 利用buildStump()函数找到最佳的单层决策树        
 将最佳单层决策树加入到单层决策树数组      
 计算alpha        
 计算新的权重向量D     
  更新累计类别估计值       
  如果错误率等于0.0,则退出循环    

基于单层决策树的AdaBoost训练过程

def adaBoostTrainDS(dataArr, classLabels, numIt = 40):
    labelMat = mat(classLabels).T
    weakClassArr = []
    m,n = shape(dataArr)
    D = mat(ones((m,1))/m)
    aggClassEst = mat(zeros((m, 1)))
    for i in range(numIt):
        bestStump, minError, bestClassEst = buildStump(dataArr, classLabels, D)
        #print("D:", D.T)
        #print("classEst: ", bestClassEst.T)
        alpha = float(0.5*log((1-minError)/max(minError,1e-16)))
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
        )
        expon = multiply(-1 * alpha * labelMat, bestClassEst)
        D = multiply(D, exp(expon))
        D = D/sum(D)
        aggClassEst += alpha * bestClassEst
        #print("aggClassEst: ",aggClassEst.T)
        aggErrors = multiply(sign(aggClassEst) != labelMat, ones((m,1)))
        #print("aggErrors error: ", aggErrors)
        errorRate = aggErrors.sum() / m
        #print("total error: ", errorRate)
        if errorRate == 0.0:
            break
return weakClassArr

测试算法:基于 AdaBoost的分类

def adaClassfy(dataToClassfy, classifierArr):
    dataMat = mat(dataToClassfy)
    m = shape(dataMat)[0]
    aggClassEst = mat(zeros((m, 1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMat,classifierArr[i]['dim'],classifierArr[i]['threshod'],classifierArr[i]['ineq'])
        aggClassEst += classifierArr[i]['alpha']*classEst
        print(aggClassEst)
    return sign(aggClassEst)
### AdaBoost算法的实现原理 AdaBoost(Adaptive Boosting)是一种经典的提升(Boosting)算法,最初由Yoav Freund和Robert Schapire于1995年提出[^1]。该算法的核心思想在于通过多次迭代训练多个弱学习器,并根据每次预测的结果调整样本权重,使得后续的学习器更加关注之前被错误分类的样本。 具体来说,AdaBoost的工作流程如下: 1. 初始化数据集中的每个样本权重为相等值。 2. 在每一轮迭代中,基于当前样本权重训练一个弱学习器。 3. 计算弱学习器的误差率以及对应的权重系数α。 4. 更新样本权重,增加那些被误分类样本的权重,减少正确分类样本的权重。 5. 将本轮得到的弱学习器加入到最终模型中,形成加权投票机制。 6. 循环上述过程直到达到预设的最大迭代次数或满足其他停止条件。 这种逐步改进的过程能够有效提高整体模型的表现能力。 ```python from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 创建模拟数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42) # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) # 构建AdaBoost分类器,默认基估计器为决策树桩 ada_clf = AdaBoostClassifier(n_estimators=50, learning_rate=1.0, random_state=42) # 模型拟合 ada_clf.fit(X_train, y_train) # 输出模型得分 print(f"Training Accuracy: {ada_clf.score(X_train, y_train)}") print(f"Test Accuracy: {ada_clf.score(X_test, y_test)}") ``` 以上代码展示了如何利用`scikit-learn`库快速构建并评估一个简单的AdaBoost分类器[^2]。 ### 使用案例分析 AdaBoost在实际应用中有许多成功案例,尤其是在二分类问题上表现出色。例如,在金融领域可以用于信用评分;在医疗诊断方面可用于疾病检测;另外还常见于图像处理任务如人脸识别等领域。由于其灵活性高且易于扩展至多类别的场景下工作,因此具有广泛的适用范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值