概述
集成學習(Ensemble learning)就是將多個機器學習模型組合起來,共同工作以達到優化算法的目的。具體來講,集成學習可以通過多個學習器相結合,來獲得比單一學習器更優越的泛化性能。集成學習的一般步驟為:1.生產一組“個體學習器(individual learner)”;2.用某種策略將他們結合起來。
個體學習器通常由一個現有的學習算法從訓練數據產生。在同質集成(系統中個體學習器的類型相同)中,個體學習器又被稱為“基學習器”,而在異質集成(系統中個體學習器的類型不同)中,個體學習器又被稱為“組建學習(component learner)”。
集成學習的集成框架主要有:Bagging,Boosting和Stacking,其中Bagging和Boosting為同質集成,而Stacking為異質集成。
Bagging可以減少弱分類器的方差,而Boosting 可以減少弱分類器的偏差;
Bagging就是再取樣 (Bootstrap) 然后在每個樣本上訓練出來的模型取平均,所以是降低模型的variance. Bagging 比如Random Forest 這種先天并行的算法都有這個效果。
Boosting 則是迭代算法,每一次迭代都根據上一次迭代的預測結果對樣本進行加權,所以隨著迭代不斷進行,誤差會越來越小,所以模型的 bias 會不斷降低。這種算法無法并行,如Adaptive Boosting.
多樣性增強的幾種方法
一般的做法主要是對數據樣本,輸入屬性,輸出表示,算法參數進行擾動。
- (1)數據樣本擾動
這個其實主要就是采樣,比如在bagging中的自助采樣法,數據樣本擾動對決策樹,神經網絡這樣對數據樣本變化非常敏感的學習算法非常有效,但是對支持向量機,樸素貝葉斯,k近鄰這些對樣本擾動不敏感的算法沒用。對此類算法作為基學習器進行集成時往往需要使用輸入屬性擾動等機制。 - (2)輸入屬性擾動
這個就是從樣本的特征空間中產生不同的特征子集。這樣訓練出來的基學習器必然是不同的。在包含大量冗余屬性的數據,在特征子集中訓練基學習器不僅能產生多樣性大的個體,還會因屬性數的減少而大幅節省時間開銷,同時,由于冗余屬性多,減少一些冗余屬性后訓練出來的基學習器性能也不會差。若數據只包含少量屬性,或者冗余屬性少,則不適宜使用輸入屬性擾動法。 - (3)輸出表示擾動
這類做法的基本思路是對輸出表示進行操縱以增強多樣性。比如可對訓練樣本的label稍作變動,比如“翻轉法”隨機改變一些訓練樣本的標記;也可以對輸出表示進行轉化,如“輸出調制法”將分類輸出轉化為回歸輸出后構建基學習器。這一類貌似用的不多。 - (4)算法參數擾動
這個在現在深度學習比賽中很常見,主要是神經網絡有很多參數可以設置,不同的參數往往可以產生差別比較大的基學習器。
Bagging
核心思想:并行地訓練一系列各自獨立的同類模型,然后再將各個模型的輸出結果按照某種策略進行聚合。例如,分類中可以采用投票策略,回歸中可以采用平均策略;Bagging主要分為兩個階段:
步驟:
- Boostrap階段,即采用有放回的采樣方式,將訓練集分為n個子樣本集;并用基學習器對每組樣本分布進行訓練,得到n個基模型;
- Aggregating階段,將上一個階段訓練得到的n個基模型組合起來,共同做決策。在分類任務中,可采用投票法,比如相對多數投票法,將結果預測為得票最多的類別。而在回歸任務中可采用平均法,即將每個基模型預測得到的結果進行簡單平均或加權平均來獲得最終的預測結果。
Bagging就是再取樣 (Bootstrap) 然后在每個樣本上訓練出來的模型取平均,所以是降低模型的variance.;Bagging 比如Random Forest 這種先天并行的算法都有這個效果
隨機森林(Random Forest)
1. 算法原理
隨機森林(Random Forest)是一種基于決策樹的集成學習方法。它通過構建多個決策樹,并將它們的預測結果進行投票(分類問題)或平均(回歸問題),以獲得最終的預測結果。隨機森林的構建過程包括兩個關鍵步驟:自助采樣(bootstrap sampling)和特征隨機選擇。自助采樣用于生成不同的訓練數據子集,每個子集用于構建一個決策樹。特征隨機選擇則在每個決策樹節點上隨機選擇一部分特征進行劃分,以增加決策樹的多樣性。這兩個步驟共同提高了隨機森林的泛化能力和魯棒性。
2.優缺點
優點:
a) 隨機森林具有較高的預測準確性,通常比單個決策樹的性能要好。
b) 能夠有效地處理高維數據和大量特征。
c) 對噪聲和異常值具有較強的魯棒性。
d) 可以進行特征重要性評估,有助于特征選擇。
e) 并行化能力強,易于實現并行計算。
缺點:
a) 相比單個決策樹,隨機森林的模型可解釋性較差。
b) 訓練和預測時間可能較長,尤其是在大數據集上。
c) 對于某些不平衡的數據集,隨機森林的性能可能不盡如人意。
3.適用場景
隨機森林適用于以下場景:
a) 需要提高預測準確性的分類和回歸問題。
b) 數據集具有高維特征或特征數量較多。
c) 數據集中存在噪聲和異常值。
隨機森林在許多實際應用中表現出較好的性能,尤其是在提高預測準確性方面。然而,隨機森林的可解釋性較差,且在大數據集上訓練和預測時間可能較長。在面臨這些問題時,可以考慮使用其他集成方法,如梯度提升樹(Gradient Boosting Trees)等。
RandomForestClassifier:分類樹
RandomForestRegressor(n_estimators=100, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)
重要的參數:
- n_estimators:隨機森林中決策樹的個數,默認為 100。
- criterion:隨機森林中決策樹的算法,可選的有兩種:1)gini:基尼系數,也就是 CART 算法,為默認值;2)entropy:信息熵,也就是 ID3 算法。
- max_depth:決策樹的最大深度。
RandomForestRegressor:回歸樹
RandomForestRegressor(n_estimators=100, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)
回歸樹中的參數與分類樹中的參數基本相同,但 criterion 參數的取值不同。
在回歸樹中,criterion 參數有下面兩種取值:
- mse:表示均方誤差算法,為默認值。
- mae:表示平均誤差算法。
Boosting
Boosting由于各基學習器之間存在強依賴關系,因此只能串行處理,也就是Boosting實際上是個迭代學習的過程。
Boosting的工作機制為:先從初始訓練集中訓練出一個基學習器,再根據基學習器的表現對訓練樣本分布進行調整(比如增大被誤分樣本的權重,減小被正確分類樣本的權重),使得先前基學習器做錯的樣本在后續的訓練過程中受到更多關注,然后基于調整后的樣本分布來訓練下一個基學習器,如此重復,直到基學習器數目達到事先自定的值T,然后將這T 個基學習器進行加權結合(比如錯誤率小的基學習器權重大,錯誤率大的基學習器權重小,這樣做決策時,錯誤率小的基本學習器影響更大)
Boosting算法主要有AdaBoost(Adaptive Boost)自適應提升算法和Gradient Boosting梯度提升算法。最主要的區別在于兩者如何識別和解決模型的問題。AdaBoost用錯分的數據樣本來識別問題,通過調整錯分數據樣本的權重來改進模型。Gradient Boosting主要通過負梯度來識別問題,通過計算負梯度來改進模型。
AdaBoost
核心思想:串行地訓練一系列前后依賴的同類模型,即后一個模型用來對前一個模型的輸出結果進行糾正。Boosting算法是可以將弱學習器提升為強學習器的學習算法。
步驟:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本進行調整,使得先前基學習器做錯的訓練樣本在后續受到更多的關注,然后基于調整后的樣本分布來訓練下一個基學習器;如此重復進行。直至基學習器數目達到實現指定的值n,最終將這n個基學習器進行結合。
Boosting 則是迭代算法,每一次迭代都根據上一次迭代的預測結果對樣本進行加權,所以隨著迭代不斷進行,誤差會越來越小,所以模型的 bias 會不斷降低。這種算法無法并行,如Adaptive Boosting;
1. 算法原理
AdaBoost(Adaptive Boosting)是一種集成學習方法,通過多次迭代訓練一系列弱學習器并加權組合,以提高分類性能。在每次迭代過程中,對錯誤分類的樣本增加權重,使得后續的弱學習器更關注這些樣本。最后,將所有弱學習器的預測結果進行加權投票,得到最終分類結果。
2.優缺點
a) 優點:
i. 可以提高模型的準確性和泛化能力。
ii. 算法簡單易于實現。 iii. 不容易過擬合。
b) 缺點:
i. 對異常值和噪聲敏感,可能導致性能下降。
ii. 訓練過程需要依次進行,較難并行化。
3.適用場景
AdaBoost適用于以下場景:
a) 當基學習器性能較弱時,可以通過集成提高性能。
b) 適用于二分類問題,尤其是需要提高分類性能的場景。
AdaBoost在人臉檢測、文本分類、客戶流失預測等領域有廣泛應用。
GBDT
核心思想
梯度提升決策樹(Gradient Boosting Decision Tree,GBDT) 是將多個弱學習器(通常是決策樹)組合成一個強大的預測模型。具體而言,GBDT的定義如下:
初始化:首先,GBDT使用一個常數(通常是目標變量的平均值)作為初始預測值。這個初始預測值代表了我們對目標變量的初始猜測。
迭代訓練:GBDT是一個迭代算法,通過多輪迭代來逐步改進模型。在每一輪迭代中,GBDT都會訓練一棵新的決策樹,目標是減少前一輪模型的殘差(或誤差)。殘差是實際觀測值與當前模型預測值之間的差異,新的樹將學習如何糾正這些殘差。
集成:最終,GBDT將所有決策樹的預測結果相加,得到最終的集成預測結果。這個過程使得模型能夠捕捉數據中的復雜關系,從而提高了預測精度。
GBDT的核心原理在于不斷迭代,每一輪迭代都嘗試修正前一輪模型的錯誤,逐漸提高模型的預測性能。
優缺點
優點:
- 可以靈活處理各種類型的數據,包括連續值和離散值。
- 在相對少的調參時間情況下,預測的準備率也可以比較高。這個是相對SVM來說的。
3)使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。 - 很好的利用了弱分類器進行級聯。
- 充分考慮的每個分類器的權重。
6)不需要歸一化。樹模型都不需要,梯度下降算法才需要
6)處理非線性關系
缺點:
1)由于弱學習器之間存在依賴關系,難以并行訓練數據。不過可以通過自采樣的SGBT來達到部分并行。
2)不適合高維稀疏特征
適用場景
GBDT 可以適用于回歸問題(線性和非線性);
GBDT 也可用于二分類問題(設定閾值,大于為正,否則為負)和多分類問題。
XGBoost
1. 算法原理
XGBoost(eXtreme Gradient Boosting)是基于梯度提升(Gradient Boosting)的決策樹集成學習方法。XGBoost通過加入正則化項,降低模型復雜度,提高泛化能力。同時,XGBoost采用了并行計算和近似算法,顯著提高了訓練速度。
XGBoost是基于GBDT 的一種改進算法;
列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異于傳統gbdt的一個特性。
Shrinkage(縮減),相當于學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(傳統GBDT的實現也有學習速率)
對缺失值的處理。對于特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。
2.優缺點
優點:
i. 高效的訓練速度,支持并行計算。
ii. 高準確率,通過正則化降低過擬合風險。
iii. 支持自定義損失函數和評估指標。
iv. 內置特征重要性排序功能。
缺點:
i. 超參數調優較為復雜。
ii. 需要較多的計算資源。
3.適用場景
XGBoost在以下場景表現優異:
a) 大規模數據集。
b) 需要高準確率的分類和回歸任務。
c) 特征選擇。
XGBoost在Kaggle競賽中廣泛應用,獲得了多次勝利。
LightGBM
LightGBM是一種基于梯度提升樹的機器學習算法,它通過使用基于直方圖的算法和帶有按葉子節點分割的決策樹來提高訓練和預測的效率。
算法原理
基于直方圖的算法:LightGBM使用了一種基于直方圖的算法來處理數據。它將數據按特征值進行離散化,構建直方圖并對其進行優化,從而減少了內存消耗和計算時間。
基于按葉子節點分割的決策樹:傳統的梯度提升樹算法在每個節點上都嘗試所有特征的切分點,而LightGBM在構建決策樹時采用了按葉子節點分割的策略。這樣可以減少計算量,并且更容易處理高維稀疏特征。
LightGBM也是基于GBDT的改進算法;
優缺點
優點:
高效性:LightGBM具有高效的訓練和預測速度,尤其在處理大規模數據集時表現出色。
低內存消耗:由于使用了基于直方圖的算法和按葉子節點分割的決策樹,LightGBM能夠減少內存消耗,適用于內存有限的環境。
高準確性:LightGBM通過優化算法和特征選擇等方法提高了模型的準確性。
缺點:
對噪聲敏感:LightGBM在處理噪聲較大的數據時可能會過擬合,需要進行適當的正則化。
參數調優:LightGBM有一些需要調優的參數,不同的參數組合可能會導致不同的效果,需要進行合適的參數調優。
注意事項:
數據預處理:對數據進行清洗、缺失值處理和特征工程等預處理步驟,以提高模型的泛化能力。
參數調優:通過交叉驗證等方法選擇合適的參數組合,以獲得更好的模型性能。
提前停止:在訓練過程中使用早期停止法,避免模型過擬合。
特征重要性評估:通過分析模型輸出的特征重要性,可以幫助理解數據和模型之間的關系,指導特征選擇和特征工程。
總體而言,LightGBM是一種高效、低內存消耗且具有準確性的機器學習算法,在處理大規模數據集和高維稀疏特征方面具有優勢。但需要注意參數調優和模型過擬合問題。
參數設置
AdaBoost
class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm='SAMME.R', random_state=None)
- base_estimator:基分類器,默認是決策樹,在該分類器基礎上進行boosting,理論上可以是任意一個分類器,但是如果是其他分類器時需要指明樣本權重。
- n_estimators:基分類器提升(循環)次數,默認是50次,這個值過大,模型容易過擬合;值過小,模型容易欠擬合。
- learning_rate:學習率,表示梯度收斂速度,默認為1,如果過大,容易錯過最優值,如果過小,則收斂速度會很慢;該值需要和n_estimators進行一個權衡,當分類器迭代次數較少時,學習率可以小一些,當迭代次數較多時,學習率可以適當放大。
- algorithm:boosting算法,也就是模型提升準則,有兩種方式SAMME, 和SAMME.R兩種,默認是SAMME.R,兩者的區別主要是弱學習器權重的度量,前者是對樣本集預測錯誤的概率進行劃分的,后者是對樣本集的預測錯誤的比例,即錯分率進行劃分的,默認是用的SAMME.R。
- random_state:隨機種子設置。
GBDT
class sklearn.ensemble.GradientBoostingClassifier(*, loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0,
criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3,
min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None,
verbose=0, max_leaf_nodes=None, warm_start=False, presort='deprecated', validation_fraction=0.1,
n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)
GBDT(Gradient Boosting Decision Tree)是一種基于梯度提升的集成學習算法,它使用決策樹作為弱學習器,通過迭代地擬合殘差來提高預測性能。GBDT 的主要參數有:
- n_estimators:也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合,一般選擇一個適中的數值。默認是100。在實際調參的過程中,我們常常將n_estimators和下面介紹的參數learning_rate一起考慮;
- learning_rate:float,認= 0.1,學習率縮小了每棵樹的貢獻learning_rate。在learning_rate和n_estimators之間需要權衡;推薦的候選值為:[0.01, 0.015, 0.025, 0.05, 0.1]
- subsample:子采樣,取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在 [0.5, 0.8] 之間,默認是1.0,即不使用子采樣;
loss:即我們GBDT算法中的損失函數。分類模型和回歸模型的損失函數是不一樣的。1)對于分類模型,有對數似然損失函數"deviance"和指數損失函數"exponential"兩者輸入選擇。默認是對數似然損失函數"deviance"。2)對于回歸模型,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數損失“quantile”。默認是均方差"ls"。一般來說,如果數據的噪音點不多,用默認的均方差"ls"比較好。如果是噪音點較多,則推薦用抗噪音的損失函數"huber"。而如果我們需要對訓練集進行分段預測的時候,則采用“quantile”。- init:計量或“零”,默認=無,一個估計器對象,用于計算初始預測。 init必須提供fit和predict_proba。如果為“零”,則初始原始預測設置為零。默認情況下,使用 DummyEstimator預測類優先級;
- max_depth:int,默認= 3,各個回歸估計量的最大深度。最大深度限制了樹中節點的數量。調整此參數以獲得最佳性能;最佳值取決于輸入變量的相互作用。也就是那個樹有多少層(一般越多越容易過擬合);
- min_samples_split:int或float,默認為2,拆分內部節點所需的最少樣本數:如果為int,則認為min_samples_split是最小值。如果為float,min_samples_split則為分數, 是每個拆分的最小樣本數。ceil(min_samples_split * n_samples)
- min_samples_leaf: int或float,默認值= 1,在葉節點處所需的最小樣本數。僅在任何深度的分裂點在min_samples_leaf左分支和右分支中的每個分支上至少留下訓練樣本時,才考慮。這可能具有平滑模型的效果,尤其是在回歸中。如果為int,則認為min_samples_leaf是最小值。如果為float,min_samples_leaf則為分數, 是每個節點的最小樣本數。ceil(min_samples_leaf * n_samples)
- min_weight_fraction_leaf:float,默認值= 0.0,在所有葉節點處(所有輸入樣本)的權重總和中的最小加權分數。如果未提供sample_weight,則樣本的權重相等。
- min_impurity_decrease:浮動,默認值= 0.0,如果節點分裂會導致雜質的減少大于或等于該值,則該節點將被分裂;
- min_impurity_split :float,默認=無提前停止樹木生長的閾值。如果節點的雜質高于閾值,則該節點將分裂,否則為葉
- subsample:用于訓練每個弱學習器的樣本比例。減小該參數可以降低方差,但也可能增加偏差。
- max_features:節點分裂時參與判斷的最大特征數,用于分裂每個決策樹節點的特征數量。減小該參數可以降低過擬合的風險,但也可能降低模型的表達能力。int:個數;float:占所有特征的百分比;auto:所有特征數的開方;sqrt:所有特征數的開方;log2:所有特征數的log2值;None:等于所有特征數。
XGBoost
XGBoost(Extreme Gradient Boosting)是一種優化的 GBDT 實現,它使用了更高效的數據結構和并行計算,同時引入了正則化項和剪枝策略來防止過擬合。XGBoost 的主要參數有:
- n_estimators:同 GBDT。
- learning_rate:同 GBDT。
- max_depth:同 GBDT。
- min_child_weight:決策樹葉節點的最小權重和,相當于 GBDT 中的 min_samples_leaf 乘以樣本權重。增加該參數可以防止過擬合,但也可能導致欠擬合。
- subsample:同 GBDT。
- colsample_bytree:相當于 GBDT 中的 max_features,表示用于訓練每棵樹的特征比例。減小該參數可以降低過擬合的風險,但也可能降低模型的表達能力。
- reg_alpha:L1 正則化項的系數,用于懲罰模型的復雜度。增加該參數可以使模型更稀疏,但也可能損失一些信息。推薦的候選值為:[0, 0.01~0.1, 1]
- reg_lambda:L2 正則化項的系數,用于懲罰模型的復雜度。增加該參數可以防止過擬合,但也可能降低模型的靈活性。推薦的候選值為:[0, 0.1, 0.5, 1]
LightGBM
LightGBM(Light Gradient Boosting Machine)是一種基于梯度提升的高效的分布式機器學習框架,它使用了基于直方圖的算法和基于葉子的生長策略,可以大大提高訓練速度和減少內存消耗。LightGBM 的主要參數有:
- n_estimators:同 GBDT。
- learning_rate:同 GBDT。
- num_leaves:決策樹的最大葉子數,相當于 GBDT 中的 max_depth 的指數倍。增加該參數可以增加模型的復雜度和擬合程度,但也可能導致過擬合。
- min_child_samples:同 GBDT 中的 min_samples_leaf。
- subsample:同 GBDT。
- colsample_bytree:同 XGBoost。
- reg_alpha:同 XGBoost。
- reg_lambda:同 XGBoost。
Stacking
Stacking的核性思想是并行地訓練一系列各自獨立的不同類模型,然后通過訓練一個元模型(meta-model)來將各個模型輸出結果進行結合。Stacking也可以分為兩個階段:
分別采用全部的訓練樣本來訓練n個組件模型,要求這些個體學習器必須異構的,比如可以分別是線性學習器,SVM,決策樹模型和深度學習模型。
訓練一個元模型(meta-model)來將各個組件模型的輸出結果進行結合,具體過程就是將各個學習器在訓練集上得到的預測結果作為訓練特征和訓練集的真實結果組成新的訓練集;然后用這個新組成的訓練集來訓練一個元模型。這個元模型可以是線性模型或者樹模型。
分類
原理
優劣勢
python實現
調參
應用