假设你开了一家奶茶店,正犹豫要不要在商场花高价租铺位。你请来三位顾问:一位擅长商圈人流量分析,一位精通财务成本测算,还有一位专攻年轻人口味趋势。三人各交了一份报告,但结论并不完全一致:商圈专家说“人流大值得租”,财务专家说“租金太贵回本慢”,口味专家觉得“新品能引爆年轻人”。作为老板,你不会只听任何一个人的话,而是把三份报告摊在桌上,结合自己的判断拍板。 机器学习里的 Stacking 堆叠法,干的就是“老板拍板”这件事。它把多个基础模型(顾问)的预测结果当作新的特征(报告),再训练一个元模型(老板),让它学习如何综合这些意见,做出更靠谱的最终判断。这篇教程会从原理到实战,一步步讲清 Stacking 是怎么运作的,以及怎么在 Kaggle 这类竞赛里用它给成绩“再加一口气”。

岗位关联

学完本文,你不仅能看懂 Kaggle 金牌方案里的“模型融合”环节,还能亲手搭建一套 Stacking 流水线,让你的模型成绩再上一个台阶。

目录
  1. 可视化演示
  2. 概念认知
  3. 分层机制
  4. K折交叉
  5. 实战要点
  6. 竞赛应用
  7. 注意事项
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

Stacking两层架构 ——多基模型预测→元模型组合 L1基模型:XGBoost/LightGBM/LR/NN L2元模型:LR/Ridge(简单优先) 元特征 = OOF预测矩阵 [N×M],M=基模型数

概念认知

“三个臭皮匠顶个诸葛亮”这句老话,在机器学习里演化出了不止一种玩法。Bagging(装袋法)像开股东大会,每位股东(决策树)投票,票多者胜;Boosting(提升法)像导师带徒弟,一题一题地纠错,后一个模型专门补齐前一个的短板;而 Stacking 则更像是“顾问听证会”——几位专家先各自发表独立意见,再由一位总负责人综合分析出最终结论。三者目标一致,但决策机制各不相同。

在集成学习(Ensemble Learning)这个大家族里,Stacking 的正式名字叫“堆叠泛化”(Stacked Generalization)。它的出发点非常朴素:单个模型往往各有偏科——逻辑回归擅长线性关系,决策树擅长捕捉非线性,SVM(支持向量机)在边界清晰的数据上表现优异。既然如此,为什么不把它们组合起来,让一个“老板”模型去学习“什么时候该听谁的”?

具体做法是分两层训练:第一层是若干基模型(Base Models),第二层是一个元模型(Meta Model)。元模型的输入不是原始特征,而是每个基模型的预测输出。它学到的是“如何融合多位专家的意见”,而不是从头理解数据。这就是 Stacking 与简单投票的本质区别。

可以说,Stacking 让机器自己学会了“组合意见的方式”——不是简单地算平均,而是让老板根据各位顾问过去的表现以及观点之间的互补性,动态地决定最终答案。这正是它比“平均派”融合策略更强大的原因,也是“三个臭皮匠”能真正胜过“一个诸葛亮”的底层逻辑。

y^final=g(y^(1),y^(2),…,y^(M))\displaystyle \hat{y}_{final} = g\left( \hat{y}^{(1)}, \hat{y}^{(2)}, \ldots, \hat{y}^{(M)} \right)
这个公式的意思是:老板(元模型 $g$)把 M 位顾问(基模型)的建议 $\hat{y}^{(1)}$ 到 $\hat{y}^{(M)}$ 一起吃进去,吐出最终决策 $\hat{y}_{final}$。
  1. $\hat{y}^{(m)}$(第 m 位顾问的建议)第 $m$ 个基模型对同一个样本的输出预测值,比如“该客户流失概率 0.7”。所有建议拼在一起,就是老板收到的报告。
    y^(m)=fm(xi)\displaystyle \hat{y}^{(m)} = f_m(\mathbf{x}_i)
  2. $g(\cdot)$(老板的决策函数)元模型本身也是一个可训练的机器学习模型,它读入 M 个预测值,学习它们与真实标签之间的关系,输出融合后的结果。
    g:RM→R\displaystyle g: \mathbb{R}^{M} \to \mathbb{R}
  3. $\hat{y}_{final}$(最终拍板结果)融合后的最终预测值。它综合了所有顾问的信息量,通常比任何一个单独预测更稳健。
    y^final=g(y^(1),y^(2),…,y^(M))\displaystyle \hat{y}_{final} = g\left( \hat{y}^{(1)}, \hat{y}^{(2)}, \ldots, \hat{y}^{(M)} \right)

