小区居委会打算做一个“幸福家庭自动识别”AI。他们翻出十年来的老档案,又让志愿者挨家挨户补拍新照片,最后请几位阿姨给每张照片贴上“幸福/普通”的标签,然后拿这面照片墙去训练AI。计划听起来很完美,AI却总闹笑话。问题不在AI笨,而在照片墙本身:老档案里某些家庭从未出现过,拍照只在上午、只挑广场,阿姨们贴标签又各凭眼光。历史偏差、采样偏差、标注偏差——三类偏差像三层变形的滤镜,一层层叠加在照片上,AI从墙上学到的“幸福观”自然歪得离谱。这就是数据集偏差:不是模型算错了,而是喂给模型的“饭”本身就不干净。学会诊断这三种偏差、并有针对性地修复,是每一位AI从业者的基本功。

岗位关联

数据集偏差是AI偏见的源头。掌握三类偏差的诊断与缓解方法,能帮你交付公平、可信、可审计的模型,避开“准确率很高但暗含歧视”的职业陷阱。

目录
  1. 可视化演示
  2. 偏差全景图
  3. 历史偏差诊断
  4. 采样偏差诊断
  5. 标注偏差诊断
  6. 数据层缓解
  7. 模型层缓解
  8. 案例验证成效
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示数据集偏差:历史偏差反映社会不平等、采样偏差导致群体代表性失衡、标注偏差源于标注者主观偏好,及各阶段针对性缓解策略。

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

历史偏差:社会不平等的映射 数据如实反映历史社会不平等G1优势群体占80% G3弱势群体历史通过率仅15%根植于现实 P(Y|G1) ≠ P(Y|G3), bias = historical inequality 历史偏差最难消除需数据层面重采样与公平约束。

偏差全景图

照片墙上有 50 张照片,理想情况下它应该精确反映小区家庭的真实构成。可这面墙在成型过程中经历了三层“滤镜”:十年前的老档案里根本没有某些家庭的记录;摄影师只挑方便的时间地点按快门;志愿者贴标签时又各凭眼光。每一层滤镜,都在悄悄改变照片墙的构成和标签。

这三层滤镜放到 AI 领域,就是三类著名的数据集偏差。历史偏差指训练数据如实复刻了过去社会结构中的不平等——老档案里没有的人,AI 永远不会认识;采样偏差指数据收集过程(渠道、时间、地点、受访门槛)导致某些群体代表性不足——摄影师没拍到的家庭,在数据里就是一片空白;标注偏差指标注者的主观偏好渗入标签——同样一张照片,有人觉得“严肃是稳重”,有人觉得“严肃是不幸福”,AI 学到哪种全看标注者是谁。

三类偏差不是孤立的,而是层层嵌套。现实中我们拿到的数据集,是真实分布先被历史偏差扭曲、再被采样偏差过滤、最后被标注偏差污染的结果。用数学符号表示,训练数据的分布是真实分布经过三个“函数”逐层加工后的产物:

Pbias(x,y)=fanno(fsamp(fhist(Preal(x,y))))\displaystyle P_{\text{bias}}(x, y) = f_{\text{anno}}\left(f_{\text{samp}}\left(f_{\text{hist}}\left(P_{\text{real}}(x, y)\right)\right)\right)

1. 真实分布:$P_{\text{real}}(x, y)$ 表示真实世界中样本 $x$ 与标签 $y$ 的联合分布——小区里原本有多少户人家、各家真实的状态是什么。

Preal(x,y)P_{\text{real}}(x, y)

2. 历史滤镜:$f_{\text{hist}}(\cdot)$ 表示历史偏差函数,老档案本身就缺失部分群体的记录,这一步先把分布扭曲一次。

fhist(Preal(x,y))f_{\text{hist}}\left(P_{\text{real}}(x, y)\right)

3. 采样滤镜:$f_{\text{samp}}(\cdot)$ 表示采样偏差函数,拍摄过程又过滤掉一部分家庭,让分布继续偏离。

fsamp(fhist(Preal(x,y)))f_{\text{samp}}\left(f_{\text{hist}}\left(P_{\text{real}}(x, y)\right)\right)

4. 标注滤镜:$f_{\text{anno}}(\cdot)$ 表示标注偏差函数,志愿者贴上主观标签,最终形成模型真正看到的偏差分布。

