資料探勘之AdaBoost裝袋提升演算法
python3程式碼實現在https://github.com/yantijin/Lean_DataMining上,時間匆忙,敬請之處錯誤之處,謝謝!
以下內容轉自:https://blog.csdn.net/androidlushangderen/article/details/43635115,原文中有JAVA實現,可以參考
介紹
在介紹AdaBoost演算法之前,需要了解一個類似的演算法,裝袋演算法(bagging),bagging是一種提高分類準確率的演算法,通過給定組合投票的方式,獲得最優解。比如你生病了,去n個醫院看了n個醫生,每個醫生給你開了藥方,最後的結果中,哪個藥方的出現的次數多,那就說明這個藥方就越有可能性是最由解,這個很好理解。而bagging演算法就是這個思想。
演算法原理
而AdaBoost演算法的核心思想還是基於bagging演算法,但是他又一點點的改進,上面的每個醫生的投票結果都是一樣的,說明地位平等,如果在這裡加上一個權重,大城市的醫生權重高點,小縣城的醫生權重低,這樣通過最終計算權重和的方式,會更加的合理,這就是AdaBoost演算法。AdaBoost演算法是一種迭代演算法,只有最終分類誤差率小於閾值演算法才能停止,針對同一訓練集資料訓練不同的分類器,我們稱弱分類器,最後按照權重和的形式組合起來,構成一個組合分類器,就是一個強分類器了。演算法的主要過程:
1、對D訓練集資料訓練處一個分類器Ci
2、通過分類器Ci對資料進行分類,計算此時誤差率
3、把上步驟中的分錯的資料的權重提高,分對的權重降低,以此凸顯了分錯的資料。為什麼這麼做呢,後面會做出解釋。
完整的adaboost演算法如下
最後的sign函式是符號函式,如果最後的值為正,則分為+1類,否則即使-1類。
我們舉個例子代入上面的過程,這樣能夠更好的理解。
adaboost的實現過程:
圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。
第一步:
根據分類的正確率,得到一個新的樣本分佈D2,一個子分類器h1
其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。
演算法最開始給了一個均勻分佈 D 。所以h1 裡的每個點的值是0.1。ok,當劃分後,有三個點劃分錯了,根據演算法誤差表示式得到 誤差為分錯了的三個點的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根據表示式 的可以算出來為0.42. 然後就根據演算法 把分錯的點權值變大。如此迭代,最終完成adaboost演算法。
第二步:
根據分類的正確率,得到一個新的樣本分佈D3,一個子分類器h2
第三步:
得到一個子分類器h3
整合所有子分類器:
因此可以得到整合的結果,從結果中看,即使簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。後面的程式碼實現時,舉出的也是這個例子,可以做對比,這裡有一點比較重要,就是點的權重經過大小變化之後,需要進行歸一化,確保總和為1.0,這個容易遺忘。