Adaboost详解,推导与实现

主要观点

  • 使用很多弱学习器来做分类,这些弱学习器最常使用的是Decision Stumps,指的是只有一个划分的决策树模型。如下图所示:
    在这里插入图片描述

  • 弱分类器组合成强分类器的方法:
    AdaBoost 采取加权多数表决的方法。具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

  • 每一轮如何改变训练数据的权值或概率分布:
    AdaBoost 根据错误率修改当前样本的权值分布。初始每个数据的权值都是一样的,当前分类器误分的数据将会得到更大的权值,目的是在下一个分类器的训练中,重点关注之前容易被误分的数据,降低错误率。

  • 串行训练模型,每个模型需要重点关注之前的分类器表现不佳的地方。

算法介绍

![[Pasted image 20230321154246.png]]

  • h t ( x ) : h_t(x): ht(x)第t个基分类器; f ( x ) : f(x): f(x):真实值
  • 基学习器需要满足的条件:

基学习算法能对带权样本进行学习,如果不能,使用“重采样法(re-sampling)”来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。

  • 权值分布 D i ( x ) D_i(x) Di(x)为向量,表示为 D i ( x ) = ( w i 1 , . . . w i 2 , . . . w i m ) D_i(x) = (w_{i1},...w_{i2},...w_{im}) Di(x)=(wi1,...wi2,...wim).初始化的时候 w 1 i = 1 / m w_{1i}=1/m w1i=1/m
  • ϵ t \epsilon_t ϵt表示的是分类器 h t h_t ht在数据集上的分类误差率,计算公式为: ϵ t = ∑ i = 1 m P ( h t ( x i ) ≠ f ( x i ) ) = ∑ i = 1 m w t i I ( h t ( x i ) ≠ f ( x i ) ) \epsilon_t=\sum_{i=1}^m P(h_t(x_i) \not= f(x_i)) = \sum_{i=1}^m w_{ti}I(h_t(x_i) \not= f(x_i)) ϵt=i=1mP(ht(xi)=f(xi))=i=1mwtiI(ht(xi)=f(xi))
  • ϵ t > 0.5 \epsilon_t>0.5 ϵt>0.5的时候,权重 α t \alpha_t αt是一个负数,说明基学习器不满足基本条件(基分类器没有比随即猜测好),break出去终止学习。此时如果 H ( x ) H(x) H(x)包含的基学习器较少,那么可以采用"重采样法",则可获得"重启动"机会以避免训练过程过早停止,即在抛弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。
  • 规范化因子 Z t Z_t Zt是为了保证新的权重加和为一,因此规范化因子 Z t Z_t Zt计算公式为: Z t = ∑ i = 1 m w t i e x p ( − α t f ( x i ) h t ( x i ) ) Z_t=\sum_{i=1}^mw_{ti}exp(-\alpha_tf(x_i)h_t(x_i)) Zt=i=1mwtiexp(αtf(xi)ht(xi))
  • 计算训练数据集的权重的时候,如果是分类正确就乘上 e x p ( − α t ) exp(-\alpha_t) exp(αt)使得权重缩小,反之分类错误就乘上 e x p ( α t ) exp(\alpha_t) exp(αt)使权重扩大。
  • 最后得到的 H ( x ) H(x) H(x)使用sign函数来表示正类还是负类,也就是说这个算法是讨论的是一个二分类问题,标签是{-1,+1}。

AdaBoost推导

AdaBoost最好理解的推导是基于“加性模型”,即用基学习器的组合 H ( x ) = ∑ t = 1 T α t h t ( x ) H(x)=\sum_{t=1}^T\alpha_th_t(x) H(x)=t=1Tαtht(x)
来最小化指数损失函数 l e x p ( H ∣ D ) = E x − D [ e − f ( x ) H ( x ) ] l_{exp}(H|D)=E_{x-D}[e^{-f(x)H(x)}] lexp(HD)=ExD[ef(x)H(x)].

引入指数损失函数代替0-1损失函数

在这里插入图片描述
当损失函数最小化的时候,我们可以看到最后得到的强学习器 s i g n ( H ( x ) ) sign(H(x)) sign(H(x))分类错误率最小。因为当 f ( x ) = 1 f(x)=1 f(x)=1的概率 > f ( x ) = − 1 >f(x)=-1 >f(x)=1的时候,分类器将它归为正类而不是负类。因此我们可以使用指数损失函数来代替原本的0-1损失函数,指数损失函数具有连续可微等优良性质。

推导 α t \alpha_t αt的式子

在这里插入图片描述
在这里插入图片描述

推导样本权重更新的式子

在这里插入图片描述

AdaBoost的python实现

from sklearn import datasets
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
import numpy as np
import math

data = pd.read_excel('data.xls')
data['approve'].mask(data['approve']==0,-1,inplace=True)
feature_name = data.columns[:-2]
x = data.iloc[:,:-2].values
y = data.iloc[:,-1].values
weight = [1/len(y) for i in y] # 初始化权重,代表权重都相同

def score(pred,true,weight):
    prob = 0
    for i in range(len(pred)):
        if pred[i]!=true[i]:
            prob+=weight[i] #样本带权重,因此计算公式需要考虑概率
    return prob

def Weight(pred,true,weight,alpha):
    norm = 0
    for i in range(len(pred)):
        norm += weight[i]*math.exp(-alpha*pred[i]*true[i])
    for i in range(len(pred)):
        weight[i] = weight[i]*math.exp(-alpha*pred[i]*true[i])/norm
    return weight
model  = DecisionTreeClassifier(max_depth=1)
result = []
for i in range(50):
    model.fit(x,y,sample_weight=weight)
    pred = model.predict(x)
    prob = score(pred,y,weight) #不准确率
    if prob>0.5:
        break
    else:
        alpha = 1/2*math.log((1-prob)/prob,math.e) #基学习器的权重  
        result.append([i*alpha for i in pred]) # 基学习器的加权预测效果,用于最终形成强学习器
        weight = Weight(pred,y,weight,alpha)

result = np.array(result)
outcome = np.sum(result,axis=0)
pred_target = np.where(outcome>0,1,-1)
print((pred_target == y).mean())
#准确率=0.6040268456375839

# 发现adaboost对于该数据集的最高准确率是0.59左右,说明有一定的上限
ada = AdaBoostClassifier(n_estimators=50)
ada.fit(x,y)
ada.score(x,y)
#准确率=0.5906040268456376

根据上面代码得出的结果发现adaboost的实现应该是没有问题的,并且有防止过拟合的效果,决策树不剪枝的准确率是0.85.

参考:
1.西瓜书
2.李航 统计学习方法
3.https://www.analyticsvidhya.com/blog/2021/09/adaboost-algorithm-a-complete-guide-for-beginners/
4.https://www.youtube.com/watch?v=LsK-xG1cLYA&t=145s

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值