Stacking(堆叠泛化) 简介
目录1. 基本结构第一层Base Learners / Level-0 Models第二层Meta Learner / Level-1 Model2. Stacking 的核心流程第一步划分 K 折第二步生成 OOF 预测第三步训练元模型第四步预测测试集3. Stacking 框架示意4. sklearn 实现示例分类任务5. 回归任务示例6. 关键注意点1. 必须防止数据泄漏2. 基模型要有差异性3. 元模型不要太复杂4. 分类任务优先使用概率输出7. Stacking 与 Bagging、Boosting 的区别8. 适合使用 Stacking 的场景Stacking堆叠泛化是一种集成学习框架核心思想是先训练多个不同的基础模型再把这些模型的预测结果作为新的特征交给一个二层模型学习如何组合它们。1. 基本结构Stacking 通常分为两层第一层Base Learners / Level-0 Models这一层包含多个基础模型例如Logistic RegressionRandom ForestXGBoost / LightGBMSVMKNNNeural Network它们分别对同一份训练数据进行学习。第二层Meta Learner / Level-1 Model第二层模型不直接使用原始特征而是使用第一层模型的预测结果作为输入。例如样本模型A预测模型B预测模型C预测真实标签x10.720.660.811x20.210.350.180然后用这些预测值训练一个元模型例如 Logistic Regression、Ridge、XGBoost 等。2. Stacking 的核心流程假设有训练集 X_train, y_train 和测试集 X_test。第一步划分 K 折将训练集分成 K 份例如 5 折。第二步生成 OOF 预测OOF 指Out-of-Fold Prediction。对每个基础模型用 K-1 折训练模型用剩下的 1 折预测重复 K 次得到每个训练样本的“非自身训练模型”预测结果。这样可以避免数据泄漏。第三步训练元模型将所有基础模型的 OOF 预测拼接成新的训练集meta_train [model_1_oof,model_2_oof,model_3_oof,...]然后训练元模型meta_model.fit(meta_train, y_train)第四步预测测试集每个基础模型对测试集进行预测得到meta_test [model_1_test_pred,model_2_test_pred,model_3_test_pred,...]最后final_pred meta_model.predict(meta_test)3. Stacking 框架示意原始特征 X│├── 模型 1Random Forest├── 模型 2XGBoost├── 模型 3SVM└── 模型 4Logistic Regression│▼各模型预测结果[pred1, pred2, pred3, pred4]│▼元模型 Meta Learner│▼最终预测结果4. sklearn 实现示例分类任务from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, StackingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 数据 X, y load_breast_cancer(return_X_yTrue) X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 第一层基础模型 base_models [ (rf, RandomForestClassifier(n_estimators100, random_state42)), (gbdt, GradientBoostingClassifier(random_state42)), (svc, SVC(probabilityTrue, random_state42)) ] # 第二层元模型 meta_model LogisticRegression() # Stacking 模型 stacking_model StackingClassifier( estimatorsbase_models, final_estimatormeta_model, cv5, stack_methodpredict_proba ) # 训练 stacking_model.fit(X_train, y_train) # 预测 y_pred stacking_model.predict(X_test) # 评估 print(Accuracy:, accuracy_score(y_test, y_pred))from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, StackingClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score# 数据X, y load_breast_cancer(return_X_yTrue)X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)# 第一层基础模型base_models [(rf, RandomForestClassifier(n_estimators100, random_state42)),(gbdt, GradientBoostingClassifier(random_state42)),(svc, SVC(probabilityTrue, random_state42))]# 第二层元模型meta_model LogisticRegression()# Stacking 模型stacking_model StackingClassifier(estimatorsbase_models,final_estimatormeta_model,cv5,stack_methodpredict_proba)# 训练stacking_model.fit(X_train, y_train)# 预测y_pred stacking_model.predict(X_test)# 评估print(Accuracy:, accuracy_score(y_test, y_pred))5. 回归任务示例from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, StackingRegressor from sklearn.linear_model import Ridge from sklearn.svm import SVR base_models [ (rf, RandomForestRegressor(n_estimators100, random_state42)), (gbr, GradientBoostingRegressor(random_state42)), (svr, SVR()) ] meta_model Ridge() stacking_regressor StackingRegressor( estimatorsbase_models, final_estimatormeta_model, cv5 )from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, StackingRegressorfrom sklearn.linear_model import Ridgefrom sklearn.svm import SVRbase_models [(rf, RandomForestRegressor(n_estimators100, random_state42)),(gbr, GradientBoostingRegressor(random_state42)),(svr, SVR())]meta_model Ridge()stacking_regressor StackingRegressor(estimatorsbase_models,final_estimatormeta_model,cv5)6. 关键注意点1. 必须防止数据泄漏元模型不能直接使用基础模型在自身训练样本上的预测结果。应该使用 K 折 OOF 预测。2. 基模型要有差异性Stacking 的效果依赖模型之间的互补性。比较好的组合是线性模型 树模型 核方法 神经网络如果所有模型都很相似Stacking 提升有限。3. 元模型不要太复杂元模型常用Logistic RegressionLinear RegressionRidgeLassoLightGBMXGBoost数据量较小时推荐用简单模型避免过拟合。4. 分类任务优先使用概率输出分类任务中通常使用predict_proba()而不是predict()因为概率信息比类别标签更丰富。7. Stacking 与 Bagging、Boosting 的区别方法核心思想代表算法Bagging多个模型并行训练降低方差Random ForestBoosting模型串行训练逐步纠错AdaBoost, XGBoost, LightGBMStacking多模型预测结果再学习组合方式StackingClassifier8. 适合使用 Stacking 的场景Stacking 适合比赛建模如 Kaggle、天池单模型效果已接近瓶颈数据量较充足不同模型表现互补追求更高预测精度。不太适合数据量很小模型解释性要求极高训练时间非常受限基模型之间高度相似。一句话总结Stacking 是一种“让模型学习如何组合多个模型”的集成学习方法关键在于用 OOF 预测训练元模型避免数据泄漏。