Adaboost的python实现

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

2.算法逻辑
1、先通过对N个训练样本的学习得到第一个弱分类器; 2、将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器; 3、将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器 4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。

3.实现(参考西瓜书及机器学习实战)

#adaBoost实现
def adaBoostTrain(dataArr,classLabels,numIt=40):
    weakClassArr = []
    m = np.shape(dataArr)[0]
    D = np.mat(np.ones((m,1))/m)   #初始化权重,每个feature都一样
    aggClassEst = np.mat(np.zeros((m,1)))
    #唯一的入参是迭代次数,要么error为 0跳出循环 ,要么循环次数达到numIt 的时候跳出循环
    for i in range(numIt):
        # 决策树桩算法,也可以换成其他的算法
        bestStump,error,classEst = buildStump(dataArr,classLabels,D)
        #print "D:",D.T
        alpha = float(0.5*np.log((1.0-error)/max(error,1e-16)))#计算alpha值
        bestStump['alpha'] = alpha  
        weakClassArr.append(bestStump)
        #print "classEst: ",classEst.T
        #重新计算权重
        expon = np.multiply(-1*alpha*np.mat(classLabels).T,classEst)
        D = np.multiply(D,np.exp(expon))
        D = D/D.sum()
        aggClassEst += alpha*classEst
        aggErrors = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T,np.ones((m,1)))
        errorRate = aggErrors.sum()/m
        print "total error: ",errorRate
        if errorRate == 0.0: break
        print "weakClassArr:",weakClassArr
        print "aggClassEst:", aggClassEst

    return weakClassArr,aggClassEst

相关推荐