描述
集成學習(Ensemble Learning)是一種通過結合多個模型的預測結果來提高整體性能的技術。集成學習的核心思想是通過多個弱學習器的組合,可以構建一個強學習器。
sklearn中常見的集成學習算法:
- Bagging:通過自助采樣法(Bootstrap Sampling)生成多個訓練集,然后分別訓練多個模型,最后通過投票或平均的方式得到最終結果。
- Boosting:通過迭代的方式訓練多個模型,每個模型都試圖糾正前一個模型的錯誤,最終通過加權投票的方式得到結果。
- Stacking:通過訓練多個不同的模型,然后將這些模型的輸出作為新的特征,再訓練一個元模型(Meta-Model)來進行最終的預測。
sklearn中的集成學習算法在sklearn.ensemble
中;后面的XGBClassifier算法需要單獨安裝xgboost庫;LGBMClassifier需要安裝lightgbm庫。
Bagging
Bagging 的目標是通過減少模型的方差來提高性能,適用于高方差、易過擬合的模型。
- 數據集重采樣:對訓練數據集進行多次有放回的隨機采樣,每次采樣得到一個子數據集。
- 訓練多個模型:在每個子數據集上訓練一個基學習器(通常是相同類型的模型)。
- 結果合并:將多個基學習器的結果進行合并,通常是通過投票(分類問題)或平均(回歸問題)。
最具代表性的算法是:隨機森林是 Bagging 的經典實現,它通過構建多個決策樹,每棵樹在訓練時隨機選擇特征,從而減少過擬合的風險。
優勢
- 可以有效減少方差,提高模型穩定性。
- 適用于高方差的模型(如決策樹)
缺點
- 訓練過程時間較長,需要訓練多個模型
- 結果難以解釋
Boosting
Boosting 的目標是通過減少模型的偏差來提高性能,適用于弱學習器。Boosting 的核心思想是逐步調整每個模型的權重,強調那些被前一輪模型錯誤分類的樣本。
- 序列化訓練:模型是一個接一個地訓練的,每一輪訓練都會根據前一輪的錯誤進行調整。
- 加權投票:最終的預測是所有弱學習器預測的加權和,其中錯誤分類的樣本會被賦予更高的權重。
- 合并模型:每個模型的權重是根據其在訓練過程中的表現來確定的。
典型算法:
- AdaBoost:通過改變樣本的權重,使得每個后續分類器更加關注前一輪錯誤分類的樣本。
- 梯度提升樹:GBT 通過迭代優化目標函數,逐步減少偏差。
- XGBoost:XGBoost 是一種高效的梯度提升算法,廣泛應用于數據科學競賽中,具有較強的性能和優化。
- LightGBM:是一種基于梯度提升樹的框架,相較于 XGBoost,具有更快的訓練速度和更低的內存使用。
優勢
- 適用于偏差較大的模型,能有效提高預測準確性。
- 性能好,在許多實際應用中表現優異。
缺點
-
對噪聲數據比較敏感,容易導致過擬合。
-
訓練過程較慢,特別是在數據量較大的情況下。
Stacking
Stacking 是一種通過訓練不同種類的模型并組合它們的預測來提高整體預測準確度的方法。核心思想是:
- 第一層(基學習器):訓練多個不同類型的基學習器(例如,決策樹、SVM、KNN 等)來對數據進行預測。
- 第二層(元學習器):將第一層學習器的預測結果作為輸入,訓練一個元學習器(通常是邏輯回歸、線性回歸等),來做最終的預測。
優勢
- 可以使用不同類型的基學習器,捕捉數據中不同的模式。
- 理論上可以結合多種模型的優勢,達到更強的預測能力。
缺點
- 訓練過程復雜,需要對多個模型進行訓練,且模型之間的結合方式也需要精心設計。
- 比其他集成方法如 Bagging 和 Boosting 更復雜,且容易過擬合。
應用樣例
StackingClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitiris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=42)# 定義基學習器
estimators = [('dt', DecisionTreeClassifier(max_depth=1)),('svc', SVC(kernel='linear', probability=True))
]
# final_estimator 參數指定元學習器
stacking = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())
stacking.fit(X_train, y_train)
print(stacking.score(X_train,y_train),stacking.score(X_test,y_test))
XGBClassifier
from xgboost.sklearn import XGBClassifiermodel = XGBClassifier(eval_metric='error',max_depth=1)
model.fit(X_train,y_train)
print(model.score(X_train,y_train),model.score(X_test,y_test))
XGBClassifier常用參數:
- learning_rate:小的學習率意味著更多的迭代次數,通常能帶來更好的結果,但會增加計算時間。
- max_depth:控制每棵樹的深度,避免過擬合。
- subsample:訓練每棵樹時使用的樣本比例。
- colsample_bytree:在構建樹時對特征進行采樣的比例。
- n_estimators:決策樹的個數
- eval_metric:校驗數據所需的評價指標。回歸任務默認‘rmse’,分類任務默認‘error’。其他可選值’logloss’、‘auc’
- gamma:懲罰項系數,指定節點分裂所需的最小損失函數下降值。值越大,算法越保守。
- alpha:L1 正則化系數,默認為 1。
- booster:指定弱學習器的類型,默認值為 ‘gbtree’。可以選擇 ‘gblinear’ 使用線性模型。
LGBMClassifier
from lightgbm.sklearn import LGBMClassifiermodel = LGBMClassifier(max_depth=1,boosting_type='gbdt',learning_rate=0.2)
model.fit(X_train,y_train)
print(model.score(X_train,y_train),model.score(X_test,y_test))
LGBMClassifier常用參數:
- n_estimators:指定弱分類器的數量,默認是100
- learning_rate:控制每個弱分類器的貢獻,默認0.1。一個較小的學習率一般需要更多的樹來提高模型性能
- max_depth:控制每棵樹的深度,避免過擬合。
- boosting_type:提升類型,可以是 gbdt(默認)、dart、goss等,分別對應傳統提升樹、Dropouts與GOSS。
- class_weight:用于解決分類不平衡問題,可以設置成balanced或者手動指定每個類別的權重。
- num_leaves:葉子節點的數量,較高的值能夠提高訓練的準確度,但也容易導致過擬合