假设检验与置信区间
一句话概述
假设检验和置信区间是统计推断的两大核心工具——前者用来判断"数据是否支持某个假设",后者用来量化"估计值有多精确"。在 AI 中,A/B 测试决定新模型是否优于旧模型,置信区间衡量模型性能的可靠性,p 值帮助我们判断实验结果的显著性。
💡 核心要点:①假设检验是"反证法"——先假设原假设 H₀ 为真,再看数据是否与 H₀ 矛盾,矛盾则拒绝 H₀ ②p 值是"在原假设为真时,观察到当前或更极端结果的概率"——p 值越小,拒绝 H₀ 的证据越强 ③置信区间是对参数估计的不确定性量化——95% 置信区间意味着如果重复实验 100 次,约 95 次区间会包含真实参数 ④在 AI 中,A/B 测试、模型比较、超参数选择、特征重要性评估都依赖假设检验与置信区间
教学与演示
一、假设检验——判断"假设"是否成立
是什么(定义):假设检验(Hypothesis Testing)是一种统计决策方法。设定原假设 H₀(如"新模型与旧模型效果相同")和备择假设 H₁(如"新模型效果更好"),基于样本数据决定是否拒绝 H₀。核心步骤:①设立假设 → ②选择检验统计量 → ③确定显著性水平 α → ④计算 p 值或比较临界值 → ⑤做出决策。
大白话 假设检验就像法庭审判——你先假设被告"无罪"(H₀),然后看证据是否足够"推翻"这个假设。如果证据非常有力(p 值很小),就判"有罪"(拒绝 H₀)。如果证据不够有力,只能说"证据不足"(不能拒绝 H₀),但不能说"被告无罪"(不能证明 H₀ 为真)。
为什么(原理):假设检验基于"小概率事件原理"——如果原假设为真,那么出现极端情况的概率应该很小。如果极端情况确实发生了,就有理由怀疑原假设。显著性水平 α(通常 0.05)是预先设定的"可容忍错误拒绝 H₀ 的概率"。第一类错误(Type I Error)是 H₀ 为真时拒绝 H₀,概率 = α;第二类错误(Type II Error)是 H₁ 为真时未拒绝 H₀,概率 = β。
怎么做(实现):
import numpy as np
# 场景:比较两种网页设计的转化率,做假设检验
np.random.seed(42) # 固定种子
# 假设:设计A(旧)转化率=10%,设计B(新)转化率=12%
n_A, n_B = 1000, 1000 # 各1000个用户
p_A, p_B = 0.10, 0.12 # 真实转化率
# 模拟A/B测试数据
conversions_A = np.random.binomial(1, p_A, n_A) # 设计A的转化结果
conversions_B = np.random.binomial(1, p_B, n_B) # 设计B的转化结果
rate_A = np.mean(conversions_A) # 设计A转化率
rate_B = np.mean(conversions_B) # 设计B转化率
print(f"设计A转化率: {rate_A:.4f}") # 约10%
print(f"设计B转化率: {rate_B:.4f}") # 约12%
print(f"差异: {rate_B - rate_A:.4f}") # 约2%
# Z检验:检验两个比例的差异是否显著
# H₀: p_A = p_B, H₁: p_A ≠ p_B
pooled_rate = (np.sum(conversions_A) + np.sum(conversions_B)) / (n_A + n_B) # 合并转化率
# 标准误
se = np.sqrt(pooled_rate * (1 - pooled_rate) * (1/n_A + 1/n_B)) # 标准误
z_stat = (rate_B - rate_A) / se # Z统计量
# 双尾检验的p值(用正态近似)
from math import erf, sqrt
def norm_cdf(x):
return 0.5 * (1 + erf(x / sqrt(2))) # 正态CDF近似
p_value = 2 * (1 - norm_cdf(abs(z_stat))) # 双尾p值
print(f"\nZ统计量: {z_stat:.4f}") # Z值
print(f"p值: {p_value:.4f}") # p值
alpha = 0.05 # 显著性水平
if p_value < alpha:
print(f"p值({p_value:.4f}) < α({alpha}),拒绝H₀,两种设计有显著差异") # 拒绝H₀
else:
print(f"p值({p_value:.4f}) ≥ α({alpha}),不能拒绝H₀") # 不能拒绝H₀
什么用(应用):AI 中最常见的应用是 A/B 测试——比较新模型 vs 旧模型、新特征 vs 旧特征时,用假设检验判断性能提升是否"统计显著"而非随机波动。在特征选择中,用 t 检验判断特征在不同类别间的均值是否有显著差异。在异常检测中,检验观测值是否显著偏离正常模式。
哪些坑(缺点):p 值被广泛误解和滥用——p 值不是"原假设为真的概率",也不是"效应大小的度量"。p 值小于 0.05 不代表"结果很重要",只代表"不太可能是随机波动"。p-hacking(通过多次检验、数据筛选等操作人为制造 p<0.05)是严重的科研诚信问题。建议同时报告效应大小(effect size)和置信区间。
二、p 值——拒绝原假设的"底气"
是什么(定义):p 值(p-value)是在原假设 H₀ 为真的前提下,观察到当前统计量或更极端结果的概率。p 值越小,数据与 H₀ 的矛盾越大,拒绝 H₀ 的证据越强。
大白话 p 值就像"如果对方说的是真的,你看到现在这个结果的概率有多大"。如果这个概率非常小(比如 p=0.001),你会觉得"如果对方说的是真的,我怎么可能看到这么离谱的结果?"——于是你倾向于认为对方在说谎(拒绝 H₀)。但如果 p=0.3,你会觉得"这个结果在对方说真话的情况下并不罕见"——于是你不能判断对方说谎。
为什么(原理):p 值的计算依赖于检验统计量的分布。对于 Z 检验,p = 2·P(Z > |z_obs|)(双尾)。对于 t 检验,p = 2·P(T > |t_obs|)(双尾,自由度 n-1)。p 值不是"H₀ 为真的概率"——那是贝叶斯后验概率,需要先验才能计算。p 值是在 H₀ 为真的条件下数据的概率,方向完全相反。
怎么做(实现):
import numpy as np
# 演示 p 值的含义
np.random.seed(42) # 固定种子
# 场景:检验一枚硬币是否公平(H₀: p=0.5)
def coin_toss_experiment(n_tosses, true_p=0.5):
"""模拟抛硬币实验,返回正面的次数和比例"""
tosses = np.random.binomial(1, true_p, n_tosses) # 抛硬币
n_heads = np.sum(tosses) # 正面次数
return n_heads, n_heads / n_tosses # 返回次数和比例
# 实验1:抛10次,得到8次正面
n1, rate1 = coin_toss_experiment(10, true_p=0.5) # 公平硬币抛10次
print(f"实验1: 抛10次,{n1}次正面({rate1:.0%})") # 如果H₀为真,这不太可能
# 计算p值:二项分布 Binomial(10, 0.5) 下,≥8次正面或≤2次正面的概率
from math import comb
p_val_1 = 2 * sum(comb(10, k) * (0.5**10) for k in range(n1, 11)) # 双尾p值
print(f"p值 = {p_val_1:.4f}") # 约0.109(双尾)—— 在α=0.05下不显著!
# 实验2:抛100次,得到60次正面
n2, rate2 = coin_toss_experiment(100, true_p=0.5) # 公平硬币抛100次
print(f"\n实验2: 抛100次,{n2}次正面({rate2:.0%})") # 60%正面
# 使用正态近似计算p值
z_stat_2 = (rate2 - 0.5) / np.sqrt(0.5 * 0.5 / 100) # Z统计量
from math import erf, sqrt
p_val_2 = 2 * (1 - 0.5 * (1 + erf(abs(z_stat_2) / sqrt(2)))) # 双尾p值
print(f"p值 = {p_val_2:.4f}") # 约0.046 —— 在α=0.05下显著!
# 关键区别:同样的比例差距(60%),n=100时显著,n=10时不显著
print(f"\n关键洞察:")
print(f"比例相同({rate1:.0%} vs {rate2:.0%}),但") # 比例相同
print(f"样本量越大,同样的比例差异越容易达到统计显著") # 样本量影响
print("这就是为什么大样本下即使微小差异也可能'显著'——需要结合效应大小判断")
什么用(应用):在模型比较中,用 McNemar 检验或配对 t 检验比较两个模型的性能差异是否显著。在特征选择中,用 ANOVA F 检验判断特征是否与目标变量显著相关。在超参数调优中,用 Friedman 检验比较多个配置的排名是否显著不同。
哪些坑(缺点):p 值的最常见误解包括:①p<0.05 不代表"结果很重要"(效应可能很小但统计显著);②p>0.05 不代表"H₀ 为真"(只能说"证据不足");③p 值不能比较——p=0.01 不比 p=0.04 意味着"更显著"(p 值本身不是效应大小的度量);④多重比较问题——做 20 次检验,就算 H₀ 全为真,也大约有 1 次会 p<0.05(纯随机)。解决方案:Bonferroni 校正、FDR 控制。
三、置信区间——估计值的"误差条"
是什么(定义):置信区间(Confidence Interval, CI)是对参数估计的不确定性量化。95% CI 意味着:如果重复实验无数次,每次构造一个 CI,约 95% 的 CI 会包含真实参数值。公式:CI = 点估计 ± 临界值 × 标准误。
大白话 你估计模型准确率是 85%,但这个 85% 有多准?95% 置信区间可能是 [83%, 87%],意思是"真实准确率有 95% 的把握落在这个区间内"(更准确的说法是:这个区间有 95% 的概率包含了真实值)。区间越窄,估计越精确;样本量越大,区间越窄。
为什么(原理):置信区间基于中心极限定理——样本均值近似正态分布。对于均值,95% CI = X̄ ± 1.96 × σ/√n。对于比例,95% CI = p̂ ± 1.96 × √(p̂(1-p̂)/n)。CI 的宽度由三个因素决定:①置信水平(越高越宽);②样本量(越大越窄,∝ 1/√n);③数据变异程度(方差越大越宽)。
怎么做(实现):
import numpy as np
# 演示置信区间:模型准确率的95% CI
np.random.seed(42) # 固定种子
# 模拟模型在测试集上的表现
true_accuracy = 0.85 # 真实准确率
test_sizes = [50, 100, 200, 500, 1000, 5000] # 不同测试集大小
print("不同测试集大小下的准确率估计和95%置信区间:")
for n in test_sizes:
# 模拟一次测试
correct = np.random.binomial(n, true_accuracy) # 正确预测次数
est_acc = correct / n # 估计准确率
# 计算95% CI:p̂ ± 1.96 × √(p̂(1-p̂)/n)
se = np.sqrt(est_acc * (1 - est_acc) / n) # 标准误
ci_lower = est_acc - 1.96 * se # 置信区间下界
ci_upper = est_acc + 1.96 * se # 置信区间上界
contains_true = ci_lower <= true_accuracy <= ci_upper # 是否包含真实值
print(f"n={n:5d}: 准确率={est_acc:.4f}, 95%CI=[{ci_lower:.4f}, {ci_upper:.4f}], "
f"宽度={ci_upper-ci_lower:.4f}, 包含真实值={contains_true}") # CI宽度随n增大而减小
# 验证:多次重复实验,检查CI覆盖率
n_trials = 1000 # 重复1000次
n_test = 200 # 测试集大小
coverage_count = 0 # CI包含真实值的次数
for _ in range(n_trials):
correct = np.random.binomial(n_test, true_accuracy) # 每次模拟
est_acc = correct / n_test # 估计准确率
se = np.sqrt(est_acc * (1 - est_acc) / n_test) # 标准误
ci_lower = est_acc - 1.96 * se # 下界
ci_upper = est_acc + 1.96 * se # 上界
if ci_lower <= true_accuracy <= ci_upper: # 检查包含
coverage_count += 1 # 包含计数
print(f"\n重复{n_trials}次,95%CI实际覆盖率: {coverage_count/n_trials:.3f}") # 应接近95%
什么用(应用):在论文中报告模型性能时,不仅报告准确率 85%,还应报告 95% CI [83%, 87%]。在 A/B 测试中,报告转化率提升的 CI 而非仅报告"是否显著"。在超参数调优中,用 CI 判断不同配置的差异是否在统计上可信。在强化学习中,报告策略回报的 CI 而非仅报告点估计。
哪些坑(缺点):CI 的常见误解:①95% CI 不意味着"真实值有 95% 的概率落在区间内"(这是贝叶斯可信区间的解释);②CI 的覆盖率依赖于正态近似假设,在小样本或非正态数据下可能不准;③CI 只反映抽样误差,不反映测量误差、模型误设等系统性偏差。
四、AI中的应用——A/B测试、模型比较
是什么(定义):在 AI 中,假设检验和置信区间用于:①A/B 测试——科学比较两个模型/策略/特征的效果;②模型比较——用统计检验判断模型 A 是否显著优于模型 B;③超参数选择——判断不同超参数配置的差异是否统计显著;④特征重要性——用 t 检验或 ANOVA 判断特征是否与目标显著相关。
大白话 你训练了一个新模型,准确率 86%,旧模型是 85%。这个 1% 的提升是"真实改进"还是"测试集上的随机波动"?你上线了一个新推荐策略,CTR 从 5% 升到 5.2%——这 0.2% 的差异够不够"显著"来下结论?假设检验和置信区间就是用来回答这些问题的。
为什么(原理):模型比较中常用的检验:①McNemar 检验——比较两个分类器在相同测试集上的错误率差异(适用于配对数据);②配对 t 检验——比较两个模型在多个测试集上的性能差异;③Wilcoxon 符号秩检验——配对 t 检验的非参数替代;④Friedman 检验——比较多个模型在多个数据集上的排名差异。
怎么做(实现):
import numpy as np
# 模拟A/B测试:比较两个推荐策略的CTR
np.random.seed(42) # 固定种子
# 策略A(对照组):CTR=5%,策略B(实验组):CTR=5.3%
n_users = 10000 # 每组用户数
p_A, p_B = 0.050, 0.053 # 真实CTR
# 模拟实验数据
clicks_A = np.random.binomial(1, p_A, n_users) # 策略A的点击结果
clicks_B = np.random.binomial(1, p_B, n_users) # 策略B的点击结果
ctr_A = np.mean(clicks_A) # 策略A的CTR
ctr_B = np.mean(clicks_B) # 策略B的CTR
lift = (ctr_B - ctr_A) / ctr_A * 100 # 相对提升百分比
print(f"策略A CTR: {ctr_A:.4f}") # 约5%
print(f"策略B CTR: {ctr_B:.4f}") # 约5.3%
print(f"相对提升: {lift:.2f}%") # 约6%
# Z检验比较两个比例
pooled = (np.sum(clicks_A) + np.sum(clicks_B)) / (2 * n_users) # 合并CTR
se = np.sqrt(pooled * (1 - pooled) * (2 / n_users)) # 标准误
z_stat = (ctr_B - ctr_A) / se # Z统计量
from math import erf, sqrt
p_value = 2 * (1 - 0.5 * (1 + erf(abs(z_stat) / sqrt(2)))) # 双尾p值
# 计算提升的95%置信区间
se_lift = np.sqrt(ctr_A*(1-ctr_A)/n_users + ctr_B*(1-ctr_B)/n_users) # 差异的标准误
ci_lower = (ctr_B - ctr_A) - 1.96 * se_lift # 提升的CI下界
ci_upper = (ctr_B - ctr_A) + 1.96 * se_lift # 提升的CI上界
print(f"\n统计检验结果:")
print(f"Z统计量: {z_stat:.4f}") # Z值
print(f"p值: {p_value:.4f}") # p值
print(f"CTR提升的95%CI: [{ci_lower:.4f}, {ci_upper:.4f}]") # 提升的CI
if p_value < 0.05:
print(f"结论:p值<0.05,策略B显著优于策略A") # 统计显著
else:
print(f"结论:p值≥0.05,差异不显著(可能是随机波动)") # 不显著
# 演示:样本量对统计显著性的影响
print(f"\n\n演示样本量对统计显著性的影响(相同效应大小):")
for n_small in [1000, 2000, 5000, 10000]:
c_A = np.random.binomial(1, 0.05, n_small) # 小样本A
c_B = np.random.binomial(1, 0.053, n_small) # 小样本B
p_pool = (np.sum(c_A)+np.sum(c_B))/(2*n_small) # 合并CTR
se_s = np.sqrt(p_pool*(1-p_pool)*(2/n_small)) # 标准误
z_s = (np.mean(c_B)-np.mean(c_A))/se_s # Z统计量
p_s = 2*(1-0.5*(1+erf(abs(z_s)/sqrt(2)))) # p值
print(f"n={n_small:5d}: Z={z_s:.3f}, p={p_s:.4f}, {'显著' if p_s<0.05 else '不显著'}") # 样本量影响
什么用(应用):A/B 测试是互联网公司产品迭代的核心方法论——新功能上线前必须通过 A/B 测试验证效果。模型部署时,用统计检验确认新模型确实优于线上模型。在 AutoML 中,统计检验用于判断不同 pipeline 的差异是否显著。在可解释 AI 中,置换特征重要性检验(Permutation Importance Test)判断特征重要性是否显著。
哪些坑(缺点):A/B 测试的常见陷阱:①偷看问题(peeking)——在实验未达到预定样本量时多次检查 p 值,会显著增加第一类错误率;②多重比较——同时测试多个变体,需要多重比较校正;③新奇效应(novelty effect)——用户对新界面/策略的短期反应可能不同于长期行为;④网络效应——社交网络中的用户相互影响,违反独立假设。
概念关系图谱
| 概念 | 核心含义 | 与AI的关系 | 关联概念 |
|---|---|---|---|
| 假设检验 | 基于数据判断是否拒绝H₀ | A/B测试、模型比较、特征选择 | p值、置信区间、显著性水平 |
| 原假设H₀ | 默认假设("无差异") | 新模型与旧模型"无差异" | 备择假设、p值 |
| p值 | H₀为真时观察极端结果的概率 | 判断模型改进是否统计显著 | 假设检验、显著性水平 |
| 显著性水平α | 可容忍的Type I错误率 | 通常设为0.05 | 假设检验、p值 |
| 置信区间(CI) | 参数估计的不确定性范围 | 模型性能的可靠性量化 | 假设检验、标准误 |
| Type I Error | H₀真时拒绝H₀(假阳性) | 误以为新模型更好 | α、假设检验 |
| Type II Error | H₁真时未拒绝H₀(假阴性) | 错过真实改进 | β、统计功效 |
| A/B测试 | 随机对照实验比较两版本 | 模型上线前的标准评估流程 | 假设检验、置信区间 |
| 多重比较 | 同时做多次检验增加假阳性 | 超参数调优中的校正 | Bonferroni、FDR |
| 效应大小 | 差异的实际幅度 | 补充p值,判断差异是否"有意义" | 假设检验、置信区间 |
重点答疑
Q1: p 值到底是什么?p=0.04 意味着什么?
p=0.04 意味着:如果原假设 H₀ 为真(如"新模型和旧模型效果相同"),那么观察到当前差异或更大差异的概率只有 4%。这通常被认为"证据足够强"来拒绝 H₀。但 p=0.04 不意味着"新模型有 96% 的概率更好"——这是贝叶斯后验概率,需要先验信息才能计算。p 值也不意味着"差异很大"——在大样本下,微小的差异也可以达到 p<0.05。
Q2: 置信区间和假设检验有什么关系?
它们是等价的!如果 95% CI 不包含 H₀ 指定的值(如 0),则在 α=0.05 水平拒绝 H₀。例如,检验"模型 A 和 B 的准确率差异为 0"时,如果差异的 95% CI 为 [0.5%, 2.5%](不包含 0),则拒绝 H₀。CI 比单纯的 p 值提供更多信息——它不仅告诉你"是否显著",还告诉你"差异有多大"以及"估计有多精确"。
Q3: 为什么 A/B 测试中不能"偷看"(peeking)?
如果你在实验过程中多次检查 p 值,每次看到 p>0.05 就继续实验,看到 p<0.05 就停止,那么即使 H₀ 为真,你最终有远大于 5% 的概率会"偶然"看到 p<0.05。这就是"顺序检验"问题。解决方案:①预先确定样本量和实验时长;②使用序贯检验方法(如 Sequential Probability Ratio Test);③使用贝叶斯 A/B 测试方法。
Q4: 统计显著 vs 实际显著有什么区别?
统计显著(p<0.05)只意味着"差异不太可能是随机波动导致的",但不意味着"差异很大或很重要"。在大样本下,微小的差异(如 CTR 从 5.000% 升到 5.001%)也可以达到统计显著,但这样的提升在实际业务中毫无意义。这就是为什么需要同时报告效应大小(effect size)和置信区间。一个好的实践是:先问"这个差异在实际中有意义吗?"(如提升 0.5% 的 CTR 是否值得全量上线),再问"这个差异在统计上可靠吗?"(p 值和置信区间)。
Q5: 在模型比较中,为什么 McNemar 检验比简单的 t 检验更合适?
McNemar 检验专门为配对数据设计——同一个测试集上,模型 A 和模型 B 对每个样本的预测正确/错误是配对的(不是独立的)。t 检验假设两组样本独立,但在模型比较中,模型 A 和 B 在相同测试集上评估,结果高度相关(两个模型在"简单"样本上都可能正确,在"困难"样本上都可能错误)。McNemar 检验只关注"两个模型预测不一致的样本"(A 对 B 错 vs A 错 B 对),利用这些不一致样本的比例来判断差异是否显著,更准确地反映了模型比较的本质。
章节单词汇总
| 英文 | 音标 | 术语/释义 |
|---|---|---|
| Hypothesis Testing | /haɪˈpɒθəsɪs ˈtestɪŋ/ | 假设检验,基于数据判断假设是否成立 |
| Null Hypothesis (H₀) | /nʌl haɪˈpɒθəsɪs/ | 原假设,默认假设(通常为"无差异") |
| Alternative Hypothesis (H₁) | /ɔːlˈtɜːrnətɪv haɪˈpɒθəsɪs/ | 备择假设,与原假设对立的假设 |
| p-value | /piː ˈvæljuː/ | p值,H₀为真时观察到极端结果的概率 |
| Significance Level (α) | /sɪɡˈnɪfɪkəns ˈlevəl/ | 显著性水平,可容忍的Type I错误率 |
| Type I Error | /taɪp wʌn ˈerər/ | 第一类错误,H₀为真时拒绝H₀(假阳性) |
| Type II Error | /taɪp tuː ˈerər/ | 第二类错误,H₁为真时未拒绝H₀(假阴性) |
| Statistical Power | /stəˈtɪstɪkəl ˈpaʊər/ | 统计功效,1-β,正确拒绝H₀的概率 |
| Confidence Interval (CI) | /ˈkɒnfɪdəns ˈɪntərvəl/ | 置信区间,参数估计的不确定性范围 |
| Effect Size | /ɪˈfekt saɪz/ | 效应大小,差异的实际幅度 |
| A/B Testing | /eɪ biː ˈtestɪŋ/ | A/B测试,比较两个版本的随机对照实验 |
| Multiple Comparison | /ˈmʌltɪpəl kəmˈpærɪsən/ | 多重比较,同时做多次检验 |
| Bonferroni Correction | /ˌbɒnfəˈroʊni kəˈrekʃən/ | Bonferroni校正,多重比较的p值调整 |
| Standard Error (SE) | /ˈstændərd ˈerər/ | 标准误,估计量的标准差 |
| Z-test / t-test | /ziː test/ /tiː test/ | Z检验/t检验,常用的假设检验方法 |
面试练习
Q1 [单选] 假设检验中,显著性水平 α=0.05 的含义是什么?
- A. 有 95% 的概率 H₀ 为真
- B. 容忍在 H₀ 为真时有 5% 的概率错误拒绝 H₀
- C. 有 5% 的概率 H₁ 为真
- D. 结果有 95% 的概率是正确的
解答:α 是第一类错误(Type I Error)的概率——当 H₀ 为真时错误拒绝 H₀ 的概率。我们设定 α=0.05,意味着我们愿意承受 5% 的"假阳性"风险。
Q2 [单选] 关于 p 值,以下哪项是正确的?
- A. p 值是 H₀ 为真的概率
- B. p 值越大,拒绝 H₀ 的证据越强
- C. p 值是 H₀ 为真时,观察到当前或更极端结果的概率
- D. p=0.01 比 p=0.04 意味着效应大 4 倍
解答:p 值的定义是 P(data or more extreme | H₀)。A 错误(混淆了方向)。B 错误(p 越小证据越强)。D 错误(p 值不是效应大小的度量)。
Q3 [多选] 关于置信区间,正确的有?
- A. 95% CI 意味着如果重复实验很多次,约 95% 的 CI 会包含真实参数
- B. 样本量越大,CI 越窄
- C. 95% CI 意味着真实值有 95% 的概率落在区间内
- D. CI 与假设检验等价——如果 CI 不包含 H₀ 值,则拒绝 H₀
解答:A 正确(频率学派的解释)。B 正确,CI 宽度 ∝ 1/√n。C 错误,这是贝叶斯可信区间的解释。D 正确,CI 和假设检验是等价的。
Q4 [单选] 做了 20 次独立的假设检验(α=0.05),即使所有 H₀ 都为真,期望有多少次会错误拒绝 H₀?
- A. 0 次
- B. 1 次
- C. 5 次
- D. 20 次
解答:20 × 0.05 = 1 次。这就是多重比较问题——即使没有任何真实效应,平均也会有 1 次"显著"结果。解决方法:Bonferroni 校正(α/20=0.0025)或 FDR 控制。
Q5 [多选] 以下哪些关于 A/B 测试的实践是正确的?
- A. 实验前预先确定样本量和实验时长
- B. 避免在实验未完成时多次检查 p 值(偷看)
- C. 只要 p<0.05 就立即上线新版本
- D. 同时报告效应大小和置信区间,而非仅报告 p 值
解答:A 正确,避免 peeking 问题。B 正确,偷看会增大第一类错误率。C 错误,还需考虑效应大小和实际意义。D 正确,这是好的统计实践。
Q6 [单选] 第一类错误(Type I Error)是什么?
- A. H₁ 为真时未拒绝 H₀
- B. H₀ 为真时拒绝 H₀(假阳性)
- C. H₀ 为真时未拒绝 H₀
- D. H₁ 为真时拒绝 H₀
解答:Type I Error = 假阳性 = H₀ 为真时错误拒绝 H₀ = 冤枉好人。概率 = α。Type II Error = 假阴性 = H₁ 为真时未拒绝 H₀ = 放走坏人。概率 = β。
Q7 [单选] 模型 A 准确率 85%,模型 B 准确率 86%,差异的 95% CI 为 [-0.5%, 2.5%]。以下哪个结论正确?
- A. 模型 B 显著优于模型 A
- B. 模型 A 显著优于模型 B
- C. 差异不显著,不能下结论
- D. 两个模型准确率相同
解答:95% CI 包含 0([-0.5%, 2.5%] 跨越 0),意味着在 α=0.05 水平下不能拒绝 H₀(差异=0)。差异不显著不代表"两个模型相同"——只能说"证据不足以证明有差异"。
Q8 [多选] 在机器学习模型比较中,以下哪些是常见的统计检验方法?
- A. McNemar 检验(比较两个分类器的错误率)
- B. 配对 t 检验(比较跨多个测试集的性能)
- C. Wilcoxon 符号秩检验(配对 t 检验的非参数替代)
- D. Friedman 检验(比较多个模型在多个数据集上的排名)
解答:以上全部都是模型比较中常用的统计检验方法。McNemar 适用于配对分类结果,配对 t 检验和 Wilcoxon 用于连续性能指标,Friedman 检验用于多模型多数据集比较。
Q9 [单选] 增大样本量,以下哪个会发生变化?
- A. 显著性水平 α
- B. 置信区间的宽度(变窄)
- C. 真实的效应大小
- D. 总体参数
解答:CI 宽度 ∝ 1/√n,样本量增大 CI 变窄。α 是人为设定的,不变。真实效应大小和总体参数是客观存在的,不受样本量影响。但要注意:大样本下微小差异也可能达到统计显著。
Q10 [单选] 在 A/B 测试中,为什么需要随机分配用户?
- A. 为了让 p 值更小
- B. 为了消除混杂因素,确保两组可比
- C. 为了让实验更省时间
- D. 为了让置信区间更窄
解答:随机分配是 A/B 测试的核心——通过随机化,两组的用户特征(年龄、性别、使用习惯等)在统计上趋于平衡,这样两组之间的差异就只能归因于实验变量(如新策略 vs 旧策略),而不是其他混杂因素。