Pbias(x,y)=fanno(⋯ )P_{\text{bias}}(x, y) = f_{\text{anno}}\left(\cdots\right)

理解了这幅“滤镜叠加图”,后面的每一节,就是逐个拆开这三层滤镜:先诊断,再修复。

历史偏差诊断

照片墙最底下两排贴的是十年前的老档案。那年小区刚落成,只有一部分家庭入住,拍照时又总是优先请“干部家庭”和“双职工家庭”,单亲家庭、外来租户几乎没有留下照片。如今 AI 看着这面墙,就以为小区里从来只有这两种家庭。

这就是历史偏差:训练数据的采集和生成发生在特定的历史条件下,如实“复刻”了当时社会的不平等。它不是采集者故意造假,而是历史本身有偏见。当这些历史数据被拿来训练今天的 AI,过去的偏见就顺着数据流进了模型。更麻烦的是,历史偏差还会连锁放大——模型学到的偏见进入产品,又影响下一轮数据的产生,形成恶性循环。

诊断历史偏差最直接的办法,是把训练数据的分布与权威的目标分布(比如统计局人口数据、户籍登记)做对比。若某些群体在数据中的占比显著偏离目标占比,就存在历史偏差。用 KL 散度可以量化这种偏离——它就像一把尺子,量出“老档案里的世界”和“真实世界”差多远:

DKL(Phist∥Ptarget)=∑iPhist(i)ln⁡Phist(i)Ptarget(i)\displaystyle D_{\mathrm{KL}}(P_{\text{hist}} \parallel P_{\text{target}}) = \sum_{i} P_{\text{hist}}(i) \ln \frac{P_{\text{hist}}(i)}{P_{\text{target}}(i)}

1. 目标占比:$P_{\text{target}}(i)$ 表示群体 $i$ 在目标人群中的真实占比,相当于居委会的户籍底册。

Ptarget(i)P_{\text{target}}(i)

2. 历史占比:$P_{\text{hist}}(i)$ 表示老档案里群体 $i$ 的占比,两者一对比就能发现问题。

Phist(i)P_{\text{hist}}(i)

3. 对数偏离比:$\ln \dfrac{P_{\text{hist}}(i)}{P_{\text{target}}(i)}$ 当两者相等时该值为 0,越偏离 0 说明该群体被歪曲得越厉害。

ln⁡Phist(i)Ptarget(i)\ln \frac{P_{\text{hist}}(i)}{P_{\text{target}}(i)}

4. 加权求和:$\sum_{i} P_{\text{hist}}(i) \ln(\cdots)$ 按每个群体的历史占比加权汇总,得到总偏离度,值越大历史偏差越严重。

DKL(Phist∥Ptarget)D_{\mathrm{KL}}(P_{\text{hist}} \parallel P_{\text{target}})

算出 KL 散度,我们就知道老档案歪到了什么程度。但这只是第一步——知道墙歪了,还得弄清另外两层滤镜各贡献了多少偏差。

采样偏差诊断

补拍新照片时,摄影师图省事,只在工作日上午九点到十一点、在小区中心广场按快门。结果照片里全是退休老人、全职妈妈和自由职业者,朝九晚五的上班族一张都没拍到。

这就是采样偏差:数据采集的机制(时间、地点、渠道、受访门槛)系统性地让某些群体“进不了镜头”。与历史偏差不同,采样偏差不是因为过去不公平,而是因为今天的采集过程有盲区。它最危险的地方在于“沉默”——缺失的群体不会出现在数据里抱怨,模型也就永远不会为它们发声。

诊断采样偏差,要分别统计每个群体在数据和人口中的占比,计算代表性比率 $\omega(x)$:

ω(x)=P^sample(x)Ppopulation(x)\displaystyle \omega(x) = \frac{\hat{P}_{\text{sample}}(x)}{P_{\text{population}}(x)}

1. 人口真实占比:$P_{\text{population}}(x)$ 表示群体 $x$ 在总人口中的真实比例,这是参照系。

Ppopulation(x)P_{\text{population}}(x)

2. 样本观测占比:$\hat{P}_{\text{sample}}(x)$ 表示群体 $x$ 在已采集数据中的比例,这是被检查的对象。

P^sample(x)\hat{P}_{\text{sample}}(x)

3. 比率判断:$\omega(x) = 1$ 代表无偏差,$\omega(x) < 1$ 代表代表性不足,$\omega(x) > 1$ 代表过度代表。

ω(x)=P^sample(x)Ppopulation(x)\omega(x) = \frac{\hat{P}_{\text{sample}}(x)}{P_{\text{population}}(x)}

用 $\omega$ 一量,摄影师自己也吓一跳——他拍的“小区全景”其实只是上午九点的广场一角。采集机制不改,后面堆再多数据也补不齐这块缺口。

标注偏差诊断

照片墙贴标签时,居委会召集了五位住户志愿者。有人觉得“三代同堂”才叫幸福,有人觉得“丁克家庭”最潇洒。同一张夫妻争吵被抓拍的照片,有人贴“沟通中”,有人贴“不幸福”。

标注偏差来自标注者的主观背景、立场和疲劳程度。它不改变照片本身,却会污染标签——而标签正是 AI 的“标准答案”。如果标准答案众说纷纭,模型学到的就一定是噪音里的偏见。诊断标注偏差的经典方法,是让多名标注者独立标注同一批样本,再计算一致性系数 Cohen's Kappa:

κ=po−pe1−pe\displaystyle \kappa = \frac{p_o - p_e}{1 - p_e}

1. 实际一致率:$p_o$ 表示多位标注者实际标注结果中相互一致的比例,默契度越高它越大。

pop_o

2. 偶然一致率:$p_e$ 表示即使标注者瞎猜、随机标注,也可能碰巧一致的比例。

pep_e

3. 排除偶然:$p_o - p_e$ 把“碰巧一致”的部分扣掉,剩下的才是真实的共识。

po−pep_o - p_e

4. 归一化结果:$\kappa = \dfrac{p_o - p_e}{1 - p_e}$ 分子分母都做归一化,最终取值接近 1 表示高度一致,接近 0 表示全靠瞎猜。

κ=po−pe1−pe\kappa = \frac{p_o - p_e}{1 - p_e}

Kappa 一算,五位志愿者之间的默契只有 0.4——照片墙的“标准答案”本身四分五裂。这时候与其骂 AI 学得差,不如先统一“幸福”的定义。

数据层缓解

诊断完三层滤镜,开始修复。第一招是在照片墙本身上下功夫:给少数群体补拍照片;实在补不到的,就把每一张现存照片的“发言权”调大;被贴错标签的照片,重新请专家组标一遍。

这三招对应数据层三种缓解策略。重加权采样给少数群体样本更高的损失权重,让它们在训练中的实际影响力回到应有水平;数据增广合成用翻转、裁剪、色彩变换乃至生成模型制造更多同类样本,补足缺失的群体画像;重新标注清洗则请更专业、更多元的标注者重做标签,剔除主观污染。

重加权是数学上最直接的一招。给每个样本算一个权重,让它的有效占比回归到理想分布:

wi=Ptarget(yi,xi)Pdata(yi,xi)\displaystyle w_i = \frac{P_{\text{target}}(y_i, x_i)}{P_{\text{data}}(y_i, x_i)}

1. 理想密度:$P_{\text{target}}(y_i, x_i)$ 表示理想数据集中样本 $(x_i, y_i)$ 应有的概率密度,即“应该有多少这样的照片”。

Ptarget(yi,xi)P_{\text{target}}(y_i, x_i)

2. 实际密度:$P_{\text{data}}(y_i, x_i)$ 表示当前数据集中该样本实际出现的概率密度,即“如今有多少这样的照片”。

Pdata(yi,xi)P_{\text{data}}(y_i, x_i)

3. 权重计算:$w_i$ 是两者的比值,训练时用它乘上该样本的损失,相当于在损失函数里“按权重投票”。

wi=Ptarget(yi,xi)Pdata(yi,xi)w_i = \frac{P_{\text{target}}(y_i, x_i)}{P_{\text{data}}(y_i, x_i)}

重加权像给照片墙“加权投票”:B 群体照片少,但每张可以顶十张。不过要记住——如果标签本身是错的,加权只会把错误一起放大。数据层解决不了的,要交到模型层。

模型层缓解

照片墙翻修不过来时,居委会决定给 AI 立一条“校规”:不论照片墙怎么歪,模型对 A 群体和 B 群体给出的“幸福概率”必须大体相当,不能一边倒。

这条“校规”就是模型层的公平性约束。除此之外还有两招:对抗去偏在训练时额外训练一个判别器,专门尝试从模型的中间表示猜出样本属于哪个群体,从而逼迫模型把群体信息从表示中丢干净;后处理阈值则对不同群体设置不同的决策阈值——A 群体 0.5 就判幸福,B 群体 0.45 就判幸福,校准输出差异。

公平性约束最常见的写法,是把“人口均等差”作为惩罚项写进损失函数。人口均等差就是两个群体被判为正例的概率之差,差越大越不公平:

Ltotal=Ltask+λ∣P(y^=1∣A=0)−P(y^=1∣A=1)∣\displaystyle \mathcal{L}_{\text{total}} = \mathcal{L}_{\text{task}} + \lambda \left| P(\hat{y}=1 \mid A=0) - P(\hat{y}=1 \mid A=1) \right|

1. 任务损失:$\mathcal{L}_{\text{task}}$ 表示模型原本的预测误差,比如分类交叉熵,它衡量模型“学得好不好”。

Ltask\mathcal{L}_{\text{task}}

2. 两组预测率:$P(\hat{y}=1 \mid A=0)$ 与 $P(\hat{y}=1 \mid A=1)$ 分别表示群体 0 和群体 1 被模型判为正例的概率。

P(y^=1∣A=0)−P(y^=1∣A=1)P(\hat{y}=1 \mid A=0) - P(\hat{y}=1 \mid A=1)

3. 绝对差:$\left| \cdots \right|$ 对差异取绝对值,得到人口均等差 DP,它衡量“校规”关心的不公平程度。

∣P(y^=1∣A=0)−P(y^=1∣A=1)∣\left| P(\hat{y}=1 \mid A=0) - P(\hat{y}=1 \mid A=1) \right|

4. 权衡系数:$\lambda$ 控制公平与精度的权重,$\lambda$ 越大模型越不敢偏向任何群体,但精度也可能受损。

Ltotal=Ltask+λ⋅DP\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{task}} + \lambda \cdot \mathrm{DP}

有了这条校规,AI 再怎么被歪墙带偏,也不敢对任何群体一边倒。当然,校规太严也会误伤精度,分寸在哪里,要靠案例验证来回答。

案例验证成效

照片墙翻新、校规立好之后,居委会把 AI 重新运行了半年,拿出前后对比数据开会。效果怎么样,不看口号看数字。

验证缓解效果,需要量化“偏差下降了多少”。最常用的做法是:在相同的测试集上,分别计算模型干预前后的人口均等差 DP,再求相对变化:

Δ=∣DP∣after−∣DP∣before∣DP∣before\displaystyle \Delta = \frac{|\mathrm{DP}|_{\text{after}} - |\mathrm{DP}|_{\text{before}}}{|\mathrm{DP}|_{\text{before}}}

1. 干预前偏差:$|\mathrm{DP}|_{\text{before}}$ 表示缓解措施实施前,两个群体被预测为正例的概率差,是基准线。

∣DP∣before|\mathrm{DP}|_{\text{before}}

2. 干预后偏差:$|\mathrm{DP}|_{\text{after}}$ 表示实施重加权、公平约束等措施后,同样的概率差缩小到多少。

∣DP∣after|\mathrm{DP}|_{\text{after}}

3. 相对变化:$\Delta = \dfrac{|\mathrm{DP}|_{\text{after}} - |\mathrm{DP}|_{\text{before}}}{|\mathrm{DP}|_{\text{before}}}$ 把绝对下降量归一化,得到偏差改善的百分比,负值越大改善越明显。

Δ=∣DP∣after−∣DP∣before∣DP∣before\Delta = \frac{|\mathrm{DP}|_{\text{after}} - |\mathrm{DP}|_{\text{before}}}{|\mathrm{DP}|_{\text{before}}}

这套流程在两个真实场景中得到了验证。招聘筛选场景里,某科技公司用过去十年录用记录训练简历筛选模型,性别间的正例率差高达 0.18。通过重加权 + 对抗去偏 + 阈值校准三管齐下,DP 降至 0.03,$\Delta = -83\%$,而整体录用准确率仅下降 1.2 个百分点。信贷评估场景里,年轻群体被风控员系统性标为“高风险”,诊断发现标注一致性仅 $\kappa = 0.55$;重新制定标注规范并引入仲裁机制后,一致性提升到 0.82,模型对年轻群体的拒绝率下降 12 个百分点,坏账率却没有回升。

