由於較多公式,所以我將部分內容轉為圖片進行上傳,請見諒。清晰版請訪問weizhixiaoyi.com查看,你也可以關注我公眾號謂之小一,後臺直接向我要pdf版本,如有相關問題可公眾號後臺詢問,隨時回答。

1.Adaboost簡介

Adaptive boosting(自適應增強)是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的弱分類器,然後把這些弱分類器集合起來,構成一個強分類器,Adaboost可處理分類和回歸問題。瞭解Adaboost演算法之前,我們先學習下Boost(增強)Adaptive(自適應)的概念。

1.1集成學習之Boosting

集成學習不是單獨的機器學習方法,而是通過構建並結合多個機器學習器來完成任務,集成學習可以用於分類問題集成、回歸問題集成、特徵選取集成、異常點檢測集成等方面。其思想是對於訓練數據集,我們通過訓練若干個個體學習器,通過一定的結合策略形成一個強學習器,以達到博採眾長的目的。在機器學習之隨機森林中我們已經用到集成學習中的bagging方法,此處我們詳細介紹集成學習中的Boosting方法。

從上圖可以看出,Boosting演算法的工作機制是從訓練集用初始權重訓練出一個弱學習器1,根據弱學習器的學習誤差率來更新訓練樣本的權重,使得之前弱學習器1中學習誤差率高的訓練樣本點權重變高。然後這些誤差率高的點在弱學習器2中得到更高的重視,利用調整權重後的訓練集來訓練弱學習器2。如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。

1.2Adaptive自適應

Adaptive(自適應)體現在前一個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時在每一輪中加入一個新的弱分類器,直到得到某個預定的足夠小的錯誤率或達到預定的最大迭代次數。

1.3Adaboost流程

結合Adaptive(自適應)Boost(增強)概念,我們來具體介紹下Adaboost迭代演算法流程。

  • 初始化訓練數據的權值分佈。如果有N個樣本,則每一個訓練樣本最開始都被賦予相同的權值1/N。
  • 訓練弱分類器。訓練過程中,如果某個樣本點已經被準確的分類,那麼在構造下一個訓練集中,他的權值會被降低。相反,如果某個樣本點沒有被準確分類,那麼它的權值就會得到提高。權值更新過的樣本集會被用於訓練下一個分類器,整個訓練過程如此迭代的進行下去。
  • 多個弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,增加分類誤差率小的弱分類器的權重,使其在最終的分類函數中起著較大的決定作用;而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起著較小的決定作用。

那麼我們便要思考,如何計算學習誤差率e?,如何得到弱學習器權重係數α? ,如何更新樣本權重D?,使用哪種結合策略?我們將在Adaboost分類和回歸演算法中給出詳細解答。

2.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),則下式和上述二元分類演算法中的弱分類器的係數一致。

3.Adaboost回歸演算法

假設我們的訓練樣本為

訓練集在第k個弱學習器的輸出權重為

我們先看回歸問題中的誤差率。對於第k個弱學習器,計算他在訓練集上的最大誤差

然後計算每個樣本的相對誤差

上述公式是損失為線性的情況,如果我們採用平方誤差或指數誤差,則相對誤差如下所示。

最終得到第k個弱學習器的學習誤差率

那麼弱學習器的權重係數

然後更新樣本權重D,第k+1個弱分類器的樣本集權重係數如下所示,其中Zk為規範化因子。

最後Adaboost回歸問題採用加權平均法結合策略,最終的強回歸器為

4.Adaboost損失函數

上述我們介紹了Adaboost分類的弱學習器權重係數公式和樣本權重更新公式,但並沒具體解釋公式來源,此處我們通過Adaboost損失函數來進行推導。Adaboost模型是加法模型,學習演算法為前向分佈學習演算法,損失函數為指數函數。

  • 加法模型:最終強分類器是若干個弱分類器加權平均得到。
  • 前向分佈演算法:演算法是通過一輪輪弱學習器得到,利用前一輪弱學習器的結果來更新後一個弱學習器的訓練權重。

假設第k-1輪和第k輪強學習器為

因此我們可以得到

可見強學習器是通過前向分佈演算法一步步得到。Adaboost損失函數為指數函數,即定義損失函數為

利用前向分佈學習演算法的關係可以得到損失函數為

首先我們求Gk(x)可以得到

將Gk(x)代入損失函數,並對α進行求導,使其等於0,於是我們得到

其中ek為我們前面介紹的分類誤差率

5.Adaboost演算法正則化

為了防止Adaboost過擬合,通常也會加入正則化項,這個正則化項通常稱為步長(learning rate)。定義為ν,對於前面的弱學習器的迭代

如果我們加上正則化項,則有

v的取值為(0,1]。對於同樣的訓練集,較小的ν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定演算法的擬合效果。

6.Sklearn實現Adaboost演算法

我們經常需要通過改變參數來讓模型達到更好的分類或回歸結果,具體參數設置可參考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

7.Adaboost演算法優缺點

7.1Adaboost優點

  • 不容易發生過擬合。
  • Adaboost是一種有很高精度的分類器。
  • 當使用簡單分類器時,計算出的結果是可理解的。
  • 可以使用各種方法構建子分類器,Adaboost演算法提供的是框架。

7.2Adaboost缺點

  • 訓練時間過長。
  • 執行效果依賴於弱分類器的選擇。
  • 對樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終的強學習器的預測準確性。

8.推廣

更多內容請關注公眾號謂之小一,若有疑問可在公眾號後臺提問,隨時回答,歡迎關注,內容轉載請註明出處。

weixin.qq.com/r/Ty_4oDP (二維碼自動識別)

文章參考

  • 集成學習之Adaboost演算法原理小結

推薦閱讀:

相關文章