讀古今文學網 > 機器學習實戰 > 7.6 示例:在一個難數據集上應用AdaBoost >

7.6 示例:在一個難數據集上應用AdaBoost

本節我們將在第4章給出的馬疝病數據集上應用AdaBoost分類器。在第4章,我們曾經利用Logistic回歸來預測患有疝病的馬是否能夠存活。而在本節,我們則想要知道如果利用多個單層決策樹和AdaBoost能不能預測得更準。

示例:在一個難數據集上的AdaBoost應用

  1. 收集數據:提供的文本文件。
  2. 準備數據:確保類別標籤是+1和-1而非1和0。
  3. 分析數據:手工檢查數據。
  4. 訓練算法:在數據上,利用adaBoostTrainDS函數訓練出一系列的分類器。
  5. 測試算法:我們擁有兩個數據集。在不採用隨機抽樣的方法下,我們就會對AdaBoost和Logistic回歸的結果進行完全對等的比較。
  6. 使用算法:觀察該例子上的錯誤率。不過,也可以構建一個Web網站,讓馴馬師輸入馬的症狀然後預測馬是否會死去。

在使用上述程序清單中的代碼之前,必須要有向文件中加載數據的方法。一個常見的loadDataset的程序如下所示。

程序清單7-4 自適應數據加載函數

def loadDataSet(fileName):
    numFeat = len(open(fileName).readline.split(\'t\'))
    dataMat = ; labelMat = 
    fr = open(fileName)
    for line in fr.readlines:
        lineArr =
        curLine = line.strip.split(\'t\')
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat  
  

之前,讀者可能多次見過了上述程序清單中的loadDataSet函數。在這裡,並不必指定每個文件中的特徵數目,所以這裡的函數與前面的稍有不同。該函數能夠自動檢測出特徵的數目。同時,該函數也假定最後一個特徵是類別標籤。

將上述代碼添加到adaboost.py文件中並且將其保存之後,就可以輸入如下命令來使用上述函數:

>>> datArr,labelArr = adaboost.loadDataSet(\'horseColicTraining2.txt\')
>>> classifierArray = adaboost.adaBoostTrainDS(datArr,labelArr,10)
total error: 0.284280936455
total error: 0.284280936455
                    .
                    .
total error: 0.230769230769
>>> testArr,testLabelArr = adaboost.loadDataSet(\'horseColicTest2.txt\')
>>> prediction10 = adaboost.adaClassify(testArr,classifierArray)
To get the number of misclassified examples type in:  
>>> errArr=mat(ones((67,1)))
>>> errArr[prediction10!=mat(testLabelArr).T].sum
16.0
  

要得到錯誤率,只需將上述錯分樣例的個數除以67即可。

將弱分類器的數目設定為1到10 000之間的幾個不同數字,並運行上述過程。這時,得到的結果就會如表7-1所示。在該數據集上得到的錯誤率相當低。如果沒忘的話,在第5章中,我們在同一數據集上採用Logistic回歸得到的平均錯誤率為0.35。而採用AdaBoost,得到的錯誤率就永遠不會那麼高了。從表中可以看出,我們僅僅使用50個弱分類器,就達到了較高的性能。

表7-1 不同弱分類器數目情況下的AdaBoost測試和分類錯誤率。該數據集是個難數據集。通常 情況下,AdaBoost會達到一個穩定的測試錯誤率,而並不會隨分類器數目的增多而提高

分類器數目 訓練錯誤率(%) 測試錯誤率(%) 1 0.28 0.27 10 0.23 0.24 50 0.19 0.21 100 0.19 0.22 500 0.16 0.25 1000 0.14 0.31 10000 0.11 0.33

觀察表7-1中的測試錯誤率一欄,就會發現測試錯誤率在達到了一個最小值之後又開始上升了。這類現象稱之為過擬合(overfitting,也稱過學習)。有文獻聲稱,對於表現好的數據集,AdaBoost的測試錯誤率就會達到一個穩定值,並不會隨著分類器的增多而上升。或許在本例子中的數據集也稱不上「表現好」。該數據集一開始有30%的缺失值,對於Logistic回歸而言,這些缺失值的假設就是有效的,而對於決策樹卻可能並不合適。如果回到數據集,將所有的0值替換成其他值,或者給定類別的平均值,那麼能否得到更好的性能?

很多人都認為,AdaBoost和SVM是監督機器學習中最強大的兩種方法。實際上,這兩者之間擁有不少相似之處。我們可以把弱分類器想像成SVM中的一個核函數,也可以按照最大化某個最小間隔的方式重寫AdaBoost算法。而它們的不同就在於其所定義的間隔計算方式有所不同,因此導致的結果也不同。特別是在高維空間下,這兩者之間的差異就會更加明顯。

在下一節中,我們不再討論AdaBoost,而是轉而關注所有分類器中的一個普遍問題。