讀古今文學網 > 機器學習實戰 > 7.5 測試算法:基於AdaBoost的分類 >

7.5 測試算法:基於AdaBoost的分類

一旦擁有了多個弱分類器以及其對應的alpha值,進行測試就變得相當容易了。在程序清單7-2的adaBoostTrainDS中,我們實際已經寫完了大部分的代碼。現在,需要做的就只是將弱分類器的訓練過程從程序中抽出來,然後應用到某個具體的實例上去。每個弱分類器的結果以其對應的alpha值作為權重。所有這些弱分類器的結果加權求和就得到了最後的結果。在程序清單7-3中列出了實現這一過程的所有代碼。然後,將下列代碼添加到adaboost.py中,就可以利用它基於adaboostTrainDS中的弱分類器對數據進行分類。

程序清單7-3 AdaBoost分類函數

def adaClassify(datToClass,classifierArr):
    dataMatrix = mat(datToClass)
    m = shape(dataMatrix)[0]
    aggClassEst = mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],classifierArr[i]['thresh'],classifierArr[i]['ineq'])
        aggClassEst += classifierArr[i]['alpha']*classEst
        print aggClassEst
    return sign(aggClassEst) 
  

讀者也許可以猜到,上述的adaClassify函數就是利用訓練出的多個弱分類器進行分類的函數。該函數的輸入是由一個或者多個待分類樣例datToClass以及多個弱分類器組成的數組classifierArr。函數adaClassify首先將datToClass轉換成了一個NumPy矩陣,並且得到datToClass中的待分類樣例的個數m。然後構建一個0列向量aggClassEst,這個列向量與adaBoostTrainDS中的含義一樣。

接下來,遍歷classifierArr中的所有弱分類器,並基於stumpClassify對每個分類器得到一個類別的估計值。在前面構建單層決策樹時,我們已經見過了stumpClassify函數,在那裡,我們在所有可能的樹樁值上進行迭代來得到具有最小加權錯誤率的單層決策樹。而這裡我們只是簡單地應用了單層決策樹。輸出的類別估計值乘上該單層決策樹的alpha權重然後累加到aggClassEst上,就完成了這一過程。上述程序中加入了一條print語句,以便我們瞭解aggClassEst每次迭代後的變化結果。最後,程序返回aggClassEst的符號,即如果aggClassEst大於0則返回+1,而如果小於0則返回-1。

我們再看看實際中的運行效果。加入程序清單7-3中的代碼之後,在Python提示符下輸入:

>>> reload(adaboost)
<module 'adaboost' from 'adaboost.py'> 
  

如果沒有弱分類器數組,可以輸入如下命令:

>>> datArr,labelArr=adaboost.loadSimpData
>>> classifierArr = adaboost.adaBoostTrainDS(datArr,labelArr,30) 
  

於是,可以輸入如下命令進行分類:

>>> adaboost.adaClassify([0, 0],classifierArr)
[[-0.69314718]]
[[-1.66610226]]
[[-2.56198199]]
matrix([[-1.]])   
  

可以發現,隨著迭代的進行,數據點[0,0]的分類結果越來越強。當然,我們也可以在其他點上進行分類:

>>> adaboost.adaClassify([[5, 5],[0,0]],classifierArr)
[[ 0.69314718]
             .
             .
[-2.56198199]]
matrix([[ 1.],
        [-1.]])  
  

這兩個點的分類結果也會隨著迭代的進行而越來越強。在下一節中,我們會將該分類器應用到一個規模更大、難度也更大的真實數據集中。