分层机制

继续用奶茶店的例子。老板(元模型)不会亲自去做市场调研,他只看三位顾问提交的报告——报告上写着他们对“要不要租铺”的独立判断。顾问们各自用自己的专业知识去分析原始材料(基模型在原始特征上训练),每个人看问题的角度不同,观点自然有差异。老板要做的,仅仅是读懂这些报告。

放到技术上,这就是 Stacking 的分层结构。第一层叫 Level 0,由 M 个基模型组成,它们直接面对原始特征;第二层叫 Level 1,由一个元模型组成。关键约束在于:元模型看不到原始特征,它拿到的只是基模型在样本上的预测值,这些预测值被重新组织成一张“新特征表”。

具体来说,假设训练集有 N 个样本,我们训练了 M 个基模型。把每个基模型在这 N 个样本上的预测结果按列排列,就能拼出一张 N 行 M 列的矩阵。这张矩阵取代原始特征,成为元模型的学习资料。原始特征的维度、分布、语义,统统被压缩成了“每个顾问的一句评语”。

老板手里的表格,一行是一位客户,一列是一位顾问的评分。他(元模型)靠着这张多维评分表学习最优决策规则,而不是被原始数据的洪流淹没。分层机制的妙处在于:每一层只负责一件事——下层提供多样化视角,上层专注组合策略。

Zi=[y^i(1),y^i(2),…,y^i(M)]\displaystyle \mathbf{Z}_i = \left[ \hat{y}_i^{(1)}, \hat{y}_i^{(2)}, \ldots, \hat{y}_i^{(M)} \right]
这个公式描述的是:第 $i$ 个样本进入第二层时,它的“新外形”不再是原始特征,而是 M 个基模型给出的预测值拼成的向量。
  1. $\hat{y}_i^{(m)}$(第 m 位顾问对第 i 个客户的评语)第 $m$ 个基模型对第 $i$ 个样本的预测输出,是一个实数,如 0.32。
    y^i(m)=fm(xi)\displaystyle \hat{y}_i^{(m)} = f_m(\mathbf{x}_i)
  2. $\mathbf{Z}_i$(重组后的新特征行)把 M 个预测值横向拼接,得到第 $i$ 个样本在第二层的新特征向量,每一列对应一位顾问。
    Zi∈RM\displaystyle \mathbf{Z}_i \in \mathbb{R}^{M}
  3. 维度等于基模型数量新特征的维度由 M 决定,而不是原始特征维度。换句话说,元模型只需要处理“M 个意见”,不必关心原始数据有多复杂。

K折交叉

这里藏着一个关键陷阱。如果你先让顾问们把“历年真题”全部做了一遍,再让他们出评估报告,那报告里体现的不是分析能力,而是记忆力。机器学习也一样——如果直接用训练集让基模型做预测,再拿这些预测去训练元模型,基模型由于“见过”这些样本,预测值会异常乐观。元模型学到的是一份虚假的“百发百中”报告,一到新数据就原形毕露。这就是数据泄漏。

解决之道是 K 折交叉验证(K-Fold Cross Validation)。把训练集平均切成 K 份,通常取 K=5 或 10。每次训练时,拿出第 k 份作为验证集,剩下 K-1 份用来训练基模型,然后在这第 k 份上做预测。循环 K 次之后,每个样本的预测值都来自一个“从未见过它”的基模型。这一整套预测被称为 OOF(Out-of-Fold,折叠外)预测。

将这些 OOF 预测按样本位置拼回,就得到与训练集等长的特征列。测试集上的处理则不同:要么用 K 个折的模型分别预测测试集再取平均,要么用全部训练数据重新训练基模型后再预测,两种方式都能保证训练侧与测试侧的特征分布一致。

