多个模型组合不自动优于单模型。先确认基模型是否在不同样本上互补,再判断组合方法是否真正带来收益。

三种组合不要混成一种

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 流程已运行;没有复现讲义中的应用项目或论文结果。视频尚未逐节核验,原课件与代码包不公开。