“阳光里”社区食堂开张了,管理员老周第一次备菜就闹了笑话:他按自己印象里的“大众口味”准备了 900 份红烧肉,只做了 100 份清蒸鱼,结果清蒸鱼窗口排起长队,红烧肉剩了一大盆。老周这才意识到,他脑袋里的“印象”来自偶然看到的几个大胃王住户,根本代表不了整个社区。这就像机器学习里的数据偏见——模型学到的“口味”完全取决于喂给它的样本,如果训练数据里 900 个样本来自 A 群体、只有 100 个来自 B 群体,模型自然更擅长讨好 A 群体,对 B 群体敷衍了事。好消息是,偏见可以在数据进锅之前就被“掰正”。本文将用老周调菜单的故事,带你走一遍去偏见预处理的全流程:先发现偏见,再通过重采样、数据增强、特征修改把数据清洗干净,最后验证效果,并落实成可复用的工具链。

岗位关联

学懂去偏见预处理,你就能在模型训练前把数据的“公平底子”打好,避免上线后被曝出歧视性决策。这是数据工程师、特征工程师和数据质量团队的核心技能,也是 AI 伦理落地中最实在的切入点。

目录
  1. 可视化演示
  2. 偏见从何而来
  3. 偏见数据检测
  4. 重采样平衡
  5. 数据增强
  6. 特征修改去偏
  7. 效果验证
  8. 工具与实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示去偏见预处理的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

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

去偏见预处理:去偏见预 去偏见预处理的概念与价值定位 数据偏见的来源与类型分析 核心机制可视化 去偏见预处理整体架构与关键组件

偏见从何而来

“阳光里”社区食堂开业,管理员老周准备了 900 份红烧肉和 100 份清蒸鱼。他满以为大家爱吃肉,结果清蒸鱼窗口排起长队,红烧肉却剩了大半。老周后来才明白,他心里的“大众口味”其实是被自己偶然看到的几个饭量大的住户带偏的——开饭前的备菜比例,就已经决定了这顿饭不可能人人满意。

机器学习的数据集就像这锅备好的菜。模型学到的“口味”完全来自喂给它的样本,如果训练数据里 900 个样本属于 A 群体、只有 100 个属于 B 群体,模型自然更擅长讨好 A 群体。这种源头上的不平衡就叫数据偏见。它通常有四个来源:采样偏差是数据采集只覆盖了容易接触的人群;群体失衡是不同群体的样本数量悬殊;特征代理是敏感属性藏在看似无害的字段里;标注偏见是人工打标签时掺入了主观倾向。

动手掰正数据之前,先要把失衡程度量化。最直观的指标是少数群体与多数群体的样本数量之比:当比值远小于 1 时,模型几乎没有足够证据学习少数群体的规律,预测就会天然偏向多数群体。

老周看着那两口锅,心里明白问题不在厨艺,而在备菜的比例。数据工程师也一样:先看清食材比例,才知道接下来从哪儿下手清洗。

ρ=nmin⁡nmaj\displaystyle \rho = \frac{n_{\min}}{n_{\text{maj}}}
这个比值衡量两类群体在数据集里的“出镜率”差距。接近 1 说明样本数量均衡,远小于 1(比如 0.1)说明少数群体被严重忽视。
  1. 少数群体样本数数据集里属于少数群体的样本总量,一般由性别、种族、年龄段等敏感属性划分得到。
    nmin⁡n_{\min}
  2. 多数群体样本数数据集里样本量占优势的群体的样本总数。
    nmajn_{\text{maj}}
  3. 样本量比值两个样本数相除。比值越小,模型的“注意力”越会被多数群体垄断。
    ρ=nmin⁡nmaj\rho = \frac{n_{\min}}{n_{\text{maj}}}

偏见数据检测

老周拿出店长日志,把一个月里每位街坊来了几次、点什么菜、剩了多少都记录下来。他特别注意那些“看起来无关”的记录——比如某道菜只在周三剩得多,是因为周三的厨师是临时工,而不是街坊不爱吃。记录和盘点,是调整菜单前的第一步。

