简单易学的机器学习算法——AdaBoost

一、集成方法(Ensemble Method)

集成方法主要包括Bagging和Boosting两种方法,随机森林算法是基于Bagging思想的机器学习算法,在Bagging方法中,主要通过对训练数据集进行随机采样,以重新组合成不同的数据集,利用弱学习算法对不同的新数据集进行学习,得到一系列的预测结果,对这些预测结果做平均或者投票做出最终的预测。AdaBoost算法和GBDT(Gradient
Boost Decision Tree,梯度提升决策树)算法是基于Boosting思想的机器学习算法。在Boosting思想中是通过对样本进行不同的赋值,对错误学习的样本的权重设置的较大,这样,在后续的学习中集中处理难学的样本,最终得到一系列的预测结果,每个预测结果有一个权重,较大的权重表示该预测效果较好,详细的思想可见博文“简单易学的机器学习算法——集成方法(Ensemble
Method)
”。

二、AdaBoost算法思想

AdaBoost算法是基于Boosting思想的机器学习算法,其中AdaBoost是Adaptive
Boosting的缩写,AdaBoost是一种迭代型的算法,其核心思想是针对同一个训练集训练不同的学习算法,即弱学习算法,然后将这些弱学习算法集合起来,构造一个更强的最终学习算法。

为了构造出一个强的学习算法,首先需要选定一个弱学习算法,并利用同一个训练集不断训练弱学习算法,以提升弱学习算法的性能。在AdaBoost算法中,有两个权重,第一个数训练集中每个样本有一个权重,称为样本权重,用向量表示;另一个是每一个弱学习算法具有一个权重,用向量表示。假设有个样本的训练集,初始时,设定每个样本的权重是相等的,即,利用第一个弱学习算法对其进行学习,学习完成后进行错误率的统计:

其中,表示被错误分类的样本数目,表示所有样本的数目。这样便可以利用错误率计算弱学习算法的权重

在第一次学习完成后,需要重新调整样本的权重,以使得在第一分类中被错分的样本的权重,使得在接下来的学习中可以重点对其进行学习:

其中,表示对第个样本训练正确,表示对第个样本训练错误。是一个归一化因子:

这样进行第二次的学习,当学习轮后,得到了个弱学习算法及其权重。对新的分类数据,分别计算个弱分类器的输出,最终的AdaBoost算法的输出结果为:

其中,是符号函数。具体过程可见下图所示:

(图片来自参考文件1)

三、AdaBoost算法流程

上述为AdaBoost的基本原理,下面给出AdaBoost算法的流程:

(来自参考文献2)

四、实际的例子

AdaBoost算法是一种具有很高精度的分类器,其实AdaBoost算法提供的是一种框架,在这种框架下,我们可以使用不同的弱分类器,通过AdaBoost框架构建出强分类器。下面我们使用单层决策树构建一个分类器处理如下的分类问题:

决策树算法主要有ID3,C4.5和CART,其中ID3和C4.5主要用于分类,CART可以解决回归问题。ID3算法可见博文“简单易学的机器学习算法——决策树之ID3算法”,CART算法可见博文“简单易学的机器学习算法——CART之回归树”。对于单层决策树是无法求解上面这样的问题的。

Python代码

#coding:UTF-8
'''
Created on 2015年6月15日

@author: zhaozhiyong

'''

from numpy import *

def loadSimpleData():
    datMat = mat([[1., 2.1],
                  [2., 1.1],
                  [1.3, 1.],
                  [1., 1.],
                  [2., 1.]])
    classLabels = mat([1.0, 1.0, -1.0, -1.0, 1.0])
    return datMat, classLabels

def singleStumpClassipy(dataMat, dim, threshold, thresholdIneq):
    classMat = ones((shape(dataMat)[0], 1))
    #根据thresholdIneq划分出不同的类,在'-1'和'1'之间切换
    if thresholdIneq == 'left':#在threshold左侧的为'-1'
        classMat[dataMat[:, dim] <= threshold] = -1.0
    else:
        classMat[dataMat[:, dim] > threshold] = -1.0

    return classMat

