模型融合策略与投票机制

一句话概述

模型融合(Model Fusion)是集成学习的最后一公里,决定如何将多个模型的输出组合成最终预测。除了经典的 Bagging 投票和 Boosting 加权,还有 Averaging(平均)、Weighted Averaging(加权平均)、Rank Averaging(排序平均)、Blending(混合)等多种策略。选择合适的融合策略往往比单个模型的微调更能提升性能,是 Kaggle 竞赛中决定金牌和银牌的关键差异。

💡 核心要点:① 投票机制(硬投票 vs 软投票)是分类任务中最基础的融合策略 ② 加权平均是最通用的融合方法,权重可通过交叉验证或优化确定 ③ Stacking 和 Blending 通过元学习器实现智能融合,是最强大的融合策略 ④ 多模型融合的本质是降低单模型的「知识盲区」,让不同模型互补

教学与演示

一、硬投票与软投票

是什么:硬投票(Hard Voting)是指每个模型输出一个类别标签,最终取多数票。软投票(Soft Voting)是指每个模型输出每个类别的概率,对概率取平均后选择概率最高的类别。软投票通常比硬投票效果更好,因为它利用了概率中的置信度信息。

大白话 硬投票就像「举手表决」——每人只能投一票,少数服从多数。软投票就像「信心打分」——每人给每个选项打分(0-100 分),最后总分最高的选项获胜。显然后者更精细,因为它考虑了每个人的「把握程度」。

为什么:软投票之所以优于硬投票,是因为它利用了概率信息。假设模型 A 以 99% 概率预测「猫」、1% 概率预测「狗」,模型 B 以 51% 概率预测「狗」、49% 概率预测「猫」。硬投票下 A 投猫、B 投狗,平票;软投票下猫的平均概率为 (99%+49%)/2=74%,狗为 26%,猫胜出。这更合理,因为 A 对猫的判断非常自信,而 B 对狗的判断并不自信。

怎么做

import numpy as np

# ========== 演示硬投票与软投票的区别 ==========
np.random.seed(42)

def voting_comparison_demo():
    """对比硬投票和软投票的差异"""
    # 模拟 3 个分类器对 5 个样本的预测
    n_samples = 5
    n_classes = 3  # 三个类别:0, 1, 2
    n_models = 3  # 三个模型
    
    print("=== 硬投票 vs 软投票 ===")
    print()
    
    # 每个模型的预测标签(硬投票用)
    hard_preds = np.array([
        [0, 1, 0, 2, 1],  # 模型1的预测
        [0, 2, 0, 2, 1],  # 模型2的预测
        [1, 1, 0, 2, 2],  # 模型3的预测
    ])
    
    # 每个模型的预测概率(软投票用)
    # 形状: (n_models, n_samples, n_classes)
    soft_preds = np.array([
        # 模型1: 对各类别的概率预测
        [[0.8, 0.1, 0.1],  # 样本0: 80%概率是类别0
         [0.3, 0.6, 0.1],  # 样本1: 60%概率是类别1
         [0.7, 0.2, 0.1],  # 样本2
         [0.1, 0.1, 0.8],  # 样本3
         [0.2, 0.7, 0.1]], # 样本4
        # 模型2
        [[0.9, 0.05, 0.05],
         [0.1, 0.2, 0.7],
         [0.6, 0.3, 0.1],
         [0.05, 0.05, 0.9],
         [0.3, 0.6, 0.1]],
        # 模型3
        [[0.4, 0.5, 0.1],
         [0.2, 0.7, 0.1],
         [0.8, 0.1, 0.1],
         [0.1, 0.2, 0.7],
         [0.1, 0.3, 0.6]],
    ])
    
    # 硬投票:对每个样本,取多数模型预测的类别
    hard_vote = np.zeros(n_samples, dtype=int)
    for i in range(n_samples):
        # 统计每个类别的票数
        votes = np.bincount(hard_preds[:, i], minlength=n_classes)
        hard_vote[i] = np.argmax(votes)  # 多数票的类别
    
    # 软投票:对每个样本,取平均概率最高的类别
    soft_vote = np.zeros(n_samples, dtype=int)
    for i in range(n_samples):
        # 三个模型对该样本的概率取平均
        avg_prob = soft_preds[:, i, :].mean(axis=0)
        soft_vote[i] = np.argmax(avg_prob)
    
    print("样本  | 模型1 | 模型2 | 模型3 | 硬投票 | 软投票")
    print("-" * 55)
    for i in range(n_samples):
        m1 = hard_preds[0, i]
        m2 = hard_preds[1, i]
        m3 = hard_preds[2, i]
        print(f"样本{i}  |   {m1}   |   {m2}   |   {m3}   |    {hard_vote[i]}    |    {soft_vote[i]}")
    
    print()
    print("关键观察:")
    # 找出硬投票和软投票结果不同的样本
    diff = np.where(hard_vote != soft_vote)[0]
    if len(diff) > 0:
        print(f"样本 {diff} 的硬投票和软投票结果不同!")
        print("这是因为软投票考虑了概率置信度,而非仅看票数")
    
    print("\n硬投票缺点:")
    print("  - 忽略了模型对预测的置信度")
    print("  - 高置信度和低置信度的预测被同等对待")
    print("  - 平票时不知道如何处理")
    print("\n软投票优点:")
    print("  - 利用概率信息,更精细")
    print("  - 高置信度预测有更大影响力")
    print("  - 自然处理平票情况")