数据侧的偏见检测就是做一次系统性的“台账盘点”。做法包括:按敏感属性分组统计样本量和正例占比,对比各组的特征均值与方差,识别与敏感属性高度相关的代理特征,并梳理数据集里到底有哪些敏感属性字段。只有先把偏见“看见”,才能谈得上清理。

一个常用的检测口径是群体正例率差:分别计算各组中正例(比如“贷款获批”“面试通过”)的占比,并比较差异。这个差值越大,说明数据在不同群体之间已经把不公平写进了事实。

老周发现,日志里“是否住在北区”这一项和口味高度相关——北区住户爱吃辣,食堂就多做了辣菜,这可苦了不吃辣的南区街坊。这个字段就是一个典型的代理特征,需要在后续清洗中重点处理。

Δ=∣ng=1+ng=1−ng=0+ng=0∣\displaystyle \Delta = \left| \frac{n_{g=1}^{+}}{n_{g=1}} - \frac{n_{g=0}^{+}}{n_{g=0}} \right|
它衡量两个群体在数据里获得“好结果”的比例差距。差值越大,偏见倾向越明显;为 0 时,两个群体在正例比例上完全一致。
  1. 少数群体正例占比先把少数群体中标签为正类的样本数算出来,再除以少数群体总样本数。
    ng=1+ng=1\frac{n_{g=1}^{+}}{n_{g=1}}
  2. 多数群体正例占比用同样的方式计算多数群体的正例占比。
    ng=0+ng=0\frac{n_{g=0}^{+}}{n_{g=0}}
  3. 正例率差两个比例相减并取绝对值。差值超过预设阈值(比如 0.1),就判定数据存在明显偏见。
    Δ=∣ng=1+ng=1−ng=0+ng=0∣\Delta = \left| \frac{n_{g=1}^{+}}{n_{g=1}} - \frac{n_{g=0}^{+}}{n_{g=0}} \right|

重采样平衡

老周决定调整菜量:红烧肉少做 400 份,清蒸鱼多做 400 份。他还把清蒸鱼改成小份,让更多街坊尝得到。道理很简单——菜量不平均,再怎么介绍菜谱,大家的满意度也不会平均。

在数据层面,这种调整叫重采样。最基础的做法有两种:欠采样是从多数类里随机移除一部分样本,让多数类“减肥”;过采样是复制少数类样本,让少数类“增重”。但直接复制会产生大量一模一样的样本,模型容易死记硬背。于是有了更聪明的 SMOTE 方法:在少数类样本和它的近邻之间做插值,合成全新的、但仍是少数类身份的样本。

SMOTE 的核心公式非常直观:新样本等于原来的少数类样本,沿“它和某个邻居的连线上”走一小步。

老周一边调整菜量,一边提醒自己:光把清蒸鱼的数量堆上去还不够,如果只是反复热同一锅,街坊还是会腻。于是他开始琢磨给同一条鱼换花样——这就引出了下一节的数据增强。

xnew=xi+λ(xnn−xi),λ∼U(0,1)\displaystyle x_{\text{new}} = x_i + \lambda (x_{\text{nn}} - x_i), \qquad \lambda \sim U(0,1)
这是在少数类样本和随机邻居之间“踩一脚”:λ 在 0 到 1 之间随机取值,决定新样本站在连线的哪个位置。新样本既有原样本的“影子”,又和原样本不完全相同。
  1. 原样本选一个少数类样本作为合成起点,它是新样本的“基础版”。
    xix_i
  2. 邻居方向随机挑一个少数类邻居,计算两者差距,这个差距指明了插值的“路线”。
    xnn−xix_{\text{nn}} - x_i
  3. 随机步长λ 在 0 到 1 之间随机取数,决定新样本离起点多远。λ=0 就是原样本,λ=1 就是邻居本人。
    xnew=xi+λ(xnn−xi)x_{\text{new}} = x_i + \lambda (x_{\text{nn}} - x_i)

数据增强

清蒸鱼数量上来了,可菜单上只有清蒸一种做法,老街坊吃三次就腻了。老周把同一条鱼做成清蒸、红烧、鱼丸汤、香煎鱼排——鱼还是那条鱼,但做法多了,尝过的人自然也多了。食材本身没变,出场的姿势变了。