这相当于每次请顾问做“盲测”——不透露客户资料来自题库,他给出的才是真实专业判断。老板收集了足够多的盲测评分,才能对每位顾问的可靠程度建立准确认知。OOF 特征,就是 Stacking 里那张“盲测打分表”,也是整个流程中最不能省的一步。

y^iOOF=fS∖Fk(i)(xi)\displaystyle \hat{y}_i^{OOF} = f_{S \setminus F_{k(i)}}(\mathbf{x}_i)
这个公式表达的是:第 $i$ 个样本的 OOF 预测,来自一个“没有见过它”的模型——该模型只用了训练集中不包含它的那部分数据训练。
  1. $F_{k(i)}$(包含样本 i 的那一折)样本 $i$ 被划分到了第 $k(i)$ 折,这一折在当轮训练中完全不可见。
    F1∪F2∪⋯∪FK=S\displaystyle F_1 \cup F_2 \cup \cdots \cup F_K = S
  2. $S \setminus F_{k(i)}$(去掉那一折后的训练集)从完整训练集 $S$ 中剔除第 $k(i)$ 折,剩下的 4 折(K=5 时)用于训练基模型。
    S∖Fk(i)\displaystyle S \setminus F_{k(i)}
  3. $\hat{y}_i^{OOF}$(折叠外预测)因为模型从未在样本 $i$ 上训练过,这个预测反映的是真实泛化能力,而不是记忆。

实战要点

想组建一支高效的智囊团,最重要的原则是顾问之间要“不一样”。如果三位顾问毕业于同一所学校、跟着同一位导师、用同一套理论框架,那么他们犯的错误也高度相似。老板听三遍差不多雷同的建议,和只听一个人没有任何区别,甚至更浪费时间。

对应到 Stacking,这就叫基模型的多样性(Diversity)。实战中可以通过多种方式制造差异:使用不同算法(逻辑回归、随机森林、梯度提升树、SVM),使用不同特征子集,甚至使用不同随机种子。差异越大,融合带来的增益越明显;如果基模型之间相关性极高,Stacking 的收益会趋近于零。很多新手堆了十个模型分数纹丝不动,原因正在于此。

元模型的选择同样有讲究。经验法则是:元模型要简单、正则化要强,比如逻辑回归或岭回归。因为 OOF 特征的样本量有限、信息密度低,用太复杂的元模型(如深层神经网络)会把噪声一并学进去,造成过拟合。此外,还可以给元模型拼入少量原始强特征,补充基模型遗漏的信息,但要严格控制维度,防止噪声混入。

请顾问要“跨界”,老板要“克制”——顾问越多元,信息越丰富;老板越冷静,越不会把噪声当信号。这两条铁律分别对应基模型的多样性与元模型的简单性,是 Stacking 实战中最核心的两个权衡。

min⁡g  1N∑i=1NL(yi,g(zi))+λ⋅Ω(g)\displaystyle \min_g \; \frac{1}{N} \sum_{i=1}^{N} \mathcal{L}\left( y_i, g(\mathbf{z}_i) \right) + \lambda \cdot \Omega(g)
这个公式刻画的是元模型的训练目标:既要让预测损失尽量小,又要通过正则项约束模型复杂度,防止它记住 OOF 特征里的噪声。
  1. $\mathcal{L}\left( y_i, g(\mathbf{z}_i) \right)$(对每个样本的预测损失)衡量元模型在第 $i$ 个样本上的融合预测与真实标签的差距,差距越小越好。
    L(yi,g(zi))\displaystyle \mathcal{L}\left( y_i, g(\mathbf{z}_i) \right)
  2. $\Omega(g)$(复杂度惩罚项)元模型自身的复杂度度量,常用 L1 或 L2 范数。它阻止模型过度拟合 OOF 特征中的偶然模式。
    Ω(g)=∥w∥22\displaystyle \Omega(g) = \| \mathbf{w} \|_2^2
  3. $\lambda$(正则化强度旋钮)控制惩罚力度。$\lambda$ 越大,元模型越保守,参数越接近零,泛化越稳健。

竞赛应用