voting_comparison_demo()
\text{软投票的概率平均公式}\(P(y = k | x) = \frac{1}{M} \sum_{m=1}^{M} P_m(y = k | x)\)
大白话 软投票就是「信心加权平均」——每个模型不光告诉你选哪个,还告诉你有多大把握,最后综合所有人的信心打分来做决定。这比简单数人头要靠谱得多。

二、加权平均融合

是什么:加权平均(Weighted Averaging)是回归任务和概率输出中最常用的融合策略。它给每个模型分配一个权重 w_m,最终预测为 Σ w_m·f_m(x)。权重的确定方式有多种:基于验证集性能的启发式权重、基于最小化验证集误差的优化权重、以及基于排序的 Rank Averaging。

大白话 加权平均就像组建一个「投资组合」——不是平均分配资金,而是给表现好的基金经理更多的钱,给表现差的少一些。问题在于:怎么确定这些权重?

为什么:如果所有模型性能相同且独立,简单平均就是最优的。但现实中各模型性能差异很大,给好模型更高权重能提升集成效果。关键挑战在于权重的确定——如果使用训练集来确定权重,会导致过拟合(因为好模型在训练集上表现好,但可能过拟合)。正确做法是使用验证集(Hold-out 或 Cross-Validation)来确定权重。

怎么做

import numpy as np

# ========== 演示加权平均的权重确定方法 ==========
np.random.seed(42)