数据增强就是给少数群体样本“换做法”。它通过对已有样本施加保持标签不变的变换,生成更多多样化样本。图像领域常用旋转、翻转、裁剪和颜色扰动;文本领域常用同义改写、回译和模板替换;表格数据则可以向已知的少数类样本注入小幅噪声,造出新样本。核心原则只有一个:变换不能改变样本的语义身份——鱼翻个面还是鱼,不能把鱼变成牛肉。

用公式表达,增强就是对原始样本施加一个变换 T,同时保持标签不变:

老周的菜单丰富了,关键是每道鱼的做法虽不同,但确实是鱼——标签“鱼”没变。数据增强的精髓正在于此:在不改身份的前提下,增加少数群体的出镜机会和多样性。

x~=T(x),y~=y\displaystyle \tilde{x} = T(x), \qquad \tilde{y} = y
变换 T 负责制造“新花样”,标签 y 保持不变。这条约束保证了增强不会给数据引入错误标注,也让少数群体的样本量得以安全扩充。
  1. 原始样本少数群体里的一条真实样本,它是增强的素材来源。
    xx
  2. 保持标签的变换对样本做旋转、改写或加噪声等操作,生成新样本 x-tilde。
    x~=T(x)\tilde{x} = T(x)
  3. 标签不变约束人为规定变换前后标签相同,防止增强过程污染数据质量。
    y~=y\tilde{y} = y

特征修改去偏

菜单上原先标着“本地人推荐”“外地人试吃”——有些街坊看了不自在,老周索性把地区标签全撕了,只看口味偏好推荐。标签一去,大家的选择变得更自然了。

特征修改的目标就是撕掉这类“敏感标签”。最直接的方法是删除敏感属性,比如性别、种族、户籍字段。但光删除还不够——敏感信息常常会借道其他字段“还魂”,比如住址、姓名、就读学校。这就需要特征遮蔽:把精确值变成粗略值,如把具体年龄改成年龄段,降低信息的辨识度。更进一步是特征重组:构造与敏感属性无关的新特征,比如用“每月结余”替代“性别加职业”这种组合。

那么如何衡量一个特征与敏感属性纠缠得有多深?可以用互信息:它量化两个变量共享的信息量。互信息越大,说明该特征越容易泄露敏感身份,也就越需要处理。

老周撕掉地区标签后,后厨仍然可能从“口味偏咸”猜出一些人来自哪里——但信息少了,决策就更公平了。特征修改不是彻底抹掉信息,而是把敏感信息从决策链路上卸下来。

I(X;S)=∑x∈X∑s∈SP(x,s)log⁡P(x,s)P(x)P(s)\displaystyle I(X;S) = \sum_{x \in X} \sum_{s \in S} P(x,s)\log\frac{P(x,s)}{P(x)P(s)}
互信息看的是“知道 X 之后,对猜测 S 有没有帮助”。如果 X 和 S 完全独立,对数为 0;关联越强,数值越大。去偏的目标是降低 X 与敏感属性 S 的互信息,同时保留 X 对预测标签有用的部分。
  1. 联合分布X 和 S 同时取某对值的概率,反映两者一起出现的频率。
    P(x,s)P(x,s)
  2. 独立性比较把联合概率和“两者独立时的概率乘积”做比较,差得越远说明关联越强。
    log⁡P(x,s)P(x)P(s)\log\frac{P(x,s)}{P(x)P(s)}
  3. 全局求和遍历 X 和 S 的所有取值,把每个格子的关联度累加起来,得到总互信息量。
    I(X;S)=∑x∈X∑s∈SP(x,s)log⁡P(x,s)P(x)P(s)I(X;S) = \sum_{x \in X} \sum_{s \in S} P(x,s)\log\frac{P(x,s)}{P(x)P(s)}

效果验证

调整了半个月菜单,老周做了一次满意度调查,分头问老街坊和年轻人:菜量够不够、口味合不合适。他还把两个月的剩菜记录翻出来对比。不看数据就宣称“现在公平了”,和闭着眼睛炒菜没什么区别。