在 Kaggle 这类数据竞赛的舞台上,选手们常形容 Stacking 是“冲榜的最后一块拼图”。当所有单模型的成绩都已逼近天花板,交叉验证分数纹丝不动时,Stacking 往往能再挤出一截提升,把银牌变金牌。

竞赛中 Stacking 的典型流程是这样的:首先分别调好各个基模型,让每个模型都达到自己的最优状态;然后用 5 折交叉验证生成各自的 OOF 特征与测试集预测;接着把 OOF 特征拼成新特征矩阵,训练元模型(常用逻辑回归);最后把各基模型对测试集的预测作为元模型输入,得到融合后的提交结果。

实际操作中有两个细节值得注意。第一,基模型的预测最好使用概率(如 predict_proba)而不是类别标签,因为概率保留了置信度信息,元模型能从中学会“谁说话更有底气”。第二,多层 Stacking 要谨慎——把第二层的输出再喂给第三层理论上可行,但过拟合风险成倍增加,绝大多数金牌方案只用到两层。

就像奥运会队医、体能师与技术教练共同支撑一位运动员,Stacking 把多种算法各自的高光时刻交给一位“总教练”统一调度。在竞争白热化的排行榜上,这零点几个百分点的提升,往往就是决定排名的关键。

Sub=g(f1test(x),f2test(x),…,fMtest(x))\displaystyle \text{Sub} = g\left( f_1^{test}(\mathbf{x}), f_2^{test}(\mathbf{x}), \ldots, f_M^{test}(\mathbf{x}) \right)
这个公式表示竞赛提交的最终答案:各基模型在测试集上的预测概率,经过元模型 $g$ 融合后产生。
  1. $f_m^{test}(\mathbf{x})$(第 m 个基模型的测试预测)基模型在测试集上的预测概率,取值范围在 0 到 1 之间,保留置信度信息。
    fmtest(x)∈[0,1]\displaystyle f_m^{test}(\mathbf{x}) \in [0,1]
  2. $g(\cdot)$(元模型的融合策略)它把 M 个测试预测概率作为输入,输出最终的提交答案。
    g:[0,1]M→R\displaystyle g: [0,1]^{M} \to \mathbb{R}
  3. $\text{Sub}$(最终提交结果)竞赛中实际提交的预测值,通常还需要根据评估指标做阈值或排序处理。

注意事项

智囊团用得好能运筹帷幄,但流程上出了纰漏也会满盘皆输。机器学习里最常见的翻车现场,就是信息泄漏——如果顾问提前偷看了答案,他给出的建议就彻底失真了。在 Stacking 中,泄漏的根源往往有三个:K 折划分不严谨导致样本重叠、数据预处理阶段提前使用了全量统计量、以及基模型过拟合导致 OOF 分数远低于训练分数。

基模型同质化是另一个隐形杀手。如果五个基模型全是不同随机种子的 XGBoost,它们的预测高度相关,Stacking 能提供的新信息几乎为零。很多人误以为“模型越多越好”,实际上冗余的模型只会增加计算成本和过拟合风险,并不会带来实质收益。相关系数高的基模型组,融合后提升往往可以忽略。

复杂度控制同样不容忽视。多轮 Stacking、海量基模型、复杂元模型,都会让方差不断累积。实战中常见的情景是:训练集分数接近满分,OOF 分数却惨不忍睹,元模型被这份“虚假的自信”带偏,最终在测试集上原形毕露。

一个诚实的智囊团,必须有一份拿得出手的“盲测成绩单”。当训练分和盲测分差距拉大时,别急着堆模型,先回头检查数据泄漏和预处理流程。治理好顾问的诚信问题,再谈融合技巧,这才是 Stacking 长期有效的根本保障。

