EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略

EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略


AdaBoost算法的简介

Adaptive Boosting或称为AdaBoost,是多种学习算法的融合。Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
        算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。

AdaBoost是最常用的算法。它可用于回归或者分类算法。相比其他机器学习算法,它克服了过拟合的问题,通常对异常值和噪声数据敏感。为了创建一个强大的复合学习器,AdaBoost使用了多次迭代。因此,它又被称为“Adaptive Boosting”。通过迭代添加弱学习器,AdaBoost创建了一个强学习器。一个新的弱学习器加到实体上,并且调整加权向量,作为对前一轮中错误分类的样例的回应。得到的结果,是一个比弱分类器有更高准确性的分类器。
        AdaBoost有助于将弱阈值的分类器提升为强分类器。上面的图像描述了AdaBoost的执行,只用了简单易于理解的代码在一个文件中就实现了。这个函数包含一个弱分类器和boosting组件。弱分类器在一维的数据中尝试去寻找最理想的阈值来将数据分离为两类。boosting组件迭代调用分类器,经过每一步分类,它改变了错误分类示例的权重。因此,创建了一个级联的弱分类器,它的行为就像一个强分类器。
        目前,对Adaboost算法的研究以及应用大多集中于分类问题,同时近年也出现了一些在回归问题上的应用。Adaboost系列主要解决了:两类问题、多类单标签问题、多类多标签问题、大类单标签问题和回归问题。它用全部的训练样本进行学习。
以上主要参考:《2019中国人工智能发展报告》—清华大学中国工程院知识智能中心—201912

1、理解AdaBoost算法

1.1、从前向逐步递增角度来看理解AdaBoost:要找到最优的f很难→每次递增。

1.2、前向逐步递增的损失函数—L2Boosting

2、AdaBoost M1算法证明过程

(1)、证明过程

AdaBoost算法的经典案例

相关文章:机器学习实战之AdaBoost算法

1、预测马疝病是否死亡的数据集

#自适应加载数据
def loadDataSet(filename):
    #创建数据集矩阵,标签向量
    dataMat=[];labelMat=[]
    #获取特征数目(包括最后一类标签)
    #readline():读取文件的一行
    #readlines:读取整个文件所有行
    numFeat=len(open(filename).readline().split('\t'))
    #打开文件
    fr=open(filename)
    #遍历文本每一行
    for line in fr.readlines():
        lineArr=[]
        curLine=line.strip().split('\t')
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        #数据矩阵
        dataMat.append(lineArr)
        #标签向量
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

#自适应加载数据
def loadDataSet(filename):
    #创建数据集矩阵,标签向量
    dataMat=[];labelMat=[]
    #获取特征数目(包括最后一类标签)
    #readline():读取文件的一行
    #readlines:读取整个文件所有行
    numFeat=len(open(filename).readline().split('\t'))
    #打开文件
    fr=open(filename)
    #遍历文本每一行
    for line in fr.readlines():
        lineArr=[]
        curLine=line.strip().split('\t')
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        #数据矩阵
        dataMat.append(lineArr)
        #标签向量
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

#训练和测试分类器
def classify():
    #利用训练集训练分类器
    datArr,labelArr=loadDataSet('horseColicTraining2.txt')
    #得到训练好的分类器
    classifierArray=adaBoostTrainDS(datArr,labelArr,10)
    #利用测试集测试分类器的分类效果
    testArr,testLabelArr=loadDataSet('horseClicTest2.txt')
    prediction=adaClassify(testArr,classifierArray)
    #输出错误率
    num=shape(mat(labelArr))[1]
    errArr=mat(ones((num,1)))
    error=errArr[prediction!=mat(testLabelArr).T].sum()
    print("the errorRate is: %.2f",errorRate=float(error)/float((num)))

(0)

相关推荐