由於較多公式,所以我將部分內容轉為圖片進行上傳,請見諒。清晰版請訪問https://weizhixiaoyi.com查看,你也可以關注我公眾號謂之小一,後臺直接向我要pdf版本,如有相關問題可公眾號後臺詢問,隨時回答。
Adaptive boosting(自適應增強)是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的弱分類器,然後把這些弱分類器集合起來,構成一個強分類器,Adaboost可處理分類和回歸問題。瞭解Adaboost演算法之前,我們先學習下Boost(增強)和Adaptive(自適應)的概念。
集成學習不是單獨的機器學習方法,而是通過構建並結合多個機器學習器來完成任務,集成學習可以用於分類問題集成、回歸問題集成、特徵選取集成、異常點檢測集成等方面。其思想是對於訓練數據集,我們通過訓練若干個個體學習器,通過一定的結合策略形成一個強學習器,以達到博採眾長的目的。在機器學習之隨機森林中我們已經用到集成學習中的bagging方法,此處我們詳細介紹集成學習中的Boosting方法。
從上圖可以看出,Boosting演算法的工作機制是從訓練集用初始權重訓練出一個弱學習器1,根據弱學習器的學習誤差率來更新訓練樣本的權重,使得之前弱學習器1中學習誤差率高的訓練樣本點權重變高。然後這些誤差率高的點在弱學習器2中得到更高的重視,利用調整權重後的訓練集來訓練弱學習器2。如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。
Adaptive(自適應)體現在前一個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時在每一輪中加入一個新的弱分類器,直到得到某個預定的足夠小的錯誤率或達到預定的最大迭代次數。
結合Adaptive(自適應)和Boost(增強)概念,我們來具體介紹下Adaboost迭代演算法流程。
那麼我們便要思考,如何計算學習誤差率e?,如何得到弱學習器權重係數α? ,如何更新樣本權重D?,使用哪種結合策略?我們將在Adaboost分類和回歸演算法中給出詳細解答。
假設我們的訓練樣本為
訓練集在第k個弱學習器的輸出權重為
Adaboost分類演算法中包含二元分類和多元分類問題,多元分類問題為二元分類的推廣。為方便推導,此處我們假設是二元分類問題,輸出類別為{-1,1}。那麼第k個弱分類器Gk(x)在訓練集上的學習誤差率為
對於二元分類問題,第k個弱分類器Gk(x)的權重係數為
從上式可以看出,如果分類誤差率ek越大,則對應的弱分類器權重係數αk越小。也就是說,誤差率越大的弱分類器權重係數越小。
假設第k個弱分類器的樣本集權重係數為D(k)=(wk1,wk2,…,wkm),則更新後的第k+1個弱分類器的樣本集權重係數如下所示,此處Zk是規範化因子。
從wk+1,i計算公式可以看出,如果第i個樣本分類錯誤,則yiGk(xi)<0,導致樣本的權重在第k+1個弱分類器中增大。如果分類正確,則權重在第k+1個弱分類器中減少。具體為什麼選擇上述權重係數和樣本權重更新公式,我們在下面講Adaboost損失函數時會詳細介紹。
最後Adaboost分類問題採用加權平均法結合策略,最終的強分類器為
對於Adaboost多元分類演算法,其實原理和二元分類類似,最主要區別在弱分類器的係數上。比如Adaboost SAMME演算法,它的弱分類器的係數如下所示,其中R為類別數。從下式可以看出,如果是二元分類(R=2),則下式和上述二元分類演算法中的弱分類器的係數一致。
我們先看回歸問題中的誤差率。對於第k個弱學習器,計算他在訓練集上的最大誤差
然後計算每個樣本的相對誤差
上述公式是損失為線性的情況,如果我們採用平方誤差或指數誤差,則相對誤差如下所示。
最終得到第k個弱學習器的學習誤差率
那麼弱學習器的權重係數為
然後更新樣本權重D,第k+1個弱分類器的樣本集權重係數如下所示,其中Zk為規範化因子。
最後Adaboost回歸問題採用加權平均法結合策略,最終的強回歸器為
上述我們介紹了Adaboost分類的弱學習器權重係數公式和樣本權重更新公式,但並沒具體解釋公式來源,此處我們通過Adaboost損失函數來進行推導。Adaboost模型是加法模型,學習演算法為前向分佈學習演算法,損失函數為指數函數。
假設第k-1輪和第k輪強學習器為
因此我們可以得到
可見強學習器是通過前向分佈演算法一步步得到。Adaboost損失函數為指數函數,即定義損失函數為
利用前向分佈學習演算法的關係可以得到損失函數為
首先我們求Gk(x)可以得到
將Gk(x)代入損失函數,並對α進行求導,使其等於0,於是我們得到
其中ek為我們前面介紹的分類誤差率
為了防止Adaboost過擬合,通常也會加入正則化項,這個正則化項通常稱為步長(learning rate)。定義為ν,對於前面的弱學習器的迭代
如果我們加上正則化項,則有
v的取值為(0,1]。對於同樣的訓練集,較小的ν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定演算法的擬合效果。
我們經常需要通過改變參數來讓模型達到更好的分類或回歸結果,具體參數設置可參考sklearn官方教程。
import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import make_gaussian_quantiles
#生成二維正態分佈,生成的數據分為兩類,500個樣本,2個樣本特徵,協方差係數為2 X1,y1=make_gaussian_quantiles(cov=2.0,n_samples=500, n_features=2,n_classes=2, random_state=1) #生成二維正態分佈,生成的數據分為兩類,500個樣本,2個樣本特徵,協方差係數為1.5 X2,y2=make_gaussian_quantiles(mean=(3,3),cov=1.5, n_samples=400,n_features=2, n_classes=2,random_state=1) #將兩組數據合為一組 X=np.concatenate((X1,X2)) y=np.concatenate((y1,-y2+1))
#繪畫生成的數據點 plt.figure() plt.scatter(X[:,0],X[:,1],marker=o,c=y) plt.show()
# 訓練數據 clf=AdaBoostClassifier(DecisionTreeClassifier( max_depth=2,min_samples_split=20, min_samples_leaf=5),algorithm="SAMME", n_estimators=200,learning_rate=0.8) clf.fit(X,y)
#將訓練結果繪畫出來 plt.figure() x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired) plt.scatter(X[:, 0], X[:, 1], marker=o, c=y) plt.show()
#訓練模型的得分 print(clf.score(X,y)) #0.913333333333
更多內容請關注公眾號謂之小一,若有疑問可在公眾號後臺提問,隨時回答,歡迎關注,內容轉載請註明出處。
http://weixin.qq.com/r/Ty_4oDPE2W6mrXfD93pd (二維碼自動識別)
文章參考
推薦閱讀: