面向机器学习的统计:区分信号与噪声 本节摘要:统计告诉你模型是真有效还是只是运气好。你训了两个模型,A 测试集 0.87、B 0.89,你部署了 B,三周后线上指标更差——B 并没有真正胜过 A,那 0.02 是噪声。Kaggle 榜单抖动、论文无法复现、A/B 测试凭几百样本宣布赢家,根因都是跳过了统计。本节从描述性统计(均值/中位数/方差/分位数,以及为何样本方差要除 n−1 的贝塞尔校正)讲起;给 Pearson(线性)与 Spearman(秩,单调)相关及协方差矩阵(PCA 分解的对象);推导假设检验的完整框架——零假设、p 值(「假设 H0 为真时见到如此极端数据的概率」,不是「H0 为真的概率」)、置信区间、t 检验(单样本/双样本/Welch/配对)、卡方检验;用
本节摘要:统计告诉你模型是真有效还是只是运气好。你训了两个模型,A 测试集 0.87、B 0.89,你部署了 B,三周后线上指标更差——B 并没有真正胜过 A,那 0.02 是噪声。Kaggle 榜单抖动、论文无法复现、A/B 测试凭几百样本宣布赢家,根因都是跳过了统计。本节从描述性统计(均值/中位数/方差/分位数,以及为何样本方差要除 n−1 的贝塞尔校正)讲起;给 Pearson(线性)与 Spearman(秩,单调)相关及协方差矩阵(PCA 分解的对象);推导假设检验的完整框架——零假设、p 值(「假设 H0 为真时见到如此极端数据的概率」,不是「H0 为真的概率」)、置信区间、t 检验(单样本/双样本/Welch/配对)、卡方检验;用 bootstrap 重采样为任意指标构造无分布假定的置信区间;强调统计显著 ≠ 实际显著(效应量 Cohen's d);覆盖多重比较(Bonferroni)与 ML 论文十大统计错误。读完本节,你不再凭单个准确率数字下结论。
对应原课程:Phase 01 · Lesson 15 ·
statistics-for-ml(原英文phases/01-math-foundations/15-statistics-for-ml/docs/en.md)。前置:第 6、7 节(概率、贝叶斯)。
阅读完本节,你应当能够:
统计给你区分信号与噪声的工具。它告诉你一个差异何时是真的、你该有多自信、需要多少数据才能信任结果。每个 ML 流水线、每次模型对比、每个实验都需要统计——没有它,你只是在猜。
建模前先要知道数据长什么样。描述性统计把数据集压缩成几个刻画其形状的数。
集中趋势(「中间在哪」):
均值:所有值之和 / 个数 mu = (1/n)·Σx_i ← 平衡点,对异常值敏感 中位数:排序后的中间值 ← 抗异常值;[1,2,3,4,1000] 均值 202、中位数 3 众数:最频繁的值 ← 适合分类数据,连续数据少用
均值与中位数背离说明分布偏斜:收入分布均值远大于中位数(亿万富翁右偏);训练损失常均值远小于中位数(易样本左偏)。
离散度(「多分散」):
方差: 偏差平方的均值 σ² = (1/n)·Σ(x_i - mu)² 标准差: 方差的平方根 σ = √σ² (与数据同单位,更可解释) 极差: max - min (对异常值敏感,几乎不单独用) IQR: Q3 - Q1 (中间 50% 的范围,抗异常值,箱线图用)
百分位数把排序数据划成 100 等份。P50 是中位数;监控里常看延迟的 P50(典型体验)、P95(差但非最坏)、P99(尾延迟,常是中位数 10 倍)。低均误差但 P99 极差的模型对安全攸关应用可能无用。
样本 vs 总体统计:从样本算方差时除 (n−1) 而非 n,这是贝塞尔校正(Bessel's Correction)——你的样本均值不是真总体均值,分母用 n 会系统性低估真方差,用 (n−1) 使估计无偏。n 大(几千)时差别可忽略,n 小(几十)时要紧。
相关度量两变量线性关系的强度与方向。
Pearson 相关系数量线性关联:r = Σ(x_i-x̄)(y_i-ȳ) / (n·s_x·s_y),范围 [-1,1]:+1 完美正线性、-1 完美负线性、0 无线性关系(但可能有非线性的!)。Pearson 假定关系线性且两变量近似正态,对异常值敏感——单个极端点能把 r 从 0.1 拉到 0.9。
Spearman 秩相关量单调关联:先把每个值换成其秩(1,2,3,…),再对秩算 Pearson。它能抓任何单调关系,不只线性:若 y = x³,Pearson 给 r<1 但 Spearman 给 ρ=1。
何时用哪个:
黄金法则:相关不蕴含因果。冰淇淋销量与溺水死亡相关,因为两者夏天都升;模型准确率与参数数相关,但加参数不自动提准确率(见过拟合)。
两变量的协方差:Cov(X,Y) = (1/n)·Σ(x_i-x̄)(y_i-ȳ)。>0 同向增、<0 此增彼减、=0 无线性同动。对 d 个特征,协方差矩阵 C 是 d×d,C[i][j] = Cov(特征_i, 特征_j),对角元是各特征方差。
性质:对称 C[i][j]=C[j][i];半正定(特征值 ≥0);对角=方差、非对角=协方差。
与 PCA 的联系:PCA 特征分解协方差矩阵,特征向量是主成分(最大方差方向),特征值告诉你每个成分捕获多少方差。这正是第 10 节讲的,现在你明白为何协方差矩阵是对的东西来分解——它编码了数据中所有成对线性关系。相关矩阵就是标准化后变量(各除以标准差)的协方差矩阵,把协方差归一到 [-1,1]。
假设检验是在不确定下做决策的框架:先有断言、收集数据、判定数据是否与断言一致。
零假设 H0: 默认假定,通常是「无效果」 备择假设 H1: 你试图证明的 例:H0:模型 A 与 B 准确率相同;H1:B 比 A 高
p 值是「假设 H0 为真时,见到与观测同样极端数据的概率」——它不是「H0 为真的概率」,这是统计里最常见的误解。
若 p 值 < α(典型 0.05):拒绝 H0,结果「统计显著」 若 p 值 ≥ α:不能拒绝 H0(证据不足),但这不等于 H0 为真
置信区间给参数一个合理范围:95% 置信区间 x̄ ± z·(s/√n),z=1.96(95% 置信)。解读:若重复实验多次,95% 算出的区间会包含真均值——不是说真均值有 95% 概率落在这个具体区间里。区间宽反映精度:宽=不确定大,窄=估计精确(但若有偏则不一定准确)。
t 检验比较均值,有几种变体:
t = (x̄ - μ₀)/(s/√n),自由度 n−1。t = (x̄₁ - x̄₂)/√(s₁²/n₁ + s₂²/n₂),这是 Welch t 检验(不假定等方差)——除非有特定理由假定等方差,否则总用 Welch。d_i = x_i - y_i,再对 d_i 做单样本 t 检验(对 μ₀=0)。ML 里常见:两模型在同一 10 折交叉验证上跑,成对比较得分。卡方检验检查观测频率是否匹配期望频率,适合分类数据:χ² = Σ(观测 - 期望)²/期望。
例:语言模型输出分布是否匹配训练分布? 类别 观测 期望 正 120 100 负 80 100 χ² = (120-100)²/100 + (80-100)²/100 = 4 + 4 = 8 自由度 1 时 χ²=8 给 p<0.005 → 差异显著
ML 的 A/B 测试不同于网页 A/B 测试,模型对比有特定挑战:
1. 同一测试集:两模型必须在相同数据上评估,不同测试集使比较无意义。 2. 多指标:仅准确率不够,需 precision、recall、F1、延迟、公平性。 3. 方差:用交叉验证或 bootstrap 估每个指标的方差,而非只点估计。 4. 数据泄漏:若测试集用于模型选择,比较有偏——留出最终测试集。
流程:定义指标与显著性水平(α=0.05)→ 两模型在同一 k 折交叉验证划分上跑 → 收集成对得分 → 算差 d_i = b_i - a_i → 对差做配对 t 检验 → 检查均值差是否显著异于 0 → 算均值差的置信区间 → 算效应量(Cohen's d)判断实际显著性。
结果可以统计显著但实际无意义。数据够多时,微不足道的差异也变统计显著:
模型 A 准确率 0.9234,模型 B 0.9237,n=1,000,000,p=0.001 统计显著?是。实际显著?0.03% 的提升不值得部署新模型的工程成本。
效应量量差异有多大,与样本量无关:Cohen's d = (均值₁ - 均₂)/合并标准差。d=0.2 小、0.5 中、0.8 大。总要同时报告 p 值与效应量:p 值告诉你差异是否真,效应量告诉你是否要紧。
检验很多假设时,有些会偶然「显著」。α=0.05 检验 20 个,即使全无真实效果,也期望有 1 个假阳性:P(至少一个假阳性) = 1 - (1-α)^m,m=20 时 = 0.64(64% 概率至少一个假阳性)。
Bonferroni 校正:把 α 除以检验数,校正后 α' = 0.05/20 = 0.0025,只有 p<0.0025 才拒绝 H0。保守但简单,检验独立时有效。ML 里在多指标比较、多超参配置、多数据集评估时要紧。
Bootstrap 用有放回重采样估计统计量的抽样分布,不需任何分布假定:
1. 有 n 个数据点 2. 有放回抽 n 个(部分点出现多次、部分不出现) 3. 在这个 bootstrap 样本上算统计量 4. 重复 B 次(B 典型 1000~10000) 5. B 个 bootstrap 统计量的分布近似抽样分布
Bootstrap 置信区间(百分位法):把 B 个统计量排序,95% CI = [第 2.5 百分位, 第 97.5 百分位]。
为何对 ML 要紧:测试集准确率是点估计,bootstrap 给置信区间;不能假定指标分布正态(尤其 AUC、F1、precision@k);bootstrap 对任意统计量有效——中位数、两均值之比、两模型 AUC 差;无需闭式公式。模型对比时:两模型在同一测试集的预测,每次 bootstrap 重采样测试下标、算两指标及其差,差的 95% CI 若不含 0 则差异显著——比配对 t 检验更稳,因为无分布假定。
参数检验假定特定分布(通常正态):t 检验、ANOVA、Pearson r。非参数检验无分布假定:Mann-Whitney U(替代独立 t)、Wilcoxon 符号秩(替代配对 t)、Spearman ρ(替代 Pearson)、Kruskal-Wallis(替代 ANOVA)。
何时用非参数:小样本(n<30)且明显非正态;序数数据;无法剔除的重异常值;偏斜分布。何时用参数:大样本(CLT 让检验统计量近似正态);数据近似对称无极端异常值;统计功效更高(更易检出真差异)。ML 实验通常 n 小(5 或 10 折),非参数如 Wilcoxon 符号秩常比 t 检验更合适。
CLT 说样本均值的分布随 n 增长趋近正态,不论总体分布如何:X̄ ~ Normal(μ, σ²/n)(n→∞),多数情况 n≥30 成立,极偏分布可能需 n≥100。
对 ML 的意义:① 为聚合指标的置信区间与 t 检验提供依据;② 解释为何交叉验证折数的平均即使单折波动剧烈也稳定;③ mini-batch 梯度下降有效,因 batch 内平均梯度近似真梯度(CLT 在起作用);④ 集成方法:多模型预测平均比任何单模型更稳。CLT 不做的事:不让你的数据变正态(是让样本均值变正态);对无穷方差的重尾分布(Cauchy)不成立;对相依数据(时间序列,不校正)不适用。
完整源码见 phases/01-math-foundations/15-statistics-for-ml/code/(原项目实现 6 个模块:描述性统计、相关函数、假设检验、bootstrap 置信区间、A/B 测试模拟器、统计 vs 实际显著演示),全部只用 math 与 random,无 numpy、无 scipy。关键骨架:
def mean(xs): return sum(xs) / len(xs) def variance(xs): # 样本方差,贝塞尔校正 m = mean(xs); return sum((x-m)**2 for x in xs) / (len(xs) - 1) def percentile(xs, p): xs = sorted(xs); k = (len(xs)-1) * p / 100 f, c = int(k), int(k) + 1 return xs[f] + (xs[c] - xs[f]) * (k - f) if c < len(xs) else xs[f] def pearson(x, y): mx, my = mean(x), mean(y) num = sum((xi-mx)*(yi-my) for xi, yi in zip(x, y)) sx = (sum((xi-mx)**2 for xi in x)/(len(x)-1))**0.5 sy = (sum((yi-my)**2 for yi in y)/(len(y)-1))**0.5 return num / ((len(x)-1) * sx * sy) def bootstrap_ci(data, stat, B=1000, alpha=0.05): stats = sorted(stat(random.choices(data, k=len(data))) for _ in range(B)) lo = stats[int(B * alpha/2)]; hi = stats[int(B * (1-alpha/2))] return lo, hi
生产中用 scipy/numpy:
from scipy import stats import numpy as np result = stats.ttest_ind(group_a, group_b, equal_var=False) # Welch t print(f"t={result.statistic:.3f} p={result.pvalue:.4f}") mean, ci_low, ci_high = stats.bayes_mvs(data, alpha=0.95)[0]
模型对比的稳健做法是用 scipy.stats.wilcoxon(配对非参数)或 bootstrap,而非仅报点估计。sklearn 的 cross_val_score 配合 bootstrap 或配对检验,是评估模型差异是否显著的标准路径。
💡 永远同时报告效应量:p 值随样本量单调变化(数据够多任何差异都显著),效应量(Cohen's d)与样本量无关,告诉你差异「是否要紧」。
源码见 phases/01-math-foundations/15-statistics-for-ml/code/。
y=x³);解释两种相关各自的盲点。下一节,我们看 AI 如何探索可能性空间——采样方法:从逆 CDF、拒绝采样、重要性采样到 MCMC,再到驱动 LLM 的温度/top-k/top-p 与驱动 VAE 的重参数化技巧。