集成學習Boosting
集成學習大致可分為兩大類:
Bagging
和
Boosting
。Bagging一般使用強學習器,其個體學習器之間不存在強依賴關係,容易並行。Boosting則使用弱分類器,其個體學習器之間存在強依賴關係,是一種序列化方法。Bagging主要關注降低方差,而Boosting主要關注降低偏差。Boosting是一族算法,其主要目標為將弱學習器「提升」為強學習器,大部分Boosting算法都是根據前一個學習器的訓練效果對樣本分布進行調整,再根據新的樣本分布訓練下一個學習器,如此迭代M次,最後將一系列弱學習器組合成一個強學習器。而這些Boosting算法的不同點則主要體現在每輪樣本分布的調整方式上。
AdaBoost原理簡介
AdaBoost算法是
Adaptive Boost
的簡稱,Boosting通過將一系列弱學習器組合起來,通過集成這些弱學習器的學習能力,得到一個強學習器。具體到AdaBoost算法,AdaBoost在之前學習器的基礎上改變樣本的權重,增加那些之前被分類錯誤的樣本的比重,降低分類正確樣本的比重,這樣之後的學習器將重點關注那些被分類錯誤的樣本。最後通過將這些學習器通過加權組合成一個強學習器,具體的,分類正確率高的學習器權重較高,分類正確率低的學習器權重較低。
AdaBoost 算法流程
輸入:訓練集 ,訓練輪數T,和一個基學習算法L。首先,讓所有數據的權重都為 ;然後,對於每一輪的train過程,得到一個基學習器 ;計算這個基學習器 在訓練數據集D上的誤差 ;如果這個誤差大於0.5,那麼直接停止本輪的train,進行下一輪;計算此輪基學習器在最終的模型中所佔的權重 ;對於在這一輪基學習器中做錯的樣本和做對的樣本進行調整: ;上述中的 是一個規範化因子;一般,以確保所有的構成一個分布;最終,得到ensemble後的model為 ;
動手實踐
在 Python 環境下使用 Adaboost 進行手寫數字識別。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import train_test_split
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
首先,載入數據
dataset = load_digits()
X = dataset['data']
y = dataset['target']
X 包含長度為 64 的數組,它們代表了簡單的 8x8 的平面圖像。使用該數據集的目的是為了完成手寫數字識別任務。下圖為一個給定的手寫數字的示例:
如果我們堅持使用深度為 1 的決策樹分類器(決策樹樁),以下是如何在這種情況下實現 AdaBoost 分類器:
reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1))
scores_ada = cross_val_score(reg_ada, X, y, cv=6)
scores_ada.mean()
這樣得到的分類準確率的結果應該約為 26%,還具有很大的提升空間。其中一個關鍵的參數是序列決策樹分類器的深度。那麼,決策樹的深度如何變化才能提高分類準確率呢?
core = []
for depth in [1,2,10] :
reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=depth))
scores_ada = cross_val_score(reg_ada, X, y, cv=6)
score.append(scores_ada.mean())
在這個簡單的例子中,當決策樹的深度為 10 時,分類器得到了最高的分類準確率 95.8%。