效果验证就是用指标确认预处理真的起了作用。常用的做法包括:分别统计各敏感群体在预处理前后的正例占比和样本量,计算统计奇偶差(SPD)等公平性指标,再用交叉验证确认结果不是偶然波动。若预处理有效,SPD 应该显著下降并低于预设阈值。

老周的满意度表显示,原来 35% 的街坊说“分量不公平”,调整后降到了 12%。数据也一样,预处理之后要拿着指标复检,不能凭感觉说“应该公平了”。

SPD=∣TPg=1TPg=1+FNg=1−TPg=0TPg=0+FNg=0∣\displaystyle \text{SPD} = \left| \frac{TP_{g=1}}{TP_{g=1}+FN_{g=1}} - \frac{TP_{g=0}}{TP_{g=0}+FN_{g=0}} \right|
SPD 比较两个群体在模型输出中的“优惠待遇差异”。真正公平的系统,各群体的真正例率(TPR)应当接近,差异越小越好。
  1. 群体 1 的真正例率在少数群体里,被正确预测为正例的样本占该群体所有真实正例的比例。
    TPg=1TPg=1+FNg=1\frac{TP_{g=1}}{TP_{g=1}+FN_{g=1}}
  2. 群体 0 的真正例率用同样方式计算多数群体的真正例率。
    TPg=0TPg=0+FNg=0\frac{TP_{g=0}}{TP_{g=0}+FN_{g=0}}
  3. 差值判断两个率相减取绝对值。SPD 越小,说明两个群体获得的“正确认可”越均等。
    ∣TPg=1TPg=1+FNg=1−TPg=0TPg=0+FNg=0∣\left| \frac{TP_{g=1}}{TP_{g=1}+FN_{g=1}} - \frac{TP_{g=0}}{TP_{g=0}+FN_{g=0}} \right|

工具与实践

老周把这次的经验写进《阳光里食堂管理手册》:备菜前先看台账,每周盘点一次菜量,新街坊入住就重新摸底。他还把操作步骤教给帮厨,让公平配餐成为固定流程而不是一次性的灵感发挥。

落到实际工程里,预处理去偏也有一套成熟工具链:用 ydata-profiling 做数据探索和分布对比,用 imbalanced-learn 实现过采样、欠采样和 SMOTE,用 Fairlearn 计算并监控公平性指标。同时要守住责任边界:预处理只能缓解数据层面的偏见,模型训练和部署阶段仍需模型侧的公平约束配合。生产环境要把清洗流程封装成自动流水线,并持续监控线上数据分布,防止偏见回流。

一个实用的估算公式,用来预先计算重采样之后的数据总量:

手册写好后,老周在食堂门口贴了一张告示:“每道菜的分量都会定期核对,欢迎街坊监督。”公平不是一次性的清洗,而是长期的习惯——数据工程也是如此。

N′=nmaj×(1−u)+nmin⁡×(1+o)\displaystyle N' = n_{\text{maj}} \times (1 - u) + n_{\min} \times (1 + o)
u 是多数类的欠采样删除比例,o 是少数类的过采样新增比例。这个公式帮你预先评估重采样后的数据规模,避免把训练集撑得过大或削得太薄。
  1. 多数类调整后数量多数类原样本量乘以(1 - 删除比例),得到欠采样后的样本数。
    nmaj×(1−u)n_{\text{maj}} \times (1 - u)
  2. 少数类调整后数量少数类原样本量乘以(1 + 新增比例),得到过采样后的样本数。
    nmin⁡×(1+o)n_{\min} \times (1 + o)
  3. 总量加和把两组调整后的样本数相加,就是重采样后的总数据规模。
    N′=nmaj×(1−u)+nmin⁡×(1+o)N' = n_{\text{maj}} \times (1 - u) + n_{\min} \times (1 + o)

AI 应用场景

信贷风控中的公平审批

阶段:数据准备与特征工程

解决的问题:历史信贷数据里男性申请者占主导,模型对女性群体的通过率明显偏低,且有“婚姻状况”“居住片区”这类易泄漏敏感信息的字段。传统做法直接拿原始数据训练,会把历史歧视固化进模型。