数据会撒谎,但数字不会。诊断 → 干预 → 量化对比,这套流程让居委会的 AI 终于配得上“幸福家庭识别”这个称号。

AI 应用场景

招聘简历筛选AI

阶段:数据准备与预处理、模型评估审计

解决的问题:传统简历筛选靠 HR 人工初筛,本身带着过去招聘偏好(历史偏差),训练 AI 时又被“过去录用记录”二次污染。通过分布对比诊断 + 重加权 + 公平性约束,系统不再因姓名、学校、性别等代理特征歧视候选人。

具体案例:某科技公司发现筛选模型对女性候选人通过率显著低于男性。诊断发现训练数据源于过去十年录用记录(77% 为男性)。采用重加权与 DP 约束后,人口均等差从 0.18 降至 0.03,整体录用准确率仅下降 1.2%。

智能医疗辅助诊断

阶段:数据采集、模型部署监控

解决的问题:训练数据全部来自城市三甲医院,基层医疗机构数据极少(采样偏差),导致模型对农村人群误诊率高出 20%。通过补充基层数据(重新采集)+ 数据增广(合成多样化影像),显著缩小地区间诊断差距。

具体案例:某视网膜病变筛查模型在乡镇医院部署时召回率大幅崩塌。采样诊断发现训练集八成来自城市体检中心。补充三个基层医疗点数据并加入对抗去偏后,城乡两地 F1 差距从 0.23 降至 0.06。

智能信贷风控

阶段:数据标注管理

解决的问题:信贷审批标签由多个风控员标注,主观判断标准不一(标注偏差),年轻群体被系统性判为“高风险”。用多标注交叉 + Kappa 检验暴露分歧后,重新制定标注规范,显著提升标签可靠性。

具体案例:某消费金融公司发现模型对 30 岁以下群体的拒绝率异常高。诊断发现风控员标注一致性仅 $\kappa = 0.55$。引入统一标注手册与仲裁机制后一致性升至 0.82,模型对年轻群体拒绝率下降 12 个百分点,坏账率未回升。

Python 演示

python58 行
# -*- coding: utf-8 -*-"""三类偏差诊断与重加权缓解演示"""import numpy as npfrom sklearn.linear_model import LogisticRegression  def make_data(n=2400, seed=42):    """生成理想数据集: 三个群体人数均衡, 能力标签与真实评分一致"""    rng = np.random.default_rng(seed)    group = rng.integers(0, 3, size=n)    ability = rng.normal(0.5, 0.15, size=n)    noise = rng.normal(0, 0.10, size=n)    y = (ability + 0.05 * (group == 0) + noise > 0.55).astype(int)    x = np.stack([ability, rng.normal(0, 1, size=n)], axis=1)    return x, y, group  def degrade_data(x, y, g, keep_rate=(1.0, 0.6, 0.3), flip_rate=0.08, seed=7):    """模拟采样偏差(keep_rate 按群体留取) 与标注偏差(随机翻转标签)"""    rng = np.random.default_rng(seed)    keep = np.array([rng.random() < keep_rate[gi] for gi in g])    y2 = y.copy()    flip = rng.random(len(y)) < flip_rate    y2[flip] = 1 - y2[flip]    return x[keep], y2[keep], g[keep]  def parity(y_proba, g):    """人口均等差: 群体0 与群体2 被判为正例概率之差"""    return abs(y_proba[g == 0].mean() - y_proba[g == 2].mean())  def reweight(g):    """数据层缓解: 令每群样本权重与其在总体中的占比成反比"""    observed = np.bincount(g) / len(g)    w = np.array([1.0 / 3.0 / observed[gi] for gi in g])    return w / w.sum() * len(g)  def main():    x, y, g = make_data()    xs, ys, gs = degrade_data(x, y, g)    print("理想群体占比:", np.round(np.bincount(g) / len(g), 3))    print("采集后群体占比:", np.round(np.bincount(gs) / len(gs), 3))     base_model = LogisticRegression(max_iter=500)    base_model.fit(xs, ys)    proba_before = base_model.predict_proba(xs)[:, 1]    print("缓解前人口均等差: %.4f" % parity(proba_before, gs))     fair_model = LogisticRegression(max_iter=500)    fair_model.fit(xs, ys, sample_weight=reweight(gs))    proba_after = fair_model.predict_proba(xs)[:, 1]    print("重加权后人口均等差: %.4f" % parity(proba_after, gs))  if __name__ == "__main__":    main()
目的:合成一个三群体均衡的理想数据集,人为注入采样偏差(群体 0/1/2 分别保留 100%/60%/30%)和标注偏差(随机翻转 8% 标签),然后对比重加权前后的人口均等差,演示“数据层缓解”的实际效果。
  1. y = (ability + 0.05 * (group == 0) + noise > 0.55).astype(int)生成带真实标签的理想数据,标签与能力正相关但群体间无本质差异。
  2. keep = np.array([rng.random() < keep_rate[gi] for gi in g])按群体概率决定样本是否“被拍到”,模拟采样偏差。
  3. y2[flip] = 1 - y2[flip]随机翻转 8% 标签,模拟标注者的主观噪声。
  4. return abs(y_proba[g == 0].mean() - y_proba[g == 2].mean())计算人口均等差:两个群体被判为正例的概率差。
  5. observed = np.bincount(g) / len(g)统计各群体在采集后的实际占比,这是加权的基础。
  6. w = np.array([1.0 / 3.0 / observed[gi] for gi in g])权重 = 理想占比(1/3) ÷ 实际占比,被漏采的群体权重自动放大。
  7. fair_model.fit(xs, ys, sample_weight=reweight(gs))sklearn 原生支持样本权重,一行代码完成重加权训练。

常见误区

误区我只要把训练数据堆到几百万条,样本足够多,偏差自然就消失了。AI 都是靠大数据吃饭的。

正解如果采样机制本身定向遗漏某个群体——比如只在城市线上渠道收集数据,那么数据再多,农村群体依然是空白。采样偏差是“机制问题”而非“数量问题”。就像摄影师只拍上午九点的小区,拍一万张也拍不到上班族。补齐正确渠道的数据,比无脑堆量有效得多。

为何常见:人们直觉上相信大数定律能拯救一切,却忽略了系统性偏差不会随样本量增大而消失。

误区我的模型在测试集上准确率 95%,这么厉害怎么可能有偏见?

正解准确率是全体样本的平均表现,多数群体的高正确率会掩盖少数群体的低正确率。一个小区识别系统对 A 群体 99% 准、对 B 群体 60% 准,平均下来也有 90%。衡量公平必须看各群体分开的指标,比如人口均等差。

为何常见:平均值会稀释少数群体的糟糕表现,人们习惯只盯一个漂亮的 summary 数字。

误区训练前把性别、种族这些敏感字段全部删掉,模型就看不到它们,自然不会有偏见。

正解敏感信息会通过代理变量泄漏——邮编与种族强相关、名字与性别强相关、照片背景与收入强相关。模型不需要显式看到敏感字段,也能从代理特征里学会歧视。这正是对抗去偏的必要之处:主动训练一个判别器去“嗅出”表示里的敏感信息,再强制模型去掉这些痕迹。

为何常见:人们低估了特征之间的关联性,以为“眼不见为净”。

误区既然样本不均衡,就给小群体加权重、在损失里放大它们的贡献,一切就搞定了。

正解重加权主要修复采样偏差带来的比例失衡。但历史偏差已经污染了标签本身——老档案里“幸福”的定义就带着偏见,加权只是放大了错误的声音;标注偏差产生的是系统性标签噪声,加权同样无能为力。需要数据层、模型层多种手段配合。

为何常见:因为“加权”是最常见、最易实现的一招,人们容易把它当成万能药。

误区两个标注者的标注一致率达到 90%,Kappa 很高,标签肯定客观可靠。

正解高一致性只能说明标注者“彼此认同”,但如果他们共享同一个社会偏见——比如都认为“单亲家庭=不幸福”——那么一致性越高,模型学到的偏见越牢固。一致率衡量的是分歧程度,不是正确程度,还需要用无偏的参照标准做校验。

为何常见:人们把“共识”误当成“真理”,忘记了共识也可能是集体偏见。

面试题

Q1. 历史偏差的核心来源是什么?

单选题 · easy

  • A.数据收集过程遗漏部分群体
  • B.训练数据反映既有社会不公← 正确答案
  • C.标注者主观偏好污染标签
  • D.模型训练时过拟合噪声数据

答案:B。历史偏差的本质是训练数据如实复刻了过去社会结构中的不平等,因此选 B。A 指向采样偏差,C 指向标注偏差,D 是模型层面的问题,三者都不是历史偏差的核心来源。

Q2. 采样偏差最典型的表现是什么?

