您的位置:首页 > 编程语言 > Python开发

AdaBoost算法1(基于单层决策树)

2016-03-12 21:45 856 查看
今天我们来讨论一个不一样的分类算法,这种算法叫做元算法,元算法是一种与其他算法组合在一起来使用的算法。今天我们来讨论自适应boosting:在训练数据中的每一个样本赋予一个权重,这些权重构成向量D,开始时权重值相等,在训练弱分类器的过程中这些权重值会发生变化,对于分对的样本权重值会下降,对于分错的样本其权重值会提高。直到所有数据全部正确分类。下面就来介绍一种基于单层决策树的自适应分类器:
from numpy import *

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

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

def buildStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr); labelMat = mat(classLabels).T
m,n = shape(dataMatrix)
numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))
minError = inf
for i in range(n):
rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();
stepSize = (rangeMax-rangeMin)/numSteps
for j in range(-1,int(numSteps)+1):
for inequal in ['lt', 'gt']:
threshVal = (rangeMin + float(j) * stepSize)
predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)
errArr = mat(ones((m,1)))
errArr[predictedVals == labelMat] = 0
weightedError = D.T*errArr
print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)
if weightedError < minError:
minError = weightedError
bestClasEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump,minError,bestClasEst
第一个函数不过多解释,初始化数据。第二个函数用于测试是否有某个值小于或者大于测试的阀值。首先初始化一个数组全为1,接下来将符合小于或者大于阀值的数值设为-1.第二个函数就比较难一点了。输入数据包括特征数据和标签数据,以及一个非常重要的权重向量。它是一个基于数据的权重向量,一会就会看到它的用途,接下来在数据集上的所有特征值上进行遍历,找出最大之和最小值,然后计算出步长,接下来第二层循环再次遍历整个数据集,threshVal计算出阀值,然后调用stumpClassify()函数。接下来就是将正确分类的样本设为0,错误的设置为1.接下来用权重向量和错误向量相乘并求和得到相应的错误率,最后返回错误率最小情况下的决策树,错误率和类别估计值。到此单层决策树已经生成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息