def weighted_averaging_demo():
    """演示多种加权平均的权重确定策略"""
    print("=== 加权平均融合策略 ===")
    
    # 模拟 5 个模型在验证集上的预测误差
    n_models = 5
    # 模型在验证集上的 MSE(越小越好)
    val_errors = np.array([0.12, 0.15, 0.10, 0.18, 0.13])
    # 模型之间的预测相关性矩阵(简化)
    # 相关性越高,简单平均越好;相关性越低,加权平均越有优势
    
    print("模型验证集误差 (MSE):", val_errors)
    print()
    
    # 方法1:等权重(简单平均)
    w_equal = np.ones(n_models) / n_models
    print(f"方法1 - 等权重: {w_equal}")
    print("  优点: 简单,不需要额外计算")
    print("  适用: 各模型性能相近时")
    
    # 方法2:基于误差的启发式权重
    # w_i ∝ 1/error_i(误差越小,权重越大)
    w_error = 1 / val_errors
    w_error /= w_error.sum()  # 归一化
    print(f"\n方法2 - 基于误差: {np.round(w_error, 3)}")
    print("  公式: w_i = (1/error_i) / Σ(1/error_j)")
    print("  优点: 简单直观,给好模型更高权重")
    print("  缺点: 忽略了模型之间的相关性")
    
    # 方法3:基于排名的权重(Rank Averaging)
    # 按误差排名,排名越靠前权重越大
    ranks = np.argsort(val_errors)  # 按误差升序排列
    rank_weights = np.zeros(n_models)
    for i, r in enumerate(ranks):
        rank_weights[r] = n_models - i  # 排名第1得最高分
    rank_weights = rank_weights / rank_weights.sum()
    print(f"\n方法3 - 基于排名: {np.round(rank_weights, 3)}")
    print("  优点: 对异常误差值不敏感,更稳健")
    print("  适用: 验证集误差估计不准确时")
    
    # 方法4:基于验证集性能最优化的权重
    # 使用优化算法(如 Nelder-Mead)在验证集上最小化集成误差
    # 约束:权重非负,和为1
    print(f"\n方法4 - 优化权重:")
    print("  在验证集上直接优化 w 使集成误差最小")
    print("  min Σ L(y_i, Σ w_m * f_m(x_i))")
    print("  s.t. w_m ≥ 0, Σ w_m = 1")
    print("  优点: 理论上最优")
    print("  缺点: 容易过拟合验证集,需要交叉验证")
    
    # 演示:模拟不同权重组合的集成误差
    print("\n=== 不同权重策略的模拟效果 ===")
    # 模拟 100 个测试样本的预测误差
    np.random.seed(0)
    n_test = 100
    # 各模型的预测误差(模拟:模型3最好,模型4最差)
    model_preds = np.zeros((n_models, n_test))
    for i, err in enumerate(val_errors):
        model_preds[i] = np.random.randn(n_test) * np.sqrt(err)
    
    # 真实值设为0(简化)
    y_true = np.zeros(n_test)
    
    # 计算各策略的集成误差
    strategies = {
        '等权重': w_equal,
        '基于误差': w_error,
        '基于排名': rank_weights,
    }
    for name, weights in strategies.items():
        ensemble_pred = np.dot(weights, model_preds)  # 加权和
        ensemble_mse = np.mean((ensemble_pred - y_true) ** 2)
        print(f"  {name}: 集成 MSE = {ensemble_mse:.4f}")

weighted_averaging_demo()
\text{加权平均的优化问题}\(\min_{w} \sum_{i=1}^{n} L\left(y_i, \sum_{m=1}^{M} w_m f_m(x_i)\right), \quad \text{s.t. } w_m \geq 0, \sum_{m=1}^{M} w_m = 1\)
大白话 确定权重就像给团队成员分配奖金——不能只看个人业绩(验证集误差),还要看他们之间的协作效果(相关性)。有时候两个业绩中等但互补的人组合,比一个明星加一个拖后腿的效果更好。

三、Blending 与 Stacking 的区别

是什么:Blending 和 Stacking 都是使用元学习器的融合方法,但数据划分方式不同。Blending 将训练集分为两部分:一部分训练基学习器,另一部分用于生成元特征;Stacking 使用 K 折交叉验证,每个样本的元特征由未包含该样本的折训练出的模型生成。Stacking 数据利用率更高,Blending 更简单但更可能导致过拟合。

大白话 Blending 是「简单粗暴」的做法——一刀切,前面 80% 训练基模型,后面 20% 用来训练融合模型。Stacking 更「精细」——用 K 折交叉验证,每个样本都当过「验证集」,信息利用率更高。

为什么:Blending 中元学习器只在 20% 的数据上训练,数据量少但实现简单,适合快速实验。Stacking 用 K 折 CV 生成元特征,每个样本都有对应元特征,数据利用率 100%,但实现复杂、计算量大。在 Kaggle 竞赛中,Stacking 通常比 Blending 效果好(因为数据利用率高),但 Blending 更安全(因为数据划分清晰,不容易泄露)。

怎么做

import numpy as np

# ========== 演示 Blending 与 Stacking 的数据划分差异 ==========
def blending_vs_stacking_demo():
    """对比 Blending 和 Stacking 的数据使用方式"""
    n_samples = 100
    print(f"总样本数: {n_samples}")
    print()
    
    # ===== Blending =====
    print("=== Blending(混合)===")
    print("数据划分: 训练集(80%) + Hold-out集(20%)")
    print("步骤:")
    print("  1. 在训练集(80%)上训练 M 个基模型")
    print("  2. 用基模型预测 Hold-out 集(20%),得到元特征")
    print("  3. 在元特征上训练元学习器")
    print("  4. 预测时:基模型预测 → 元学习器融合")
    print()
    train_size = int(n_samples * 0.8)
    holdout_size = n_samples - train_size
    print(f"  基模型训练数据: {train_size} 个样本")
    print(f"  元学习器训练数据: {holdout_size} 个样本")
    print(f"  数据利用率: {holdout_size/n_samples:.0%}")
    print("  优点: 实现简单,代码少")
    print("  缺点: 元学习器训练数据少,可能过拟合")
    
    # ===== Stacking =====
    print("\n=== Stacking(堆叠泛化)===")
    print("数据划分: K折交叉验证")
    K = 5
    fold_size = n_samples // K
    print(f"K={K} 折,每折 {fold_size} 个样本")
    print("步骤:")
    print("  1. 对每个基模型,K折交叉验证")
    print("  2. 每折:用 K-1 折训练,预测剩下 1 折")
    print("  3. 所有折的预测拼起来 = 完整的元特征")
    print("  4. 在完整元特征上训练元学习器")
    print()
    print(f"  基模型训练数据: 每折 {n_samples - fold_size} 个样本")
    print(f"  元学习器训练数据: {n_samples} 个样本(全部)")
    print(f"  数据利用率: 100%")
    print("  优点: 数据利用率高,元特征无偏")
    print("  缺点: 训练时间长(K × M 次模型训练)")
    
    # ===== 对比总结 =====
    print("\n=== 对比总结 ===")
    print("            Blending          Stacking")
    print("数据划分     简单二分割        K折交叉验证")
    print("数据利用率   约20%            100%")
    print("训练时间     快               慢(K倍)")
    print("过拟合风险   较高              较低")
    print("代码复杂度   低               高")
    print("适用场景     快速实验          最终提交")

blending_vs_stacking_demo()
大白话 Blending 和 Stacking 就像一个是用「预考」成绩来决定总成绩,另一个是用「平时多次考试」的成绩来决定——显然后者更全面、更公平,但前者省事。

四、模型融合的实战策略

是什么:在实际竞赛或工业项目中,有效的模型融合策略通常遵循以下原则:① 多样性优先——融合的模型应尽可能「不同」(不同算法、不同特征、不同超参数),② 分层融合——先融合同类型模型,再融合不同类型模型,③ 概率校准——在融合前对各模型进行概率校准(如 Platt Scaling 或 Isotonic Regression),确保概率估计的可靠性。

大白话 好的模型融合就像组建一支「梦之队」——不是找 5 个相同风格的球员,而是找一个射手、一个中锋、一个控球后卫... 不同风格的互补才能打遍天下无敌手。

为什么:融合效果取决于模型之间的「多样性」和「互补性」。如果两个模型在所有样本上犯同样的错误,融合不会有任何提升。因此,构建多样性是融合成功的关键。方法包括:使用不同算法类型(树模型 + 线性模型 + 神经网络)、使用不同特征子集(每个模型只看部分特征)、使用不同超参数(不同深度、不同学习率)、使用不同数据子集(不同折、不同采样)。