Gap=Acctrain−AccOOF\displaystyle \text{Gap} = \text{Acc}_{\mathrm{train}} - \text{Acc}_{\mathrm{OOF}}
这个公式定义了一个过拟合诊断指标:训练集准确率与 OOF 准确率的差值。Gap 越大,说明基模型越靠“记忆”而不是“理解”。
  1. $\text{Acc}_{\mathrm{train}}$(训练集准确率)基模型在训练数据上的表现,衡量它的“记忆力”。
  2. $\text{Acc}_{\mathrm{OOF}}$(OOF 准确率)基模型在折叠外数据上的表现,衡量它的“真实水平”。
  3. $\text{Gap}$(两者的落差)差值偏大时,说明模型严重过拟合,元模型学到的是虚高的信任度。
    Gap=Acctrain−AccOOF\displaystyle \text{Gap} = \text{Acc}_{\mathrm{train}} - \text{Acc}_{\mathrm{OOF}}

AI 应用场景

Kaggle 结构化数据竞赛

阶段:模型融合与集成优化

解决的问题:单模型调参到极限后,AUC 或 RMSE 停滞不前,传统调参手段已无法突破瓶颈。Stacking 通过融合多个异构模型,在已有模型基础上榨取最后的提升空间。

具体案例:在某房价预测竞赛中,选手先用 XGBoost、LightGBM、CatBoost 各自调参,单模型交叉验证分数都在 0.45 左右,再难寸进。随后用 5 折 OOF 加逻辑回归做 Stacking,把三者的预测拼起来训练元模型,CV 分数一举降到 0.42,最终排名进入前 1%。

银行信贷违约预测

阶段:风控模型构建与升级

解决的问题:单一逻辑回归模型(便于监管解释)性能有限,直接换成黑盒模型又难以通过合规审查。Stacking 把逻辑回归放在元模型位置,既能融合多种基模型信息,又保住了最终模型的可解释性。

具体案例:某银行用随机森林、GBDT、XGBoost 三个基模型分别预测申请人违约概率,再把三个预测值作为特征输入逻辑回归元模型。最终 AUC 从 0.78 提升到 0.82,且逻辑回归的系数可以解释每个基模型的影响力权重,满足监管要求。

推荐系统点击率预估

阶段:特征工程与模型融合

解决的问题:LR(逻辑回归)擅长捕捉线性信号,GBDT 擅长捕捉非线性交互,但手工设定两者权重的方式太过粗糙。Stacking 让元模型自动学习两种模型预测结果的最优组合权重。

具体案例:某电商推荐团队将 LR 与 GBDT 的 CTR 预测概率作为新特征,训练一个带 L2 正则的逻辑回归作为元模型。上线后 AUC 提升 0.8 个百分点,并且通过元模型的权重系数,团队还反向诊断出了各基模型在不同流量时段的有效性差异。

Python 演示

python42 行
import numpy as npfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import KFold, train_test_splitfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifierfrom sklearn.svm import SVCfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score def gen_oof(model, X, y, n_splits=5):    oof = np.zeros(len(X))    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)    for tr_idx, va_idx in kf.split(X):        clf = model.__class__(**model.get_params())        clf.fit(X[tr_idx], y[tr_idx])        oof[va_idx] = clf.predict_proba(X[va_idx])[:, 1]    return oof def main():    data = load_breast_cancer()    X, y = data.data, data.target    X_train, X_test, y_train, y_test = train_test_split(        X, y, test_size=0.2, random_state=42)    models = [        RandomForestClassifier(n_estimators=100, random_state=42),        GradientBoostingClassifier(n_estimators=100, random_state=42),        SVC(kernel='rbf', probability=True, random_state=42)    ]    oof_list, test_list = [], []    for m in models:        oof_list.append(gen_oof(m, X_train, y_train))        m.fit(X_train, y_train)        test_list.append(m.predict_proba(X_test)[:, 1])    meta = LogisticRegression(max_iter=1000)    meta.fit(np.column_stack(oof_list), y_train)    pred = meta.predict(np.column_stack(test_list))    print('Stacking acc:', round(accuracy_score(y_test, pred), 4))    for i, m in enumerate(models):        acc = accuracy_score(y_test, (test_list[i] > 0.5).astype(int))        print('Base', i, 'acc:', round(acc, 4)) if __name__ == '__main__':    main()
目的:完整演示 Stacking 的标准流程——三个基模型(随机森林、梯度提升树、SVM)各自生成 OOF 预测,再由逻辑回归元模型融合,输出最终分类结果。
  1. oof[va_idx] = clf.predict_proba(X[va_idx])[:, 1]这一行是 OOF 特征生成的核心,每个样本的预测都来自“没见过它”的基模型,保证预测不含记忆成分。
  2. clf = model.__class__(**model.get_params())克隆一份全新的模型实例,避免复用已经训练好的模型,确保 K 折之间完全独立。
  3. oof_list.append(gen_oof(m, X_train, y_train))把每个基模型的 OOF 预测收集起来,组成元模型的“顾问报告集合”。
  4. m.fit(X_train, y_train)基模型在全部训练集上重新训练一遍,用来生成更稳定的测试集预测。
  5. meta.fit(np.column_stack(oof_list), y_train)元模型把三份 OOF 预测当作新特征,学习如何最优地融合它们。

