【機器學習算法-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


接着是樹的分類函數。這個函數在以下的循環里要用到,作用非常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


最后是構建二叉樹函數,通過循環比較得到最佳特征值和它的閾值。D是初始矩陣的權重。
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 actionPeter Harrington
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM