AdaBoost
AdaBoost(Adaptive Boosting的簡稱)是一種集成學習方法,它的核心思想在于將多個弱學習器組合起來,形成一個強學習器。通過這種方式,AdaBoost能夠顯著提高分類性能。下面詳細介紹AdaBoost的主要概念和工作原理:
1. 弱學習器(Weak Learner)
- 弱學習器指的是那些僅比隨機猜測略好的模型,例如決策樹、小神經網絡等。在AdaBoost中,通常使用深度非常淺的決策樹(如單層決策樹,也稱為決策樹樁)作為弱學習器。
2. 自適應(Adaptive)
- AdaBoost之所以稱為自適應增強,是因為它能夠根據前一個學習器的表現調整數據的權重分布,使得之前被錯誤分類的數據在后續的學習器中獲得更多的關注。這種自適應的過程使得模型能夠專注于那些難以正確分類的樣本。
3. 工作原理
- 初始化權重:開始時,每個訓練樣本被賦予相同的權重。
- 循環訓練弱學習器:AdaBoost算法會進行多輪迭代,每一輪都會訓練一個新的弱學習器。在每一輪中:
- 基于當前的權重分布,從訓練集中訓練出一個弱學習器。
- 計算該弱學習器的錯誤率。
- 根據錯誤率計算該弱學習器的權重(即該學習器對最終結果的貢獻)。錯誤率越低的學習器權重越大。
- 更新訓練樣本的權重,增加被當前學習器錯誤分類樣本的權重,減少正確分類樣本的權重。
- 進入下一輪迭代。
- 組合弱學習器:所有的弱學習器根據各自的權重組合成最終的模型。分類決策通常是通過對所有學習器的加權投票來實現的。
4. 特點和優勢
- 準確率高:通過組合多個弱學習器,AdaBoost能夠達到很高的準確率。
- 易于編碼:AdaBoost算法相對簡單,易于實現。
- 自動處理特征選擇:AdaBoost在訓練過程中會自動選擇有用的特征,從而簡化了模型的復雜度和提高了模型的泛化能力。
- 不太容易過擬合:在弱學習器的選擇和數量控制得當的情況下,AdaBoost不太容易過擬合。
5. 應用
AdaBoost被廣泛應用于各種分類問題,包括二分類和多分類問題,如人臉識別、客戶流失預測、文本分類等領域。
#coding=utf-8
#AdaBoostClassifier.py
import pandas as pd
from sklearn.model_selection import train_test_split
#from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier# 加載數據
filename="./glass.data"
glass_data = pd.read_csv(filename,index_col=0,header=None)
# 先從DataFrame中取出數組值(.value)
X,y = glass_data.iloc[:,:-1].values, glass_data.iloc[:,-1].values
#X,y = glass_data.iloc[:,:-1], glass_data.iloc[:,-1]
# 劃分訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=True, stratify=y, random_state=1)# 創建基本分類器對象
#base_clf = GaussianNB()
base_clf = DecisionTreeClassifier(max_depth=2,random_state=0)
# 創建AdaBoostingClassifier對象
ada_clf = AdaBoostClassifier(base_estimator=base_clf,random_state=0,n_estimators=1000)for clf in (base_clf, ada_clf):clf.fit(X_train, y_train)print(clf.__class__.__name__,"訓練集準確率:",clf.score(X_train, y_train), sep="")print(clf.__class__.__name__,"測試集準確率:",clf.score(X_test, y_test), sep="") print(clf.__class__.__name__,"對測試集前2個樣本預測的分類標簽:\n",clf.predict(X_test[:2]), sep="")print(clf.__class__.__name__,"對測試集前2個樣本預測的分類概率:\n",clf.predict_proba(X_test[:2]), sep="") print("分類器中的標簽排列:",clf.classes_)# 概率預測轉化為標簽預測print("根據預測概率推算預測標簽:",end="")for i in clf.predict_proba(X_test[:2]).argmax(axis=1):print(clf.classes_[i], end=" ")print()print("測試集前2個樣本的真實標簽:",y_test[:2],sep="")