常见误区

误区很多初学者以为 Stacking 和 Voting 一样,就是把各个模型的预测分数加起来除以模型个数,本质上“大家都说了算”。

正解取平均是 Blending 里最朴素的均值融合,而 Stacking 的核心在于“让元模型去学习如何组合”。元模型不仅能学到加权系数,还能捕捉各基模型之间的相关性与冲突模式,甚至发现“A 高置信时 B 通常出错”这类非线性互动。组合问题本身被变成了一个可学习的预测问题。

为何常见:从直觉上,“多个模型综合”最容易想到平均值,而且在 Bagging 里投票取平均深入人心,概念容易互相混淆。

误区不少初学者图省事,直接把基模型在训练集上的预测值作为元模型的输入,觉得“数据都是现成的,何必多此一举做交叉验证”。

正解这是数据泄漏的重灾区。基模型已经在训练集上完成拟合,它对训练集的预测“过分自信”——分数虚高且失真。元模型误以为新数据也这么好预测,实际泛化能力大幅缩水。正确做法是使用 K 折交叉验证生成的 OOF 预测,让每个样本都被“没见过它的模型”预测。

为何常见:K 折交叉要多训练 K 倍的时间,初学阶段很容易为了省事而忽略它的必要性,直到验证集分数暴跌才追悔莫及。

误区很多同学认为,既然要融合,那基模型堆得越多、元模型用越复杂的算法,效果就一定越好。

正解基模型如果高度相似,比如五个不同随机种子的 XGBoost,它们提供的增量信息几乎为零,只会白白增加训练成本。元模型过于强大同样危险——OOF 特征样本量有限、噪声不少,复杂模型会把噪声当信号,导致过拟合。实战中元模型首选逻辑回归或岭回归这类简单正则化模型。

为何常见:直觉上“更多更复杂 = 更强”是普遍思维定式,但忽略了数据量与模型复杂度之间的基本权衡。

误区看到竞赛社区的 Stacking 成功案例,很多人以为这是必涨分的银弹,一用就灵。

正解Stacking 有效的前提是基模型各自有“过人之处”,且它们犯的错误相互独立。如果基模型本身都很差、高度相关,或者元模型调参不当,Stacking 完全可能不升反降。它扮演的是“锦上添花”的角色,而不是“雪中送炭”的救世主。

为何常见:竞赛社区大量传播成功案例,失败案例很少被公开复盘,造成了“用了 Stacking 必涨分”的幸存者偏差。

面试题

Q1. Stacking 最核心的思想是什么?

单选题 · easy

  • A.把多个模型预测结果直接平均
  • B.用基模型预测作为新特征训练元模型← 正确答案
  • C.每个模型串行修正前一模型错误
  • D.随机采样训练多个相同模型

答案:B。Stacking 的本质是让元模型学习“如何组合”基模型的预测,而不是简单地平均(那是 Voting)。串行纠错是 Boosting 的做法,随机采样是同种模型的 Bagging 思路。

Q2. 在 Stacking 中,元模型的输入特征是什么?

单选题 · easy

  • A.原始数据的全部特征
  • B.基模型对样本的预测结果← 正确答案
  • C.数据的标签值本身
  • D.训练集的样本权重

答案:B。元模型接收的是基模型的预测值(最好是概率),这些预测值被拼成新特征矩阵。原始特征只用来训练第一层的基模型,标签值则是监督学习的输出而非输入。

