利用AdaBoost元算法提高分类性能
这里解除了一个新概念-元算法。元算法是对其他算法进行组合的一种方式,其中AdaBoost是最流行的元算法。接下来会建立一个单层决策树分类器,并且在一个复杂数据集上应用该分类器,来了解该算法是如何迅速超越其他分类器的。
我们可以将不同的分类器进行组合,这种租和结果则被称为集成方法或元算法。
AdaBoost的优点是繁华错误率低,易编码,可以应用在大部分分类器上,无参数调整。
缺点是对离群点敏感。
适用数据类型:数值型和标称型数据。
bagging:基于数据随机重抽样的分类器构建方法
bagging:自居汇聚法。是从原始数据集选择S次后得到一个新数据集的一种技术。新数据集和原数据集的大小相等。每个数据集都是通过在原始数据集中随机选择一个样本来进行替换而得到的。这一性质就允许新数据集中可以有重复的值,而原始数据集的某些之在新集合中则不再出现。
boosting:bagging不同的分类器是通过串行训练而获得的,每个新分类器都根据以训练出的分类器的性能来进行训练。而后者是通过集中关注被御用分类器错分的那些数据来获得新的分类器。前者中分类器的权重是相等的,而后者并不相等,每个权重代表是其对性分类器在上一轮迭代中的成功度。
AdaBoost运行过程如下:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D。这些权重一开始都初始化成想等值。首先在训练数据上练出一个弱分类器并计算给分类器的错误率,然后在统一数据集上再次训练弱分类器。在分类器的第二次训练当中,将会重新调整每个样本的权重,其中第一次分队的样本的权重将会降低,而第一次分错的样本的权重将会提高。为了从所有弱分类器中得到最终的分类结果,AdaBoost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。
错误率的定义为:
计算出alpha的值后,可以对权重向量D进行更新,一时的那些正确分类的样本的权重降低而错分样本的权重升高。D的计算方法如下:
之后AdaBoost开始进入下一轮迭代。不断重复悬链和调整权重的过程,知道训练错误率为0或者弱分类器的数目达到用户的指定值为止。
接下来建立完整的AdaBoost算法没在这之前先通过一些代码来建立弱分类器及保存数据集的权重。
基于单层决策树构建弱分类器
单层决策树是一种简单的决策树,它仅仅与单个特征来做决策,只有一次分裂过程。
先建立一个简单数据集来确保在算法实现上一切就绪。
def loadSimpData():
datMat = matrix([[1.,2.1],
[2.,1.1],
[1.3,1.],
[2.,1.]])
classLabels = [1.0,1.0,-1.0,-1.0,1.0]
return datMat,classLabels
dataMat,classLabels = loadSimpData()
通过这段代码来实现数据集和类标签的导入
接下来通过构建多个函数来建立单层决策树。
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
retArray = ones((shape(dataMatrix)[0],1))
if threshIneq == 'lt':
retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
else:
retArray[dataMatrix[:,dimen] > threshVal] = -1.0
return retArray
"""
首先将返回数组的全部元素设置为1,将所有不满足不等式要求的元素设置为-1
可以基于数据集中的任意元素进行比较,同时也可以将不等号在大于小于之间切换
第一个函数通过阈值比较对数据进行分类,所有在阈值一边的数据会分到类别-1,另一边的分到类别+1.
该函数可以通过数组过滤来实现。
"""
def bulidStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr)
labelMat = mat(classLabels).T
m,n = shape(dataMatrix)
numSteps = 10.0 #用于在特征的所有可能值上进行遍历。
bestStump = {} #构建一个空字典,用于存储给定权重向量D时所得到的最佳单层决策树的相关信息。
best