1. 程式人生 > >【機器學習入門二】整合學習及AdaBoost演算法的python實現

【機器學習入門二】整合學習及AdaBoost演算法的python實現

本文主要基於周志華老師的《機器學習》第八章內容

個體與整合

整合學習通過構建並結合多個學習器來完成學習任務。整合學習的一般結構如圖所示:
這裡寫圖片描述
先產生一組個體學習器,在用某種策略把它們結合在一起。個體學習器通常有一個現有的學習演算法從訓練資料產生,如決策樹樁和BP神經網路。個體學習器可以使相同型別的也可以是不同型別的,比如全是神經網路或者同事含有神經網路和決策樹樁。
整合學習通過將多個學習器進行結合,通常可以獲得比單一學習器顯著優越的泛化效能,尤其是弱學習器(即泛化效能略優於隨機猜測的學習器,比如在二分類問題上精度略高於50%的分類器)。從理論上來說,使用弱學習器整合就足以獲得好的效能。
如何提高整合學習的效能?這要求個體學習器應該“好而不同”。書上的例子很好且簡單易懂,這裡直接拿來。
在二分類任務中,假定三個分類器在三個測試樣本上的表現分別如下面的三個表所示,
其中對號表示分類正確,叉號表示分類錯誤,整合策略選擇投票法。在(a)中,每個分類器都只有66.6%的精度,但是整合學習後達到了100%,(b)中,三個分類器完全一樣,整合後沒有區別,(c)中,每個分類器的精度都只有33.3%,整合後結果更差。這個例子直觀的解釋了為什麼應該好而不同,即個體學習器要比較準確,並且各個個體學習器之間還要有一定的差異性。
這裡寫圖片描述


整合學習根據個體學習器的生成方式可以分為2大類,如果個體學習器存在強依賴關係、必須序列生成的序列化方法,典型代表是Boosting。第二種是個體學習器之間不存在強依賴關係,可以同時生成的並行化方法,如Bagging和隨機森林(Random Forest)。

Boosting

Boosting是一族可將弱學習器提升為強學習器的演算法。演算法的流程為:先從初始訓練集訓練出一個個體學習器,再根據該學習器的表現對訓練樣本的分佈進行調整,使得先前學習器做錯的訓練樣本在後續受到更多關注,然後基於調整後的樣本分佈來訓練下一個個體學習器,如此反覆進行,直到個體學習器的數量達到事先指定的值T或者整合的誤差已經小於閾值,最終將這些個體學習器進行加權結合。

演算法流程

Boosting演算法族中最著名的是AdaBoost演算法。下面是演算法的過程:

輸入:訓練集D={(x1,y1),.....,(xm,ym)},基學習演算法ξ,訓練次數T
過程:
1. D1(x)=1/m.(表示第一輪時每個樣本的權重是相等的)
2. fort=1,2,3,...,Tdo:
3. ht=ξ(D,Dt);
4. εt=PxDt(ht(x)f(x));(

f(x))
5. ifεt>0.5thenbreak
6. αt=12ln(1εtεt);
7.

Dt+1(x)=Dt(x)Zt×{exp(αt),ifht(x)=f(x)exp(αt),ifht(x)f(x)
=Dt(x)exp(αtf(x)ht(x))Zt Zt是規範化因子,確保Dt+1是一個分佈