iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
AI/ ML & Data

Let's Go To The AI Party!系列 第 25

Day24-自適應增強

  • 分享至 

  • xImage
  •  

自適應增強(Adaptive Boosting)

又稱 AdaBoost,是一種機器學習演算法,由 約阿夫·弗羅因德(Yoav Freund羅伯特·沙皮爾(Robert Schapire) 1990 年代提出。也是一種迭代演算法,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率

基本原理

針對同一個訓練集不同的弱分類器,然後把这些弱分類器集合起来,構成一个強分類器。在自適應增強中,每一個弱分類器都是使用隨機抽取的訓練資料和隨機選擇的變數來訓練的。最終預測結果是通過對所有弱分類器的預測結果進行加權投票來獲得的

演算法

  • 初始化:通常將所有弱分類器權重都初始化為 1/N,其中 N 是訓練資料的數量
  • 訓練弱分類器:在第 t 輪中,使用隨機抽取的訓練資料和隨機選擇的變數來訓練一個弱分類器
  • 計算弱分類器的錯誤率:計算弱分類器在訓練資料上的錯誤率
  • 更新弱分類器的權重:根據弱分類器錯誤率來更新權重。通常錯誤率越高的弱分類器,權重就越低
  • 預測:使用所有弱分類器的預測結果和權重來預測新資料的類別

優點與缺點

  • 準確性高:可以比單個弱分類器更準確地預測結果。這是因為自適應增強能夠減少過擬合的風險
  • 魯棒性強:對訓練資料的噪聲和異常值不敏感
  • 易於實現:自適應增強的演算法相對簡單,易於實現
  • 計算量大:自適應增強需要訓練多個弱分類器,因此計算量較大
  • 容易受到噪聲的影響:自適應增強對訓練資料的噪聲敏感

自適應增強應用

  • 分類:使用自適應增強來分類客戶的信用風險或垃圾郵件
  • 迴歸:使用自適應增強來預測房價或股票價格
  • 異常檢測:識使用自適應增強來檢測信用卡欺詐或工業設備中的故障

自適應增強工具

許多流行的機器學習庫都提供自適應增強實現,例如:scikit-learnR軟體中的AdaBoost套件XGBoost 等等

自適應增強原理圖

https://ithelp.ithome.com.tw/upload/images/20240819/201632578ioLthN6AH.png

該圖表顯示自適應增強的訓練過程。首先,從訓練資料中隨機抽取一個子集。然後,使用該子集訓練一個弱分類器。對所有決策樹重複此過程。最後,通過對所有決策樹的預測結果進行投票來獲得最終的預測結果

AdaBoost 決策邊界示意圖

https://ithelp.ithome.com.tw/upload/images/20240819/20163257qjUYpjueW8.png
圖片來源:(https://www.researchgate.net/figure/Decision-boundaries-of-AdaBoost-and-the-two-variants-of-the-proposed-AdaCC-on-the-same_fig1_365013684)

每個弱分類器都產生一個決策邊界,AdaBoost 將這些決策邊界進行加權組合,最終形成一個更複雜、更準確的決策邊界

AdaBoost工作流程

https://ithelp.ithome.com.tw/upload/images/20240819/20163257VX3bsSzp5X.png
圖片來源:(https://www.researchgate.net/figure/Process-of-Adaboost-Algorithm_fig2_356819075)

https://ithelp.ithome.com.tw/upload/images/20240819/20163257CXg5kRJno3.png
圖片來源:(https://www.researchgate.net/figure/Adaboost-RF-algorithm-flowchart_fig1_333499498)

初始化

每個訓練樣本賦予相同的權重

https://ithelp.ithome.com.tw/upload/images/20240819/20163257HxkHFgiyql.png
圖片來源:(https://stats.stackexchange.com/questions/473241/weights-in-adaboost)

訓練弱分類器

根據當前的樣本權重訓練一個弱分類器

https://ithelp.ithome.com.tw/upload/images/20240819/20163257qBYM5xQlBE.png
圖片來源:(https://stackoverflow.com/questions/18054125/how-to-use-weight-when-training-a-weak-learner-for-adaboost)

計算錯誤率

計算弱分類器的錯誤率

更新樣本權重

增加被誤分類樣本的權重,減少被正確分類樣本的權重

https://ithelp.ithome.com.tw/upload/images/20240819/20163257z1TCJNd6DM.png
圖片來源:(https://datascience.stackexchange.com/questions/46624/updating-weights-in-adaboost)

計算弱分類器權重

根據錯誤率計算弱分類器的權重

https://ithelp.ithome.com.tw/upload/images/20240819/20163257kw8IeTUYxY.png
圖片來源:(https://towardsdatascience.com/adaboost-for-dummies-breaking-down-the-math-and-its-equations-into-simple-terms-87f439757dcf)

組合弱分類器

將所有弱分類器按照其權重進行加權組合,得到最終的強分類器

重複步驟2-6

直到達到預定的迭代次數或滿足其他停止條件

https://ithelp.ithome.com.tw/upload/images/20240819/20163257fJCO84I27j.png
圖片來源:(https://www.researchgate.net/figure/A-schematic-of-the-AdaBoost-process-Blue-triangles-and-orange-squares-represent_fig1_351719735)

自適應增強公式

預測結果

y = sign(sum(w_i * y_i))

y 最終預測結果
w_i 第 i 個弱分類器權重
y_i 第 i 個弱分類器預測結果

弱分類器權重

w_t+1 = w_t * alpha * exp(-e_t)

w_t 第 t 輪弱分類器權重
w_t+1 第 t+1 輪弱分類器權重
e_t 第 t 輪的弱分類器的錯誤率
alpha 學習率

初始化樣本權重

D_1(i) = 1/N, i = 1, 2, ..., N

N是訓練樣本的數量

https://ithelp.ithome.com.tw/upload/images/20240819/20163257YlrnJI4ihS.png

訓練弱分類器

在第 t 輪,訓練一個弱分類器 h_t,在加權訓練集上的錯誤率最小

e_t = Σ_i D_t(i)I(h_t(x_i) ≠ y_i)

I(·) 是指示函數,當括號內的條件成立時為 1,否則為 0

計算弱分類器權重

α_t = 0.5 * ln((1 - e_t) / e_t)

樣本權重更新

w_{t+1,i} = w_{t,i} * exp(-α_t * y_i * h_t(x_i)) / Z_t

w_{t,i} 第 t 輪中第 i 個樣本的權重
α_t 第 t 個弱分類器的權重
y_i 第 i 個樣本的真實標籤
h_t(x_i) 第 t 個弱分類器對第 i 個樣本的預測
Z_t 歸一化因子,確保所有樣本權重之和為 1

最終分類器

H(x) = sign(Σ_t α_t h_t(x))
https://ithelp.ithome.com.tw/upload/images/20240819/20163257Tz7mQrkm2v.png
圖片來源:(https://towardsdatascience.com/understanding-adaboost-for-decision-tree-ff8f07d2851)

自適應增強程式碼(Python-Scikit-learn)

from sklearn.ensemble import AdaBoostClassifier

# 訓練資料
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 1, -1, -1, 1]

# 初始化 AdaBoost 分類器
clf = AdaBoostClassifier(n_estimators=100)

# 訓練模型
clf.fit(X, y)

# 預測新資料
new_X = [[11, 12]]
predicted_y = clf.predict(new_X)

print(predicted_y)

程式碼中,首先創建一個訓練資料集和一個標記集。然後初始化一個 AdaBoost 分類器並訓練模型。最後,使用模型預測新資料的類別

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import    
load_iris
from sklearn.model_selection import train_test_spli   
t

# 載入鳶尾花資料集
iris = load_iris()
X = iris.data
y = iris.target

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_st   
ate=0)

# 創建 AdaBoost 分類器
clf = AdaBoostClassifier(n_estimators=100, base_estimator=DecisionTreeClassifier(max_depth=1))

# 訓練模型
clf.fit(X_train, y_train)

# 評估模型
accuracy = clf.score(X_test, y_test)
print("Accuracy:", accuracy)

程式碼說明

  • n_estimators:弱分類器的數量
  • base_estimator:基礎分類器,這裡使用決策樹
  • max_depth:決策樹的最大深度
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import    
make_classification

# 生成樣本數據
X, y = make_classification(n_samples=1000, n_features=20, random_state=0)

# 創建 AdaBoost 分類器,基分類器為決策樹
clf = AdaBoostClassifier(n_estimators=100, base_estimator=DecisionTreeClassifier(depth=1), learning_rate=1)

# 訓練模型
clf.fit(X, y)

# 預測
y_pred = clf.predict(X)

結論

AdaBoost 作為一種經典的集成學習演算法,在機器學習領域有著廣泛的應用。它通過將多個弱分類器組合成一個強分類器,有效提高了模型的預測性能。然而,在實際應用中,需要根據具體的任務和數據特點,選擇合適的基分類器和調整相關參數,才能取得最佳的實驗效果


上一篇
Day23-支持向量機
下一篇
Day25-GBDT
系列文
Let's Go To The AI Party!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言