单选题 · easy

  • A.某群体占比远低于真实占比← 正确答案
  • B.标签之间存在明显冲突
  • C.全部样本标签都被标错
  • D.模型在训练集上严重过拟合

答案:A。采样偏差来自采集机制的系统性盲区,典型表现就是某些群体在数据中的占比远低于真实占比,故选 A。B 和 C 属于标注偏差,D 属于模型训练问题,与数据采集无关。

Q3. Cohen's Kappa 系数主要用于衡量什么?

单选题 · easy

  • A.模型分类精度的高低
  • B.样本采集覆盖的广度
  • C.标注者之间的一致性← 正确答案
  • D.历史数据偏离的程度

答案:C。Kappa 排除偶然一致后衡量多位标注者的真实默契程度,用于诊断标注偏差,故选 C。A 是模型指标,B 属于采样偏差范畴,D 是历史偏差诊断范畴。

Q4. 重加权策略最主要的适用对象是什么?

单选题 · mid

  • A.采样偏差造成的群体失衡← 正确答案
  • B.历史偏差造成的标签错误
  • C.标注偏差造成的主观分歧
  • D.模型自身的高方差问题

答案:A。重加权按“理想占比÷实际占比”放大少数群体的损失权重,直接修复采样偏差造成的比例失衡,故选 A。标签错误和主观分歧要用重标注与标注规范解决,高方差要用正则化解决。

Q5. 对抗去偏的核心思想是什么?

单选题 · mid

  • A.训练判别器识别更多攻击样本
  • B.让判别器猜不出敏感属性← 正确答案
  • C.用判别器过滤低质量样本
  • D.用判别器合成更多训练数据

答案:B。对抗去偏同时训练一个判别器去预测样本的敏感属性,主模型则努力让判别器猜不出来,从而把群体信息从表示中剥离,故选 B。识别攻击、过滤样本、合成数据都不是对抗去偏的目标。

Q6. 人口均等差 (DP) 衡量的是什么?

单选题 · hard

  • A.两群体预测正例概率之差← 正确答案
  • B.两群体准确率之间的差异
  • C.两次训练之间模型参数差
  • D.训练分布与真实分布之距

答案:A。DP = |P(ŷ=1|A=0) − P(ŷ=1|A=1)|,是两个群体被判为正例的概率差,故选 A。准确率差异是另外的公平性指标,参数差与分布距离与 DP 无关。

Q7. 历史偏差难以仅靠数据层解决,主要原因是什么?

单选题 · hard

  • A.历史数据体积实在太庞大
  • B.模型容量不足以拟合数据
  • C.缺少足够的算力支持训练
  • D.偏见已沉淀进特征和标签里← 正确答案

答案:D。历史偏差的偏见已经固化在标签本身——比如“幸福”的定义来自不平等的过去,清洗和加权都难以彻底去除,因此需要模型层约束配合,故选 D。数据量大、容量不足、算力缺乏都是干扰项。

Q8. 下列哪些属于数据层缓解策略?

多选题 · mid

  • A.重加权采样← 正确答案
  • B.数据增广合成← 正确答案
  • C.对抗去偏训练
  • D.重新标注清洗← 正确答案

答案:ABD。重加权、数据增广、重新标注都是在数据本身上做文章,故选 A、B、D。对抗去偏是在模型训练过程中引入判别器,属于模型层策略。

Q9. 标注偏差的常用诊断手段包括哪些?

多选题 · hard

  • A.多标注者交叉标注← 正确答案
  • B.计算一致性系数 Kappa← 正确答案
  • C.增加模型参数量
  • D.监测标注漂移情况← 正确答案

答案:ABD。多标注者交叉标注、计算 Kappa、监测标注随时间漂移,都是发现主观偏好的手段,故选 A、B、D。增加模型参数量属于模型结构调整,与标注诊断无关。

Q10. 关于数据集偏差,下列说法正确的有哪些?

多选题 · hard

  • A.三类偏差会层层叠加放大← 正确答案
  • B.删除敏感字段即可消除偏差
  • C.准确率高不等于没有偏见← 正确答案
  • D.需先诊断类型再对症干预← 正确答案

答案:ACD。偏差通过复合函数层层累积,准确率会掩盖群体差异,正确做法是先诊断再干预,故 A、C、D 正确。删除敏感字段后代理变量仍会泄漏信息,B 错误。