Bagging需有放回抽样+特征子集,RandomForestClassifier默认满足;XGBoost不支持NaN而LightGBM支持;Stacking第二层宜用LogisticRegression/Ridge,须兼容predict_proba。

Bagging 为什么用 RandomForestClassifier 而不是手动平均多个 DecisionTreeClassifier
因为 Bagging 的核心不是“随便训几个树再平均”,而是每个模型必须在**有放回抽样 + 特征子集**下独立训练,否则方差压不下来。手动循环调 DecisionTreeClassifier 容易漏掉这两点。
实操建议:
- 直接用
RandomForestClassifier,它默认开启bootstrap=True和max_features="sqrt"(分类)或"log2"(回归),这才是标准 Bagging - 如果真要手写,必须显式设置
random_state每次不同 + 手动用resample(X, y, replace=True)抽样 + 每棵树用不同列索引切特征 -
n_estimators设太小(如 10)效果不稳定;50–200 是常见安全区间;超过 500 后提升极慢,还拖慢预测
Boosting 选 XGBoost 还是 LightGBM?看数据量和缺失值处理需求
两者都支持梯度提升,但默认行为差异大,直接影响你是不是要花半天填坑。
常见错误现象:XGBoost 在含 np.nan 的 DataFrame 上直接报 ValueError: Input contains NaN;LightGBM 默认就支持,并把缺失值当一个独立分支处理。
立即学习“Python免费学习笔记(深入)”;
使用场景判断:
- 小数据(XGBoost(
booster="gbtree"稳定,feature_importances_直接可用) - 大数据(>100 万)、高维稀疏特征、有大量缺失 →
LightGBM(cat_smooth对类别特征友好,early_stopping_rounds收敛更快) - 别硬套
sklearn.ensemble.GradientBoostingClassifier:它不支持 GPU,树分裂策略较旧,收敛慢且容易过拟合
Stacking 的第二层模型不能用 DecisionTreeRegressor 当元特征组合器
Stacking 不是“把一堆预测结果喂给一棵树”,而是让第二层模型学习「哪些基模型在什么条件下更可信」。树类模型对输入尺度敏感、无法建模线性补偿关系,容易把元特征当噪声拟合。
实操建议:
- 第二层首选
LogisticRegression(分类)或Ridge(回归):系数可解释,抗噪强,训练快 - 如果要用非线性模型,至少加
StandardScaler预处理元特征(StackingClassifier默认不帮你做) - 注意
cv参数:设成5或StratifiedKFold,避免元特征泄露——用同一折的训练数据去预测同一折的标签,否则第二层会高估性能
StackingClassifier 的 final_estimator 报 AttributeError: 'xxx' object has no attribute 'predict_proba'
这是最常卡住人的地方:第二层模型必须同时支持 predict 和 predict_proba(分类)或 predict 和 predict_interval(回归),否则 StackingClassifier 初始化就失败。
典型兼容组合:
- 分类任务:用
LogisticRegression、RandomForestClassifier、XGBClassifier(需设use_label_encoder=False, eval_metric="logloss") - 避坑:别用
SVC(默认probability=False),要开就得加probability=True,但训练变慢且不准;也别用KNeighborsClassifier(n_neighbors小时predict_proba结果抖动大) - 检查方式:实例化后手动调
hasattr(model, "predict_proba"),比等报错再查快得多
多层融合真正难的不是堆模型,是让每层输出稳定、可复现、不互相污染。尤其 Stacking 的交叉验证逻辑和元特征对齐,稍不注意就会让验证分数虚高一截,上线后直接掉点。