怎么做

import numpy as np

# ========== 演示模型多样性的重要性 ==========
def model_diversity_demo():
    """演示模型多样性对融合效果的影響"""
    print("=== 模型多样性的重要性 ===")
    np.random.seed(0)
    
    n_samples = 100
    # 场景1:两个高度相关的模型
    print("场景1:两个高度相关的模型(ρ ≈ 0.9)")
    corr = 0.9
    # 生成两个高度相关的预测误差
    mean = [0, 0]
    cov = [[1, corr], [corr, 1]]
    errors = np.random.multivariate_normal(mean, cov, n_samples)
    m1_err = errors[:, 0]  # 模型1的误差
    m2_err = errors[:, 1]  # 模型2的误差
    
    # 单个模型平均误差
    single_mse = (np.var(m1_err) + np.var(m2_err)) / 2
    # 集成后平均误差(简单平均)
    ensemble_err = (m1_err + m2_err) / 2
    ensemble_mse = np.var(ensemble_err)
    print(f"  单模型平均 MSE: {single_mse:.3f}")
    print(f"  集成后 MSE:       {ensemble_mse:.3f}")
    print(f"  提升幅度:         {(single_mse - ensemble_mse) / single_mse * 100:.1f}%")
    
    # 场景2:两个低相关的模型
    print("\n场景2:两个低相关的模型(ρ ≈ 0.1)")
    corr = 0.1
    cov = [[1, corr], [corr, 1]]
    errors = np.random.multivariate_normal(mean, cov, n_samples)
    m1_err = errors[:, 0]
    m2_err = errors[:, 1]
    
    single_mse = (np.var(m1_err) + np.var(m2_err)) / 2
    ensemble_err = (m1_err + m2_err) / 2
    ensemble_mse = np.var(ensemble_err)
    print(f"  单模型平均 MSE: {single_mse:.3f}")
    print(f"  集成后 MSE:       {ensemble_mse:.3f}")
    print(f"  提升幅度:         {(single_mse - ensemble_mse) / single_mse * 100:.1f}%")
    
    print("\n结论:模型之间相关性越低,集成效果越好!")
    print("这解释了为什么多样性是融合成功的关键")
    
    # ===== 构建多样性的方法 =====
    print("\n=== 构建模型多样性的方法 ===")
    methods = [
        ("不同算法", "决策树 + 逻辑回归 + SVM + 神经网络"),
        ("不同特征", "原始特征 / PCA特征 / 交互特征"),
        ("不同超参数", "浅树 + 深树 / 大学习率 + 小学习率"),
        ("不同数据", "不同 Bootstrap 采样 / 不同折训练"),
        ("不同目标", "直接预测 / 预测残差 / 预测分位数"),
    ]
    for method, example in methods:
        print(f"  {method:<12}: {example}")

model_diversity_demo()

# ===== 概率校准的重要性 =====
print("\n=== 概率校准 ===")
print("问题:许多模型的概率输出不是真实概率")
print("  - SVM 的输出分数范围与概率无关")
print("  - 决策树的概率估计偏向0和1")
print("  - 神经网络的 Softmax 输出可能过于自信")
print()
print("解决方法:")
print("  1. Platt Scaling: 用逻辑回归将模型输出映射到概率")
print("     P(y=1|x) = 1 / (1 + exp(A·f(x) + B))")
print("  2. Isotonic Regression: 非参数保序回归")
print("     更灵活但需要更多校准数据")
print()
print("校准后,软投票的融合效果通常显著提升")
大白话 模型融合的秘诀就一句话:找一群「不同」的朋友,而不是一群「翻版」的自己。树模型擅长分段决策,线性模型擅长捕捉全局趋势,神经网络擅长拟合复杂模式——把它们组合起来,就能覆盖彼此的盲区。