Q3. 为什么 Stacking 要用 K 折交叉验证生成 OOF 特征?

单选题 · mid

  • A.为了加快模型的训练速度
  • B.避免基模型在训练集预测带来的信息泄漏← 正确答案
  • C.为了增加基模型的数量
  • D.为了让元模型能够处理缺失值

答案:B。基模型对训练集预测过于乐观,直接使用会造成数据泄漏,元模型学到的融合策略失真。K 折交叉确保每个样本的预测都来自“没见过它”的模型,得到诚实的 OOF 特征。

Q4. OOF(Out-of-Fold)预测的正确含义是什么?

单选题 · mid

  • A.基模型在测试集上的平均预测
  • B.每个样本被未训练过它的基模型预测← 正确答案
  • C.所有基模型预测的加权求和
  • D.K 个基模型模型的投票结果

答案:B。OOF 特指每个样本在其“所在折”未被模型训练时得到的预测。测试集预测是另一回事,加权求和是元模型的职责,投票则是 Voting 的思路。

Q5. 以下哪些做法有助于提升 Stacking 的效果?

多选题 · mid

  • A.基模型使用不同算法和特征← 正确答案
  • B.元模型使用逻辑回归等简单模型← 正确答案
  • C.基模型全部使用相同算法不同种子
  • D.给元模型拼入原始强特征← 正确答案

答案:ABD。基模型多样性是 Stacking 增益的根源,元模型保持简单可以防止过拟合,拼入强特征能补充基模型遗漏的信息。选项 C 的基模型高度同质化,融合收益趋近于零。

Q6. 关于 Stacking 的分层结构,下列说法正确的是?

单选题 · mid

  • A.基模型直接输出最终的预测答案
  • B.元模型将基模型的预测作为新特征学习← 正确答案
  • C.基模型的数量必须等于交叉验证折数
  • D.元模型只负责给基模型打分不参与训练

答案:B。基模型在 Level 0 输出预测,元模型在 Level 1 把这些预测当作新特征来学习融合策略。基模型数量与折数无关,元模型是真实参与训练的。

Q7. 下列哪些情况可能导致 Stacking 出现过拟合?

多选题 · hard

  • A.元模型采用深层神经网络← 正确答案
  • B.基模型 OOF 分数远低于训练分数← 正确答案
  • C.基模型之间相关性极低
  • D.K 折交叉验证随机种子固定不变

答案:AB。复杂元模型会把 OOF 特征里的噪声学进去,基模型过拟合则会让元模型面对虚高的预测值。相关性低是好事而非问题,随机种子固定本身不会导致过拟合。

Q8. Kaggle 竞赛中 Stacking 最常用的元模型是什么?

单选题 · easy

  • A.深度神经网络
  • B.XGBoost 决策树
  • C.逻辑回归← 正确答案
  • D.K 近邻分类器

答案:C。逻辑回归简单、正则化强、训练快,且能输出可解释的融合权重,是竞赛中元模型的默认首选。复杂模型做元模型容易过拟合小而含噪的 OOF 特征。

Q9. 训练 Stacking 时,测试集预测应当如何生成?

多选题 · hard

  • A.直接把 OOF 预测当作测试集预测
  • B.基模型在 K 折上各预测一次再取平均← 正确答案
  • C.基模型在全量训练集重新训练后预测← 正确答案
  • D.测试集不参与任何模型的拟合过程← 正确答案

答案:BCD。OOF 是对训练集的预测,不能直接当测试集预测。测试集预测可以用 K 折模型平均,或用全量数据重训模型预测,但关键是测试集绝不能参与任何模型的拟合。

Q10. 当基模型的训练准确率 0.99、OOF 准确率 0.80 时,最合理的结论是什么?

单选题 · hard

  • A.基模型泛化能力优秀
  • B.基模型严重过拟合← 正确答案
  • C.基模型数量明显不足
  • D.元模型的选择有错误

答案:B。训练分与 OOF 分相差近 0.2,说明基模型主要靠记忆而非理解。元模型会因此学到虚高的信任度,叠加上线测试集极易崩塌。优先处理过拟合,再谈融合。