Adaboost入門

  久聞各種boosting算法模型(Adaboost、Xgboost、Lightgbm、Catboost)的大名,卻從來沒有深入研究過。爲了能夠對後面三種模型有更加深入的理解,所以先從Adaboost開始入手。

0. 代碼實戰

0.1 導包

from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics

0.2 導入數據並進行劃分

iris = datasets.load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test

0.3 使用Adaboost模型進行分類

# Create adaboost classifer object
ababoost_clf = AdaBoostClassifier(n_estimators=50)
# Train Adaboost Classifer
ababoost_model = ababoost_clf.fit(X_train, y_train)
# Get Adaboost Accuracy
print("Adaboost Accuracy:",metrics.accuracy_score(y_test, ababoost_model.predict(X_test)))

在這裏插入圖片描述

0.4 和隨機森林進行對比

random_forest_clf = RandomForestClassifier(n_estimators=50)
random_forest_model = random_forest_clf.fit(X_train, y_train)
print("Random Forest Accuracy:", metrics.accuracy_score(y_test, random_forest_model.predict(X_test)))

在這裏插入圖片描述
  通過簡單的demo來看,基於Adaboost模型(基本分類器爲決策樹)的效果比隨機森林更好。從實驗上簡單證實了Adaboost的有效性,接下來我們來研究一下Adaboost的原理。

1. 原理學習

  Adaboost是基於boosting一種自適應的迭代式算法。Boosting算法的核心思想是把若干個弱分類器組合成一個強分類器。其中弱分類器的效果只要比瞎猜的效果好就可以。最簡單的例子就是通過身高判斷人的性別。如高於175cm就判斷成男性,低於175cm就判斷爲女性。這樣會導致很多的數據錯誤分類,但準確率會比50%更高。

  Adaboost可以用來解決分類(迴歸)問題。但它是建立在若干個簡單分類器之上的,其本身並不是一個分類器。它的主要邏輯是兩點:

  1. 根據樣本的預測結果對不同樣本賦予了不同的權重。
  2. 根據分類器的預測結果對不同分類器賦予了不同的權重。

1.1 訓練集的選擇

  每個弱分類器是對訓練集總體的隨機子集進行訓練的。每個子集之間可能會有交集,例如對訓練集進行10次隨機採樣。Adaboost會對每個訓練樣本賦予不同的權重,其中權重比較大的樣本更可能會被採樣到。在訓練之後,Adaboost會調整樣本的權重,具體來說是對錯分樣本賦予更大的權重,使得訓練集中錯分樣本所佔的比例增大,從而使得下一次訓練對錯分樣本取得更好的效果。調整權重的公式會在下文中具體闡述。

1.2 分類器的權重

  根據每個分類器的效果設置不同分類器的權重。越準確的分類器的權重就會越大。對於二分類問題而言, 分類效果接近50%的權重設置爲0,分類效果低於50%的權重設置爲負數。

1.3 正式定義

  本部分主要是對公式提供符合直覺的解釋,詳細推導可參考http://rob.schapire.net/papers/explaining-adaboost.pdf。
H(x)=sign(t=1Tαtht(x))H(x)=sign(\sum \limits ^T_{t=1} \alpha_t h_t(x)) \quad \quad公式一

  最終的分類器是由T個弱分類器組成的,每個弱分類器的輸出表示爲ht(x)h_t(x),由於是二分類問題,則結果爲1,1{-1,1}αt\alpha_t是每個分類器的權重。最終的分類結果是先由所有弱分類器得到線性組合的和(再加上sign函數)。其中分類器每次只訓練一次,在分類器訓練好之後,會對訓練樣本的權重進行多次的更新。

  我們先以第一個分類器(t=1)爲例,在初始狀態下所有訓練樣本的權重都是相同的。當分類器訓練之後,通過對錯誤率ϵt\epsilon_t計算就可以得到分類器的權重,其中錯誤率ϵt\epsilon_t是錯分樣本的個數除以訓練樣本總數(如果樣本有權重就乘以權重)。
αt=12ln(1ϵtϵt)\alpha_t=\frac{1}{2}ln(\frac{1-\epsilon_t}{\epsilon_t})
在這裏插入圖片描述
分析上圖可得到三點信息:

  1. 隨着錯誤率的減少到0附近,分類器的權重指數性增加。效果更好的分類器的權重越大。
  2. 如果分類器的錯誤率爲0.5,則權重設置爲0。
  3. 如果分類器的錯誤率接近100%,則取的是負權重,並且隨着錯誤率的提升權重也是指數增加。.

  得到α\alpha後,我們需要對訓練樣本的權重進行更新:
Dt+1(i)=Dt(i)exp(αtyiht(xi))ZtD_{t+1}(i)=\frac{D_t{(i)exp(-\alpha_t y_i h_t(x_i))}}{Z_t}
  其中ii指的是第ii個訓練樣本,Dt(i)D_t(i)指的是訓練樣本權重的向量表示。爲了保證滿足概率分佈,所有樣本取到的權重之和爲1。所以通過ZtZ_t進行歸一化處理。
在這裏插入圖片描述
Dt+1(i)=Dt(i)exp(αtyiht(xi))ZtD_{t+1}(i)=\frac{D_t{(i)exp(-\alpha_t y_i h_t(x_i))}}{Z_t}
  如果y和h相同(這兩者隻影響符號,不影響數值大小),表示的是預測正確,則yiht(xi)y_ih_t(x_i)爲正。假設αt\alpha_{t}爲正無窮(分類器錯誤率很低),則exp係數就爲負無窮,exp結果就爲很小,此時該樣本的權重就會變得非常小。假設αt\alpha_t爲0,權重不變。假設αt\alpha_t爲負無窮(分類器錯誤率非常高),則exp結果非常大,權重就會變得非常大。如果y和h相反,結果類似,就不具體討論了。
在這裏插入圖片描述
參考鏈接
https://www.cnblogs.com/ScorpioLu/p/8295990.html
https://blog.csdn.net/liulina603/article/details/78742614

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章