def singleStump(dataArr, classLabels, D):
    dataMat = mat(dataArr)
    labelMat = mat(classLabels).T
    m, n = shape(dataMat)
    numSteps = 10.0
    bestStump = {}
    bestClasEst = zeros((m, 1))
    minError = inf
    for i in xrange(n):#对每一个特征
        #取第i列特征的最小值和最大值,以确定步长
        rangeMin = dataMat[:, i].min()
        rangeMax = dataMat[:, i].max()
        stepSize = (rangeMax - rangeMin) / numSteps
        for j in xrange(-1, int(numSteps) + 1):
            #不确定是哪个属于类'-1',哪个属于类'1',分两种情况
            for inequal in ['left', 'right']:
                threshold = rangeMin + j * stepSize#得到每个划分的阈值
                predictionClass = singleStumpClassipy(dataMat, i, threshold, inequal)
                errorMat = ones((m, 1))
                errorMat[predictionClass == labelMat] = 0
                weightedError = D.T * errorMat#D是每个样本的权重
                if weightedError < minError:
                    minError = weightedError
                    bestClasEst = predictionClass.copy()
                    bestStump['dim'] = i
                    bestStump['threshold'] = threshold
                    bestStump['inequal'] = inequal

    return bestStump, minError, bestClasEst

def adaBoostTrain(dataArr, classLabels, G):
    weakClassArr = []
    m = shape(dataArr)[0]#样本个数
    #初始化D,即每个样本的权重
    D = mat(ones((m, 1)) / m)
    aggClasEst = mat(zeros((m, 1)))

    for i in xrange(G):#G表示的是迭代次数
        bestStump, minError, bestClasEst = singleStump(dataArr, classLabels, D)
        print 'D:', D.T
        #计算分类器的权重
        alpha = float(0.5 * log((1.0 - minError) / max(minError, 1e-16)))
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
        print 'bestClasEst:', bestClasEst.T

        #重新计算每个样本的权重D
        expon = multiply(-1 * alpha * mat(classLabels).T, bestClasEst)
        D = multiply(D, exp(expon))
        D = D / D.sum()

        aggClasEst += alpha * bestClasEst
        print 'aggClasEst:', aggClasEst
        aggErrors = multiply(sign(aggClasEst) != mat(classLabels).T, ones((m, 1)))
        errorRate = aggErrors.sum() / m
        print 'total error:', errorRate
        if errorRate == 0.0:
            break
    return weakClassArr

def adaBoostClassify(testData, weakClassify):
    dataMat = mat(testData)
    m = shape(dataMat)[0]
    aggClassEst = mat(zeros((m, 1)))
    for i in xrange(len(weakClassify)):#weakClassify是一个列表
        classEst = singleStumpClassipy(dataMat, weakClassify[i]['dim'], weakClassify[i]['threshold'], weakClassify[i]['inequal'])
        aggClassEst += weakClassify[i]['alpha'] * classEst
        print aggClassEst
    return sign(aggClassEst)

if __name__ == '__main__':
    datMat, classLabels = loadSimpleData()
    weakClassArr = adaBoostTrain(datMat, classLabels, 30)
    print "weakClassArr:", weakClassArr
    #test
    result = adaBoostClassify([1, 1], weakClassArr)
    print result

最终的决策树序列:

weakClassArr: [{‘threshold‘: 1.3, ‘dim‘: 0, ‘inequal‘: ‘left‘, ‘alpha‘: 0.6931471805599453}, {‘threshold‘: 1.0, ‘dim‘: 1, ‘inequal‘: ‘left‘, ‘alpha‘: 0.9729550745276565}, {‘threshold‘:
0.90000000000000002, ‘dim‘: 0, ‘inequal‘: ‘left‘, ‘alpha‘: 0.8958797346140273}]

参考

1、机器学习实战

2、A Short Introduction to Boosting

时间: 2024-08-02 02:48:00

简单易学的机器学习算法——AdaBoost的相关文章

简单易学的机器学习算法——EM算法

一.机器学习中的參数预计问题 在前面的博文中,如"简单易学的机器学习算法--Logistic回归"中,採用了极大似然函数对其模型中的參数进行预计,简单来讲即对于一系列样本,Logistic回归问题属于监督型学习问题,样本中含有训练的特征 X_i" title="X_i" >以及标签.在Logistic回归的參数求解中.通过构造样本属于类别和类别的概率: 这样便能得到Logistic回归的属于不同类别的概率函数: 此时,使用极大似然预计便可以预计出模型

[转载]简单易学的机器学习算法-决策树之ID3算的

