集成學習基礎集成學習是指結合兩個或多個模型的機器學習模型。集成學習是機器學習的分支,通常在追求更強預測的能力時使用。
集成學習經常被機器學習學術活動中的頂級和獲勝參與者使用。現代機器學習庫(scikit-learn、XGBoost)內部已經結合了常見的集成學習方法。
集成學習介紹集成學習結合多個不同的模型,然后結合單個模型完成預測。通常情況下,集成學習能比單個模型找到更好的性能。
常見的集成學習技術有三類:
Bagging, 如. Bagged Decision Trees and Random Forest.Boosting, 如. Adaboost and Gradient BoostingStacking, 如. Voting and using a meta-model.使用集成學習可以減少預測結果的方差,同時也比單個模型更好的性能。
BaggingBagging通過采樣訓練數據集的樣本,訓練得到多樣的模型,進而得到多樣的預測結果。在結合模型的預測結果時,可以對單個模型預測結果進行投票或平均。

Bagging的關鍵是對數據集的采樣方法。常見的方式可以從行(樣本)維度進行采樣,這里進行的是有放回采樣。
Bagging可通過BaggingClassifier和BaggingRegressor使用,默認情況下它們使用決策樹作為基本模型,可以通過n_estimators參數指定要創建的樹的數量。
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?BaggingClassifier
#?創建樣例數據集
X,?y?=?make_classification(random_state=1)
#?創建bagging模型
model?=?BaggingClassifier(n_estimators=50)
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
Random Forest隨機森林是 Bagging與樹模型的結合:
隨機森林集成在訓練數據集的不同引導樣本上擬合決策樹。
隨機森林還將對每個數據集的特征(列)進行采樣。
在構建每個決策樹時,隨機森林不是在選擇分割點時考慮所有特征,而是將特征限制為特征的隨機子集。
隨機森林集成可通過RandomForestClassifier和RandomForestRegressor類在 scikit-learn ?中獲得。您可以通過n_estimators參數指定要創建的樹的數量,并通過max_features參數指定要在每個分割點考慮的隨機選擇的特征的數量。
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?RandomForestClassifier
#?創建樣例數據集
X,?y?=?make_classification(random_state=1)
#?創建隨機森林模型
model?=?RandomForestClassifier(n_estimators=50)
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
AdaBoostBoosting在迭代過程中嘗試糾先前模型所產生的錯誤,迭代次數越多集成產生的錯誤就越少,至少在數據支持的限制范圍內并且在過度擬合訓練數據集之前。

Boosting想法最初是作為一種理論思想發展起來的,AdaBoost算法是第一個成功實現基于Boosting的集成算法的方法。
AdaBoost在加權訓練數據集的版本上擬合決策樹,以便樹更多地關注先前成員出錯的示例。AdaBoost不是完整的決策樹,而是使用非常簡單的樹,在做出預測之前對一個輸入變量做出單一決策。這些短樹被稱為決策樹樁。
AdaBoost可通過AdaBoostClassifier和AdaBoostRegressor使用,它們默認使用決策樹(決策樹樁)作為基本模型,可以通過n_estimators參數指定要創建的樹的數量。
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?AdaBoostClassifier
#?創建樣例數據集
X,?y?=?make_classification(random_state=1)
#?創建adaboost模型
model?=?AdaBoostClassifier(n_estimators=50)
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
Gradient BoostingGradient Boosting是一個用于提升集成算法的框架,是對AdaBoosting的擴展。Gradient Boosting定義為統計框架下的加法模型,并允許使用任意損失函數以使其更加靈活,并允許使用損失懲罰(收縮)來減少過度擬合。
Gradient Boosting引入了Bagging的操作,例如訓練數據集行和列的采樣,稱為隨機梯度提升。
對于結構化或表格數據來說,Gradient Boosting一種非常成功的集成技術,盡管由于模型是按順序添加的,因此擬合模型可能會很慢。已經開發了更有效的實現,如XGBoost、LightGBM。
Gradient Boosting在可以通過GradientBoostingClassifier和GradientBoostingRegressor使用,默認使用決策樹作為基礎模型。您可以通過n_estimators參數指定要創建的樹的數量,通過learning_rate參數控制每棵樹的貢獻的學習率。
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?GradientBoostingClassifier
#?創建樣例數據集
X,?y?=?make_classification(random_state=1)
#?創建GradientBoosting模型
model?=?GradientBoostingClassifier(n_estimators=50)
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
VotingVoting使用簡單的統計數據來組合來自多個模型的預測。
硬投票:對預測類別進行投票;
軟投票:對預測概率進行求均值;
Voting可通過VotingClassifier和VotingRegressor使用。可以將基本模型列表作為參數,列表中的每個模型都必須是具有名稱和模型的元組,
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?VotingClassifier
from?sklearn.naive_bayes?import?GaussianNB
from?sklearn.linear_model?import?LogisticRegression
#?創建數據集
X,?y?=?make_classification(random_state=1)
#?模型列表
models?=?[('lr',?LogisticRegression()),?('nb',?GaussianNB())]
#?創建voting模型
model?=?VotingClassifier(models,?voting='soft')
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
StackingStacking組合多種不同類型的基本模型的預測,和Voting類似。但Stacking可以根據驗證集來調整每個模型的權重。

Stacking需要和交叉驗證搭配使用,也可以通過StackingClassifier和StackingRegressor使用,可以將基本模型作為模型的參數提供。
from?sklearn.datasets?import?make_classification
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?RepeatedStratifiedKFold
from?sklearn.ensemble?import?StackingClassifier
from?sklearn.neighbors?import?KNeighborsClassifier
from?sklearn.tree?import?DecisionTreeClassifier
from?sklearn.linear_model?import?LogisticRegression
#?創建數據集
X,?y?=?make_classification(random_state=1)
#?模型列表
models?=?[('knn',?KNeighborsClassifier()),?('tree',?DecisionTreeClassifier())]
#?設置驗證集數據劃分方式
cv?=?RepeatedStratifiedKFold(n_splits=10,?n_repeats=3,?random_state=1)
#?驗證模型精度
n_scores?=?cross_val_score(model,?X,?y,?scoring='accuracy',?cv=cv,?n_jobs=-1)
#?打印模型的精度
print('Mean?Accuracy:?%.3f?(%.3f)'?%?(mean(n_scores),?std(n_scores)))
每天Kaggle算法學術活動、干貨資訊匯總
趕緊掃碼詳細咨詢,及時獲取海量國際學術活動資訊及真題福利


? 2025. All Rights Reserved. 滬ICP備2023009024號-1