【机器学习算法-python实现】Adaboost的实现(1)-单层决策树(decision stump)
生活随笔
收集整理的這篇文章主要介紹了
【机器学习算法-python实现】Adaboost的实现(1)-单层决策树(decision stump)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(轉載請注明出處: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
接著是樹的分類函數。這個函數在下面的循環里要用到,作用很簡單,就是比對每一列的特征值和目標函數,返回比對的結果。四個參數分別是(輸入矩陣,第幾列,閾值,lt或gt) def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the dataretArray = ones((shape(dataMatrix)[0],1))if threshIneq == 'lt':retArray[dataMatrix[:,dimen] <= threshVal] = -1.0else:retArray[dataMatrix[:,dimen] > threshVal] = -1.0return retArray
最后是構建二叉樹函數,通過循環比較得到最佳特征值和它的閾值。D是初始矩陣的權重。
def buildStump(dataArr,classLabels,D):dataMatrix = mat(dataArr); labelMat = mat(classLabels).Tm,n = shape(dataMatrix)numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))minError = inf #init error sum, to +infinityfor i in range(n):#loop over all dimensionsrangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();stepSize = (rangeMax-rangeMin)/numStepsfor j in range(-1,int(numSteps)+1):#loop over all range in current dimensionfor inequal in ['lt', 'gt']: #go over less than and greater thanthreshVal = (rangeMin + float(j) * stepSize)predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThanerrArr = mat(ones((m,1)))errArr[predictedVals == labelMat] = 0weightedError = 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 = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequalreturn 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.代碼下載
下載地址(Decision Stump)
參考文獻:
? ? [1] machine learning in action,Peter Harrington
? ?
總結
以上是生活随笔為你收集整理的【机器学习算法-python实现】Adaboost的实现(1)-单层决策树(decision stump)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习算法-python实现】svm
- 下一篇: linux修改path路径