一.决策树分类算法概述 决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类.例如对于如下数据集 (数据集) 其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是,0表示否.决策树算法的思想是基于属性对数据分类,对于以上的数据我们可以得到以下的决策树模型 (决策树模型) 先是根据第一个属性将一部份数据区分开,再根据第二个属性将剩余的区分开. 实现决策树的算法有很多种,有ID3.C4.5和CART等算法.下面我们介绍ID3算法. 二.ID3算法的概述 ID3算法是由Q

简单易学的机器学习算法——集成方法(Ensemble Method)

一.集成学习方法的思想 前面介绍了一系列的算法,每个算法有不同的适用范围,例如有处理线性可分问题的,有处理线性不可分问题.在现实世界的生活中,常常会因为"集体智慧"使得问题被很容易解决,那么问题来了,在机器学习问题中,对于一个复杂的任务来说,能否将很多的机器学习算法组合在一起,这样计算出来的结果会不会比使用单一的算法性能更好?这样的思路就是集成学习方法. 集成学习方法是指组合多个模型,以获得更好的效果,使集成的模型具有更强的泛化能力.对于多个模型,如何组合这些模型,主要有以下几种不同的

简单易学的机器学习算法——基于密度的聚类算法DBSCAN

一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks>引起了大家的关注(在我的博文"论文中的机器学习算法--基于密度峰值的聚类算法"中也进行了中文的描述).于是我就想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. 基于密度的聚类算法主要的目标是寻找被低密度区域分离的高密度区域.与基于距离的聚

简单易学的机器学习算法——因子分解机(Factorization Machine)

一.因子分解机FM的模型 因子分解机(Factorization Machine, FM)是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法. 1.因子分解机FM的优势 对于因子分解机FM来说,最大的特点是对于稀疏的数据具有很好的学习能力.现实中稀疏的数据很多,例如作者所举的推荐系统的例子便是一个很直观的具有稀疏特点的例子. 2.因子分解机FM的模型 对于度为2的因子分解机FM的模型为: 其中,参数,,.表示的是两个大小为的向量和向量的点积: 其中,表示的是系数矩阵的第维向量,

简单易学的机器学习算法——Mean Shift聚类算法

一.Mean Shift算法概述 Mean Shift算法,又称为均值漂移算法,Mean Shift的概念最早是由Fukunage在1975年提出的,在后来由Yizong Cheng对其进行扩充,主要提出了两点的改进: 定义了核函数: 增加了权重系数. 核函数的定义使得偏移值对偏移向量的贡献随之样本与被偏移点的距离的不同而不同.权重系数使得不同样本的权重不同.Mean Shift算法在聚类,图像平滑.分割以及视频跟踪等方面有广泛的应用. 二.Mean Shift算法的核心原理 2.1.核函数 在

简单易学的机器学习算法——极限学习机(ELM)

极限学习机的概念 ELM是一种新型的快速学习算法,对于单隐层神经网络,ELM可以随机初始化输入权重和偏置并得到相应的输出权重. 对于一个单隐层神经网络,假设有N个任意的样本,其中, .对于一个有个隐层节点的单隐层神经网络可以表示为 其中,为激活函数,为输入权重, 为输出权重,是第个隐层单元的偏置. 单隐层神经网络的学习目标是使得输出的误差最小,可以表示为 即存在,和 ,使得 可以矩阵表述为. 其中,是隐层节点的输出,为输出权重,为期望输出. ,

简单易学的机器学习算法——神经网络之BP神经网络

一.BP神经网络的概念 BP神经网络是一种多层的前馈神经网络,其基本的特点是:信号是前向传播的,而误差是反向传播的.详细来说.对于例如以下的仅仅含一个隐层的神经网络模型: (三层BP神经网络模型) BP神经网络的过程主要分为两个阶段.第一阶段是信号的前向传播,从输入层经过隐含层.最后到达输出层:第二阶段是误差的反向传播,从输出层到隐含层.最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置. 二.BP神经网络的流程 在知道了BP神经网络的特点后,我们须要根据信号的前向传播

简单易学的机器学习算法——谱聚类(Spectal Clustering)

一.复杂网络中的一些基本概念 1.复杂网络的表示 在复杂网络的表示中,复杂网络可以建模成一个图,其中,表示网络中的节点的集合,表示的是连接的集合.在复杂网络中,复杂网络可以是无向图.有向图.加权图或者超图. 2.网络簇结构 网络簇结构(network cluster structure)也称为网络社团结构(network community structure),是复杂网络中最普遍和最重要的拓扑属性之一.网络簇是整个网络中的稠密连接分支,具有同簇内部节点之间相互连接密集,不同簇的节点之间相互连接