多个模型组合不自动优于单模型。先确认基模型是否在不同样本上互补,再判断组合方法是否真正带来收益。
三种组合不要混成一种
Bagging 常通过抽样训练多个基学习器,再汇总结果;Boosting 按阶段构建加性模型;Stacking 则用基模型的输出训练第二层模型。这些是不同的训练设计,不是“多套一层就更先进”。
如果第二层使用普通线性逻辑回归,它的系数在训练完成后是固定的。不同样本的输入预测不同,不等于系数会按样本动态变化。只有明确设计了条件门控等机制,才应讨论相应的动态权重。
为什么需要折外预测
第二层若只看到基模型对自身训练样本的预测,会学习到过于乐观的表现。常见方案是让基模型在训练集内部生成折外预测,用它们训练第二层。scikit-learn 的 StackingClassifier 使用交叉验证预测训练最终估计器;它的 cv 不是自动替整个实验完成独立泛化评估。官方说明
下面用 Iris 自带数据演示流程,不下载数据,也不报告“优于基线”的结论。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
x, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=0.2, stratify=y, random_state=23
)
model = StackingClassifier(
estimators=[
("linear", make_pipeline(StandardScaler(), LogisticRegression(max_iter=500))),
("tree", DecisionTreeClassifier(max_depth=2, random_state=23)),
],
final_estimator=LogisticRegression(max_iter=500),
cv=3,
)
model.fit(x_train, y_train)
probabilities = model.predict_proba(x_test)
assert probabilities.shape == (len(y_test), 3)
np.testing.assert_allclose(probabilities.sum(axis=1), 1.0)
print("training-only stacking and held-out prediction checks passed")
涉及分组、时间预测或基模型调参时,内部划分同样要遵守数据约束,不能只因为外层留了测试集就忽略内部泄漏。若比较多套融合配置,应在验证边界内选择,最后才查看固定测试结果。
验收看什么
与单模型使用同一划分和预算;除了主指标,还比较延迟、模型数量、错误相关性和多次运行波动。按各模型单独准确率归一化得到的权重,并不保证组合最优;更复杂的融合也不天然构成新的研究贡献。
来源与核验边界
本篇结合疏锦行机器学习基础班《模型深化》的集成部分,重写了 Stacking 的训练边界并纠正“线性元模型必然动态调权”的说法。Iris 流程已运行;没有复现讲义中的应用项目或论文结果。视频尚未逐节核验,原课件与代码包不公开。
集成学习笔记:Stacking先管好折外预测,再谈模型互补
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法