(轉載請注明出處:http://blog.csdn.net/buptgshengod)
1.背景
上一節學習支持向量機,感覺公式都太難理解了,弄得我有點頭大。只是這一章的Adaboost線比較起來就容易得多。
Adaboost是用元算法的思想進行分類的。
什么事元算法的思想呢?就是依據數據集的不同的特征在決定結果時所占的比重來划分數據集。就是要對每一個特征值都構建決策樹,而且賦予他們不同的權值,最后集合起來比較。
比方說我們能夠通過是否有胡子和身高的高度這兩個特征來來決定一個人的性別,非常明顯是否有胡子可能在判定性別方面比身高更准確,所以在判定的時候我們就賦予這個特征更大的權重,比方說我們把權重設成0.8:0.2。
這樣就比0.5:0.5的權重來的更准確些。
2.構建決策樹
接着我們來構建決策樹。我們的決策樹要實現主要兩個功能,一個是找出對結果影響最大的特征值。另外一個功能是找到這個特征值得閾值。閾值就是,比方說閾值是d,當特征值大於d結果為1,當特征值小於d結果為0。
首先看下數據集。是一個兩個特征值的矩陣。
ef 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
接着是樹的分類函數。這個函數在以下的循環里要用到,作用非常easy,就是比對每一列的特征值和目標函數,返回比對的結果。四個參數各自是(輸入矩陣,第幾列,閾值,lt或gt)
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the data
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 #init error sum, to +infinity
for i in range(n):#loop over all dimensions
rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();
stepSize = (rangeMax-rangeMin)/numSteps
for j in range(-1,int(numSteps)+1):#loop over all range in current dimension
for inequal in ['lt', 'gt']: #go over less than and greater than
threshVal = (rangeMin + float(j) * stepSize)
predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThan
errArr = mat(ones((m,1)))
errArr[predictedVals == labelMat] = 0
weightedError = D.T*errArr #calc total error multiplied by D
#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
3.結果
當我們如果初始權重同樣(5行數據也就是都是0.2),得到結果
{'dim': 0, 'ineq': 'lt', 'thresh': 1.3}——第一個特征值權重最大。閾值是1.3
[[ 0.2]]——錯誤率0.2,也就是五個錯一個
[[-1.]————推斷結果。第一個數據錯誤
[ 1.]
[-1.]
[-1.]
[ 1.]]
4.代碼下載
參考文獻:
[1] machine learning in action,Peter Harrington