什么用:在 Kaggle 竞赛中,几乎所有的冠军方案都使用了精心设计的模型融合策略。典型的多层融合 pipeline 包括:第一层融合同类型模型(如多个 XGBoost 变体),第二层融合不同类型模型(XGBoost + LightGBM + CatBoost),第三层用 Stacking 或加权平均做最终融合。在工业界,推荐系统的多路召回融合、金融风控的多模型评分卡融合也是同样的思想。

哪些坑:融合不是「越多越好」——增加一个与现有模型高度相关的新模型,几乎不会提升效果,只会增加复杂度。权重确定在验证集上做,容易过拟合验证集而不可泛化。概率校准需要额外的校准数据集,不能直接使用训练数据。

概念关系图谱

融合策略输入输出复杂度适用场景
硬投票类别标签多数类别分类,快速实验
软投票类别概率最高概率类别分类,性能优先
简单平均数值/概率平均值回归,模型性能相近
加权平均数值/概率加权和回归,模型性能差异大
Blending模型预测元学习器输出中高快速实验
Stacking模型预测元学习器输出最终提交

重点答疑

Q1: 硬投票和软投票哪个更好?什么时候用哪个?

软投票通常更好,因为它利用了概率的置信度信息。但硬投票有其适用场景:① 当某些模型不支持概率输出时(如 SVM 默认不输出概率),② 当概率估计不可靠时(如模型未校准),③ 当需要最快最简单的融合时。在实践中,如果模型支持概率输出,应当先做概率校准再进行软投票。

Q2: 模型融合的权重应该在什么数据上确定?

绝对不能在训练集上确定权重(会导致严重过拟合),应该在验证集(Hold-out 或 Cross-Validation)上确定。如果使用 Stacking,元学习器的训练数据来自交叉验证生成的元特征,这已经是无偏的。如果使用简单的加权平均,建议用交叉验证来估计各模型的泛化性能,据此确定权重。

Q3: 融合的模型是不是越多越好?

不是。模型融合存在边际收益递减:前 2-3 个多样性高的模型带来的提升最大,之后每增加一个模型,提升越来越小,但计算成本线性增长。更重要的是模型的多样性而非数量——5 个高度多样化的模型比 20 个高度雷同的模型效果好得多。在 Kaggle 竞赛中,Top 方案通常融合 3-7 个精心挑选的模型。

章节单词汇总

英文音标术语/释义
Hard Voting/hɑːrd ˈvoʊtɪŋ/硬投票;每个模型投一票,取多数
Soft Voting/sɔːft ˈvoʊtɪŋ/软投票;基于概率平均的投票
Blending/ˈblendɪŋ/混合;用 Hold-out 集生成元特征
Weighted Averaging/ˈweɪtɪd ˈævərɪdʒɪŋ/加权平均;给不同模型分配不同权重
Rank Averaging/ræŋk ˈævərɪdʒɪŋ/排序平均;基于排名确定权重
Probability Calibration/ˌprɑːbəˈbɪləti ˌkælɪˈbreɪʃən/概率校准;使模型输出匹配真实概率
Platt Scaling/plæt ˈskeɪlɪŋ/Platt 缩放;用逻辑回归校准概率
Diversity/daɪˈvɜːrsəti/多样性;模型之间的差异程度

面试练习

Q1 [单选] 软投票与硬投票的主要区别是什么?

  • A. 软投票更快
  • B. 软投票使用概率,硬投票只使用类别标签
  • C. 软投票只能用两个模型,硬投票可以用多个
  • D. 软投票是 Boosting 方法,硬投票是 Bagging 方法
解答:软投票使用各模型输出的类别概率取平均,硬投票只使用各模型输出的类别标签进行多数投票。软投票利用了概率中的置信度信息,通常效果更好。

Q2 [单选] Blending 与 Stacking 的关键区别是什么?

  • A. Blending 使用交叉验证,Stacking 不使用
  • B. Blending 用简单 Hold-out 划分,Stacking 用 K 折交叉验证
  • C. Blending 不需要元学习器,Stacking 需要
  • D. Blending 只能用于分类,Stacking 只能用于回归
