集成学习4——boost

本博客仅用于知识记录,方便自己学习,有错误之处欢迎指正

若有雷同请联系我

参考:清华大学 袁博老师 数据挖掘课程  

参考:https://www.cnblogs.com/earendil/p/8872001.html

代码参考:https://www.jianshu.com/p/ef16be5b66f4?utm_source=oschina-app

1. boosting与bagging的区别:

    1)boosting是串行训练的,而bagging是可以将多个分类器并行训练

    2)bagging是有放回的取样本,boosting不需要以bootstrap的方式取样

    3)bagging每个样本的权重是一样的,boosting不同样本权重不一样,对分错的样本增加权重,分对的下调权重,从而达到更着重训练这些样本的目的

2.小例子(例子来源袁博老师课程):

     先用数据训练第一个分类器c1,然后对c1进行测试,在c1中被分错的样本将在训练c2的时候着重训练(每次测试完,会对样本的权重进行调整)

训练得到c2后,继续进行测试,重新调整训练集,然后训练c3,一直训练到分类器个数达到要求。对重对N个学习器加权结合

 3.Adaboost——经典的boosting算法

\alpha = \frac{1}{2}ln(\frac{1-\epsilon}{\epsilon}),Adaboost会给每个学习器添加一个α权重,这个α是固定的,不会变化,\epsilon是学习器错误率

分类正确的样本权重,分类错误的权重调整

伪代码:


import numpy as np


def getAlpha(error):
    alpha = 0.5 * np.math.log((1.0 - error) / max(error, 1e-16))
    return alpha



#通过阈值对数据分类+1 -1
#dimen为dataMat的列索引值,即特征位置;threshIneq为阈值对比方式,大于或小于
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
    retArray = np.ones((dataMatrix.shape[0],1))
    #阈值的模式,将小于某一阈值的特征归类为-1
    if threshIneq=='lt':#less than
        retArray[dataMatrix[:,dimen] <= threshVal]=-1.0
    #将大于某一阈值的特征归类为-1
    else:#greater than
        retArray[dataMatrix[:,dimen] > threshVal]=-1.0
    return retArray



#单层决策树生成函数
def buildStump(dataArr, labels, D):
    dataMatrix = dataArr
    labels = np.squeeze(labels.T)
    m, n = dataMatrix.shape #m是样本数,n是特征数
    #步长或区间总数 最优决策树信息 最优单层决策树预测结果
    numSteps=10.0
    bestStump={}
    bestClasEst = np.zeros((m,1))
    minError = np.inf
     #遍历数据集的每个特征:遍历特征的每个步长:遍历步长的每个阈值对比方式
    for i in range(n):
        rangeMin = dataMatrix[:, i].min()
        rangeMax = dataMatrix[:, i].max()
        stepSize = (rangeMax - rangeMin) / 2.
        for j in range(-1, int(numSteps) + 1):
            for inequal in ['lt', 'gt']:
                thresV = rangeMin + float(j) * stepSize
                predV = stumpClassify(dataMatrix, i, thresV, inequal)
                errArr = np.ones((m, 1))
                errArr[np.squeeze(predV.T) == labels] = 0
                
                weightError = np.dot(D.T, errArr)
                if weightError < minError:
                    minError = weightError
                    bestClasEst = predV.copy()
                    bestStump['dim']=i
                    bestStump['thresh']=thresV
                    bestStump['ineq']=inequal
    return bestStump,minError,bestClasEst


def Adaboost(dataArr, labels, num=40):
    weakClassArr = []
    m = dataArr.shape[0]
    D = np.ones((m, 1)) / m
    aggClassEst = np.zeros((m, 1))
    labels = labels[np.newaxis, :].T
    for i in range(num):
        bestStump, minError, bestClasEst = buildStump(dataArr, labels, D)
        alpha = getAlpha(minError)
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
        
        expon = np.multiply(-1 * alpha * labels, bestClasEst)
        D = np.multiply(np.exp(expon), D) / np.sum(D)
        # D = np.squeeze(D)
        if len(D.shape) > 2:
            D = np.squeeze(D, 0)
        aggClassEst += alpha * bestClasEst
        aggError = np.multiply(np.sign(aggClassEst) != labels.T, np.ones((m, 1)))
        errorRate = aggError.sum() / m
        if errorRate == 0:
            break
    return weakClassArr, errorRate, aggClassEst

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值