具体案例:某消费金融公司发现女性申请者的拒绝率是男性的 2.1 倍。预处理团队先按性别分组统计正例占比,确认偏见存在;随后用 SMOTE 对女性违约样本做合成过采样,并对多数类男性样本做欠采样;最后删掉性别、婚姻状态字段,并用“居住片区”重编码为与性别低相关的聚类特征。重训后的评分卡在保持整体 AUC 基本不变的情况下,SPD 从 0.22 降到 0.04。

招聘简历筛选的去偏见清洗

阶段:数据采集与清洗

解决的问题:历史简历数据中男性候选人占 80%,且“是否本地户口”字段与录用结果高度相关,导致外地与女性候选人被系统性筛掉。传统筛选流程只按最终录取结果复盘,很难定位到数据源头的问题。

具体案例:一家人力资源 SaaS 公司对三年历史简历做预处理:欠采样男性简历控制到 60% 以内,用同义改写和模板替换增强女性候选人的简历样本;然后删除性别、户籍字段,并把“学校名称”遮蔽为“学校层次”。清洗后的简历数据用于训练初筛模型,使得不同性别候选人的简历通过率差距缩小了 68%。

医疗影像中少数人群样本增强

阶段:数据增强

解决的问题:某皮肤科影像数据集的浅肤色样本占 90%,深肤色样本不足,模型对深肤色患者的病灶识别准确率明显偏低。直接复制深肤色样本无法提升泛化能力。

具体案例:算法团队对深肤色病灶图像执行旋转、亮度扰动、弹性形变和色彩增强,把深肤色样本从 800 张扩到 3500 张,同时保持诊断标签不变。增强后的数据集重新训练模型,深肤色人群的敏感性和特异性分别提升了 12% 和 9%。

Python 演示

python71 行
import numpy as np  def make_biased_data(seed=42):    rng = np.random.default_rng(seed)    n_maj, n_min = 900, 100    x_maj = rng.normal([30, 5000], [5, 800], (n_maj, 2))    x_min = rng.normal([38, 8200], [6, 1200], (n_min, 2))    X = np.vstack([x_maj, x_min])    S = np.array([0] * n_maj + [1] * n_min, dtype=int)    Y = np.zeros(n_maj + n_min, dtype=int)    Y[S == 0] = rng.binomial(1, 0.6, n_maj)    Y[S == 1] = rng.binomial(1, 0.3, n_min)    return np.column_stack([X, S]), Y  def report(X, Y, title):    S = X[:, 2].astype(int)    print("==", title, "==")    for g in (0, 1):        mask = S == g        rate = Y[mask].mean()        print("group", g, "samples", int(mask.sum()),              "positive_rate", round(rate, 3))  def smote_features(X_feat, n_needed, seed=7):    rng = np.random.default_rng(seed)    idx = rng.integers(0, len(X_feat), n_needed)    lam = rng.random(n_needed).reshape(-1, 1)    return X_feat + lam * (X_feat[idx] - X_feat)  def rebalance(X, Y, target=0.5, seed=7):    rng = np.random.default_rng(seed)    S = X[:, 2].astype(int)    x_maj, x_min = X[S == 0], X[S == 1]    y_maj, y_min = Y[S == 0], Y[S == 1]    n_maj_t = min(len(x_maj), 500)    keep = rng.choice(len(x_maj), n_maj_t, replace=False)    x_maj_new, y_maj_new = x_maj[keep], y_maj[keep]    n_min_t = int(n_maj_t * target)    if len(x_min) < n_min_t:        x_min_new_feat = smote_features(x_min[:, :2], n_min_t)        x_min_new = np.column_stack([x_min_new_feat,                                     np.ones(n_min_t, dtype=int)])        y_min_new = np.resize(y_min, n_min_t)    else:        keep_min = rng.choice(len(x_min), n_min_t, replace=False)        x_min_new, y_min_new = x_min[keep_min], y_min[keep_min]    X_bal = np.vstack([x_maj_new, x_min_new])    Y_bal = np.concatenate([y_maj_new, y_min_new])    return X_bal, Y_bal  def drop_sensitive(X_bal):    return X_bal[:, :2], X_bal[:, 2].astype(int)  def main():    X, Y = make_biased_data()    report(X, Y, "before")    X_bal, Y_bal = rebalance(X, Y)    report(X_bal, Y_bal, "after resample")    X_clean, S_bal = drop_sensitive(X_bal)    print("clean shape:", X_clean.shape,          "minority count:", int(S_bal.sum()))  if __name__ == "__main__":    main()
目的:演示去偏见预处理的完整流程——构造有偏数据、检测群体失衡、用 SMOTE 过采样少数类并欠采样多数类、最后删除敏感属性列。
  1. rng.binomial(1, 0.6, n_maj)模拟多数群体 60% 的正例占比,制造群体间机会差异。
  2. Y[S == 0] = ...按敏感属性分组给标签赋值,让偏见“写进”数据。
  3. def smote_features(...)在少数类特征上做插值合成,避免复制出完全相同的样本。
  4. lam = rng.random(n_needed).reshape(-1, 1)生成随机步长,控制新样本在连线上的位置。
  5. np.resize(y_min, n_min_t)周期复用少数类标签,保持标签分布与原始一致。
  6. np.column_stack([x_min_new_feat, np.ones(n_min_t, dtype=int)])合成样本的敏感属性强制设为 1,防止插值破坏身份列。
  7. rng.choice(len(x_maj), n_maj_t, replace=False)无放回抽样,实现随机欠采样。
  8. drop_sensitive(X_bal)删除敏感属性列,只保留与预测任务相关的两个特征。