解答:Blending 将训练集简单分为两部分(如 80%/20%),Stacking 使用 K 折交叉验证生成元特征。Stacking 数据利用率更高,但复杂度也更高。

Q3 [多选] 以下哪些方法可以增加模型融合的多样性?

  • A. 使用不同类型的算法(决策树 + 逻辑回归 + SVM)
  • B. 使用不同的特征子集
  • C. 使用不同的超参数设置
  • D. 使用完全相同的训练数据
解答:增加多样性是融合成功的关键。使用不同算法、不同特征、不同超参数都能增加模型之间的差异。使用相同数据训练的相同模型不会有任何多样性。

Q4 [单选] 在加权平均融合中,确定权重时应该使用什么数据?

  • A. 训练集(Training Set)
  • B. 验证集(Validation Set)
  • C. 测试集(Test Set)
  • D. 任何数据都可以
解答:权重必须在验证集上确定,不能在训练集上(会过拟合),也不能在测试集上(会信息泄露,导致对测试集过拟合的乐观估计)。

Q5 [单选] 两个模型的相关性(ρ)对融合效果有什么影响?

  • A. 相关性越高,融合效果越好
  • B. 相关性越低,融合效果越好
  • C. 相关性不影响融合效果
  • D. 相关性必须为 0 才能融合
解答:模型相关性越低,它们的错误模式越独立,融合后方差降低越多。如果两个模型高度相关(ρ→1),融合几乎不会带来提升。

Q6 [多选] 以下哪些是概率校准的常用方法?

  • A. Platt Scaling(Platt 缩放)
  • B. Isotonic Regression(保序回归)
  • C. One-Hot Encoding
  • D. Z-score Normalization
解答:Platt Scaling 和 Isotonic Regression 是概率校准的两种主要方法。One-Hot 和 Z-score 是特征预处理方法,不是概率校准。

Q7 [单选] 在模型融合中,为什么需要进行概率校准?

  • A. 为了加快模型训练速度
  • B. 因为许多模型的输出不是真实概率,直接融合会降低效果
  • C. 为了减少模型数量
  • D. 为了将分类问题转化为回归问题
解答:许多模型(如 SVM、决策树、神经网络)的输出不是真实概率估计——可能过于自信(概率接近 0 或 1)或不可靠。概率校准使输出更接近真实概率,软投票融合时效果更好。

Q8 [单选] 关于 Rank Averaging,以下说法正确的是?

  • A. 它给所有模型相同的权重
  • B. 它基于模型在验证集上的排名来确定权重,对异常值更稳健
  • C. 它需要训练一个元学习器
  • D. 它只能用于二分类任务
解答:Rank Averaging 根据模型在验证集上的性能排名来分配权重(排名越靠前权重越大),而不是直接使用误差值。这使得它对个别模型的异常验证误差不敏感,更加稳健。

Q9 [多选] 以下哪些是模型融合的常见策略?

  • A. 简单平均(Simple Averaging)
  • B. 加权平均(Weighted Averaging)
  • C. 排序平均(Rank Averaging)
  • D. Stacking(堆叠泛化)
解答:这四种都是模型融合的常见策略,从简单到复杂依次为:简单平均 → 加权平均 → 排序平均 → Stacking。

Q10 [单选] 模型融合的「边际收益递减」是指什么?

  • A. 融合的模型越多,训练越快
  • B. 前几个模型带来的提升最大,之后每增加一个模型提升越来越小
  • C. 融合后的模型比单个模型更差
  • D. 融合后模型精度会随时间下降
解答:模型融合存在边际收益递减:前 2-3 个多样化的模型带来显著提升,但之后每增加一个模型,额外提升越来越小,而计算成本线性增长。因此融合不是越多越好。