久聞各種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.1 訓練集的選擇
每個弱分類器是對訓練集總體的隨機子集進行訓練的。每個子集之間可能會有交集,例如對訓練集進行10次隨機採樣。Adaboost會對每個訓練樣本賦予不同的權重,其中權重比較大的樣本更可能會被採樣到。在訓練之後,Adaboost會調整樣本的權重,具體來說是對錯分樣本賦予更大的權重,使得訓練集中錯分樣本所佔的比例增大,從而使得下一次訓練對錯分樣本取得更好的效果。調整權重的公式會在下文中具體闡述。
1.2 分類器的權重
根據每個分類器的效果設置不同分類器的權重。越準確的分類器的權重就會越大。對於二分類問題而言, 分類效果接近50%的權重設置爲0,分類效果低於50%的權重設置爲負數。
1.3 正式定義
本部分主要是對公式提供符合直覺的解釋,詳細推導可參考http://rob.schapire.net/papers/explaining-adaboost.pdf。
最終的分類器是由T個弱分類器組成的,每個弱分類器的輸出表示爲,由於是二分類問題,則結果爲。是每個分類器的權重。最終的分類結果是先由所有弱分類器得到線性組合的和(再加上sign函數)。其中分類器每次只訓練一次,在分類器訓練好之後,會對訓練樣本的權重進行多次的更新。
我們先以第一個分類器(t=1)爲例,在初始狀態下所有訓練樣本的權重都是相同的。當分類器訓練之後,通過對錯誤率計算就可以得到分類器的權重,其中錯誤率是錯分樣本的個數除以訓練樣本總數(如果樣本有權重就乘以權重)。
分析上圖可得到三點信息:
- 隨着錯誤率的減少到0附近,分類器的權重指數性增加。效果更好的分類器的權重越大。
- 如果分類器的錯誤率爲0.5,則權重設置爲0。
- 如果分類器的錯誤率接近100%,則取的是負權重,並且隨着錯誤率的提升權重也是指數增加。.
得到後,我們需要對訓練樣本的權重進行更新:
其中指的是第個訓練樣本,指的是訓練樣本權重的向量表示。爲了保證滿足概率分佈,所有樣本取到的權重之和爲1。所以通過進行歸一化處理。
如果y和h相同(這兩者隻影響符號,不影響數值大小),表示的是預測正確,則爲正。假設爲正無窮(分類器錯誤率很低),則exp係數就爲負無窮,exp結果就爲很小,此時該樣本的權重就會變得非常小。假設爲0,權重不變。假設爲負無窮(分類器錯誤率非常高),則exp結果非常大,權重就會變得非常大。如果y和h相反,結果類似,就不具體討論了。
參考鏈接
https://www.cnblogs.com/ScorpioLu/p/8295990.html
https://blog.csdn.net/liulina603/article/details/78742614