常见误区

误区我把性别、种族这些字段从数据里删掉,模型就看不出群体身份了,偏见自然也就消失了。

正解敏感信息常常藏在代理变量里——住址、姓名、就读学校、兴趣爱好都可能泄漏群体身份。删掉性别列,但保留“是否住某片区”,模型照样能推断出性别。正确的做法是删除敏感属性之后,还要继续排查代理特征,必要时对它们做遮蔽或重组。就像老周撕掉了“本地/外地”标签,但“口味偏咸”这个特征仍然藏着籍贯信息。

为何常见:直觉上认为“看不见就等于没有”,忽略了变量之间天然存在的相关性。

误区过采样和欠采样之后,两类样本数量均衡了,偏见就彻底解决了,可以放心训练模型。

正解重采样只解决了“样本数量”的问题,标签本身可能仍然带着偏见——比如标注者对少数群体的评价系统性偏低。如果标签有偏,样本再平衡也只是把错误放大得更加均匀。正确流程是:先做数据清洗和标注质量复查,再考虑重采样。

为何常见:把“数量平衡”直接等同于“质量公平”,忽视了偏见可能藏在标签值里。

误区少数群体样本太少,那我就多复制几倍、十几倍,样本量一下子追上多数类,模型总该学得好了吧?

正解直接复制会产生大量重复样本,模型会对这些样本死记硬背,导致过拟合,泛化能力反而变差。SMOTE 这类插值合成方法比直接复制更平滑,但也要控制增强倍数——实践中少数类与多数类比例调到 50% 到 80% 往往比 100% 更稳妥。

为何常见:误以为“样本多=信息多”,忽略了重复样本的边际信息是零。

误区上线前去过一次偏见,模型之后就一直是公平的,不需要再动数据。

正解真实世界的数据分布会漂移——新用户组成会变,政策环境会变,当年清洗好的数据集放到半年后可能又偏了。生产环境必须持续监控公平性指标(如 SPD),定期用最新数据重新评估和清洗。老周的手册里写着“每周盘点一次菜量”,公平也需要同样的运维节奏。

为何常见:把公平性看成一次性“消毒”,而不是需要长期维护的系统工程。

面试题

Q1. 去偏见预处理发生在机器学习流程的哪个阶段?

单选题 · easy

  • A.数据采集之后训练之前← 正确答案
  • B.模型训练过程之中
  • C.模型部署上线之后
  • D.最终效果评估阶段

答案:A。去偏见预处理属于数据准备阶段,就像老周在开饭前调整菜量,而不是等菜上桌后再补救。B、C、D 分别是训练、部署、评估阶段,都不属于数据预处理。

Q2. 某数据集少数群体样本只有多数群体的 5%,最直接的处理方法是?

单选题 · easy

  • A.重采样平衡群体数量← 正确答案
  • B.加大模型训练轮数
  • C.调高模型学习率
  • D.减少数据集总样本

答案:A。样本量悬殊是典型的数据层失衡,重采样(过采样少数类、欠采样多数类)直接调整样本比例。加大训练轮数或学习率属于模型训练手段,无法改变数据本身的分布;减少总样本只会让信息更少。

Q3. SMOTE 生成新样本的核心思路是?

单选题 · mid

  • A.在少数类样本与邻居间插值← 正确答案
  • B.随机复制多数类样本
  • C.删除一条少数类样本
  • D.修改少数类样本标签

答案:A。SMOTE 的公式是给少数类样本与其邻居做插值,生成“既像原样本又不完全相同”的新样本。B 是过采样的朴素版,C 是欠采样,D 会污染标签。

Q4. 只删除性别字段并不能保证消除偏见,因为?

单选题 · mid

  • A.性别字段数据量太大删不干净
  • B.其他特征可能成为性别代理变量← 正确答案
  • C.模型会把删除字段作为学习目标
  • D.删除字段会降低模型准确率

答案:B。居住地、姓名、职业等字段可能与性别高度相关,成为代理变量。删除显式字段后,模型仍能通过代理特征间接推断敏感属性。A、C 不符合机器学习常识,D 是可能的副作用但并非根本原因。

Q5. 欠采样(随机删除多数类样本)的主要风险是?

单选题 · hard

  • A.训练集变大导致训练变慢
  • B.可能丢失多数类中的重要信息← 正确答案
  • C.标签错误率一定会上升
  • D.模型一定发生严重过拟合

答案:B。随机欠采样在缩小多数类的同时,可能把一些有代表性的样本一起删掉,造成信息丢失。A 说反了,欠采样会使训练集变小;C 和 D 都用了“一定”,过于绝对。

Q6. 预处理后某数据集群体正例占比差从 0.3 降到 0.05,但训练出的模型预测仍有偏差,可能的原因是?

单选题 · extreme

  • A.偏见也可能来自模型训练环节← 正确答案
  • B.正例占比差与模型预测无关
  • C.模型目标函数自带公平约束
  • D.数据预处理必然没有生效

答案:A。数据层面的清理只解决输入侧的问题,模型训练时的损失函数、优化目标和样本权重仍可能引入不公平。B 说无关不对,C 自带公平约束反而是减少偏差的手段,D 过于绝对。

Q7. 特征修改中“特征重组”与“删除敏感属性”的根本区别是?

单选题 · hard

  • A.重组保留判别信息而删除直接丢弃← 正确答案
  • B.重组只对图像有效而删除只对表格有效
  • C.删除会加剧过拟合而重组不会过拟合
  • D.删除需要更多算力而重组不需要算力

答案:A。特征重组通过构造与敏感属性低相关的新特征,保留对预测有用的判别信息;删除敏感属性则简单粗暴地丢弃整列信息。B、C、D 的说法都不符合工程实际。

Q8. 下列哪些属于数据增强方法?

多选题 · easy

  • A.图像旋转与翻转← 正确答案
  • B.文本同义改写← 正确答案
  • C.删除全部多数类样本
  • D.表格特征注入小噪声← 正确答案

答案:ABD。图像旋转翻转、文本同义改写、表格加噪声都是保持标签不变的变换,属于数据增强。C 是欠采样,不属于增强。

Q9. 数据层面的偏见可能来自哪些环节?

多选题 · mid

  • A.数据采样偏差← 正确答案
  • B.群体样本数量失衡← 正确答案
  • C.标注者主观倾向← 正确答案
  • D.模型激活函数选取

答案:ABC。采样偏差、群体失衡、标注偏见都是数据层的偏见来源。D 属于模型架构层面的选择,与数据预处理无关。

Q10. 预处理去偏后验证公平性,常用的做法包括?

多选题 · hard

  • A.分别统计各群体正例占比← 正确答案
  • B.计算统计奇偶差等公平指标← 正确答案
  • C.交叉验证确认结果稳定← 正确答案
  • D.只看模型总体准确率

答案:ABC。分群体统计正例占比、计算 SPD、交叉验证都是效果验证的标准手段。D 只关注总体准确率,会掩盖群体间的差异,无法判断公平性。