拿到一份真实数据,就像收到一箱刚摘下来的水果——有的饱满光洁,有的磕了碰了,有的甚至一半烂掉了。直接拿去卖,顾客会投诉;全扔掉,又太浪费。数据里的“坏果子”,就是缺失值:某个字段空着、某一行不完整。它们无处不在,处理不好,你训练出来的模型就像一个尝了烂苹果的顾客,满嘴都是怪味。 别担心,处理缺失值不是玄学,而是一门“挑拣 + 修补”的手艺。你可以把坏果子扔掉(删除),也可以把烂掉的部分削掉、再拿别的果子补上(填充),甚至可以请一个“老练的师傅”根据其他果子的大小推测这个果子本该有多甜(模型预测)。这篇教程,就是带你学会这门手艺的完整工具箱。我们会从理解“果子为什么会坏”(缺失机制)开始,逐一认识各种修补方法,最后学会在什么时候该用哪一把“刀”。

岗位关联

对 AI 从业者来说,这是基本功中的基本功。数据决定了模型的上限,处理缺失值的能力直接决定你喂给模型的“食材”是好是坏,最终影响模型效果与业务决策的可靠性。

目录
  1. 可视化演示
  2. 缺失机制分类
  3. 删除法抉择
  4. 统计填充法
  5. KNN填充法
  6. 模型预测填充
  7. 策略评估选择
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示数据矩阵中缺失值的删除、均值、KNN和模型预测四种填充过程及方法性能对比,通过滑块调节缺失率。

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

数据填充:四种方法处理缺失值 DEL删除/AVG均值/KNN近邻/MDL模型预测 缺失机制MCAR/MAR/MNAR决定策略选择 missing_rate → method_selection 缺失率低于5%可删除,高于40%考虑丢弃特征。

缺失机制分类

想象你是一个班主任,发现班里有几个学生没交数学作业。你要搞清楚的第一件事是:他们为什么没交?是无差别地随机忘了(比如所有科目都偶尔有人漏交),还是因为昨天数学课太难、正好班上数学弱的同学没交?又或者,就是因为作业太难、大家故意不交?这三种情况,对应了三种完全不同的“缺失机制”——完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)。

MCAR 是最“单纯”的情况:数据缺失与任何变量都无关,纯粹是意外。比如调查问卷被咖啡泼了,某几题看不清。此时,你手里的完整数据就像从全班随便抽的样本,依然能代表总体。MAR 是更常见的情况:缺失与已观测到的其他变量有关,但与被缺失的变量本身无关。比如收入字段缺失的人,恰好大多是“学生”这个职业——职业是已知的,收入是缺失的。MNAR 则最麻烦:缺失与否与缺失值本身有关。比如高收入人群可能故意不填收入,你看到的“低收入”数据其实是假象。

回到班主任的比喻:MCAR 像作业本掉水沟里,纯属意外;MAR 像是“昨天没来上课的同学没交”,原因可查;MNAR 像是“成绩差的同学故意不交”,你完全看不到真相。理解这些,你才知道该用哪把“修补刀”——MCAR 用删除法损失小,MAR 可以用其他特征来预测填充,MNAR 则要格外谨慎,甚至要专门建模处理缺失本身。

P(缺失)={常数,MCARf(已观测变量),MARf(缺失变量本身),MNARP(\text{缺失}) = \begin{cases} \text{常数}, & \text{MCAR} \\ f(\text{已观测变量}), & \text{MAR} \\ f(\text{缺失变量本身}), & \text{MNAR} \end{cases}
三种机制决定了你能否“放心补数据”:MCAR 补起来最安全,MAR 可以基于其他变量建模补,而 MNAR 是最棘手的,盲目填充会系统性地引入偏差。
  1. MCAR 情形缺失概率是一个常数,不依赖任何变量。
    P(缺失)=cP(\text{缺失}) = c
  2. MAR 情形缺失概率依赖已观测到的其他变量 $X_{\text{obs}}$。
    P(缺失)=f(Xobs)P(\text{缺失}) = f(X_{\text{obs}})
  3. MNAR 情形缺失概率依赖缺失变量本身的值。
    P(缺失)=f(Xmissing)P(\text{缺失}) = f(X_{\text{missing}})

删除法抉择

“坏果子直接扔掉”是最朴素的想法。删除法分两种:删行(去掉某些样本)和删列(去掉某些特征)。什么时候该删?当缺失比例很低(比如 5% 以内)时,直接删掉这些行,既简单又不影响大局。就像一箱苹果里只有一两个碰伤的,扔掉不心疼。但注意,删除法是有代价的——你把“果肉”连着“烂疤”一起扔了,如果缺失不是随机的,你留下的样本会有偏差,就像留下了一箱偏小的苹果。

列删除法则是“这整箱果子都有问题,干脆不卖这个品种了”。当一个特征缺失超过 70%-80%,它的信息价值已经微乎其微,强行填充只会引入大量人为噪声,不如直接放弃。但列删除要慎重:如果你删掉的是一个重要特征(比如预测房价时的“面积”),模型就失去了关键的预测能力。

把删除法想成果园主分拣:碰伤少的(缺失比例低)可以扔掉坏的(删行),整批都烂的果子(缺失比例高的列)果断放弃进货。不过,这招只是“止损”,不是“增值”。就像扔掉坏果子并不能变出新果子,删除法只会减少数据量,不会增加信息量。所以,只有当你确认缺失比例足够低、删掉后不影响数据代表性时,才是明智选择。

删除后样本量=N×(1−rmissing)\text{删除后样本量} = N \times (1 - r_{\text{missing}})
其中 $N$ 是总样本量,$r_{\text{missing}}$ 是含缺失的样本比例。删行相当于把所有“有空缺的记录”从表格里抽走。
  1. 样本总数$N$ 表示数据集中的总样本数。
    N=总行数N = \text{总行数}
  2. 缺失比例$r_{\text{missing}}$ 表示含缺失值的样本占比。
    rmissing=含缺失的行数Nr_{\text{missing}} = \frac{\text{含缺失的行数}}{N}

统计填充法

既然扔掉可惜,那就想办法补。最直观的方式是“拿平均水平来凑”——这就是统计填充法。你问班里同学“你们猜这道题的答案平均是多少”,然后把这个平均值填在空缺处。均值填充、中位数填充、众数填充是三种最常见的选择。均值对异常值敏感,就像班里有一个同学考了 100 分,平均值就被拉高了;中位数是排序后中间那个数,更“抗揍”;众数则是出现次数最多的值,适合类别型数据,比如用“男”来填充性别字段里的空白。

填充并非越精确越好,而是要看场景。如果数据是收入这类偏态分布,中位数往往比均值更稳健;如果是性别、城市这类类别变量,用众数最合适。还有一种“常量填充”,比如用 0 填充缺失,通常用于那些“0 本身有业务含义”的场景(比如消费金额缺失可以当作没有消费记录)。统计填充法简单高效,代价是会引入偏差——就像全班都穿均码校服,身材各异的人都被“平均”了。

统计填充法就像是给所有“空着的座位”安排了一个“虚拟的平均同学”坐上去。它不会让数据变得更真实,但至少保证表格填满了、模型不会因为空值报错。问题是,这个“平均同学”可能和谁都不像——它抹平了个体差异,压缩了数据的波动性。当你对数据精度要求不高、或缺失比例较小时,这是一把趁手的好刀;但当缺失比例较高时,这把刀就钝了。

xˉ=1n∑i=1nxi,x~=x(n+1)/2(n 为奇数)\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i, \quad \tilde{x} = x_{(n+1)/2} \quad (n \text{ 为奇数})
$\bar{x}$ 是均值,$\tilde{x}$ 是中位数。均值适合对称分布,中位数适合偏态分布。
  1. 均值公式把所有值加起来除以个数。
    xˉ=1n∑i=1nxi\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i
  2. 中位数公式排序后取中间那个值(奇数个时是正中间,偶数个时取中间两个的平均)。
    x~=x(n+1)/2\tilde{x} = x_{(n+1)/2}
  3. 众数出现频率最高的值。
    Mode=arg⁡max⁡xcount(x)\text{Mode} = \arg\max_x \text{count}(x)

KNN填充法

“想知道某个人大概多高?看看他的几个好朋友就知道了。”KNN 填充就是这种思路:找到与缺失样本最相似的 K 个邻居,然后用它们的值来估算缺失值。这里的“相似”通常用欧氏距离度量——两个样本在所有特征上的距离越近,就越相似。比如一个样本有年龄、职业、收入、评分,另一个样本在这几个字段上都很接近,那它们的“收入”也很可能接近。

K 值的选择很关键。K 太小,容易受个别异常点影响——就像一个学生只有一两个朋友,万一这个朋友是特长生,估计就不准了;K 太大,会把远处的“泛泛之交”也拉进来平均,反而稀释了相似性。通常 K 取 5 到 10 之间,并通过交叉验证调整。计算出邻居后,简单的方法是取平均值,进阶的做法是加权平均——距离越近的邻居,话语权越大,就像关系越好的朋友,你越相信他的判断。

KNN 填充比统计填充更“聪明”,因为它利用了个体之间的相似性,而不是让所有人都向平均值靠拢。但也别把它想得太神——它需要特征之间确实存在相关性,如果特征本身毫无关联,找出来的“邻居”只是表面接近,填出来的值也不可靠。就像硬要跟一个陌生人做朋友,他给不了你真正贴心的建议。此外,KNN 填充在样本量很大时计算成本高,要对每个缺失样本都做一次全表扫描找邻居。

d(i,j)=∑k=1p(xik−xjk)2d(i,j) = \sqrt{\sum_{k=1}^{p}(x_{ik} - x_{jk})^2}
这是欧氏距离公式,$p$ 是特征数量。它能算出两个样本在特征空间中的“直线距离”。
  1. 特征差异对每个特征 $k$ 计算样本 $i$ 和样本 $j$ 的差。
    (xik−xjk)(x_{ik} - x_{jk})
  2. 平方和累加把每个特征差距平方后加起来,消除正负抵消。
    ∑k=1p(xik−xjk)2\sum_{k=1}^{p}(x_{ik} - x_{jk})^2
  3. 开平方得到最终的欧氏距离。
    d(i,j)=∑k=1p(xik−xjk)2d(i,j) = \sqrt{\sum_{k=1}^{p}(x_{ik} - x_{jk})^2}

模型预测填充

比“问朋友”更高级的,是“问专家”。模型预测填充把缺失值当作“待预测的目标”,用其他完整字段当“线索”,训练一个模型来预测缺失值。比如预测某个用户的收入时,用他的年龄、职业、学历、所在城市去拟合一个回归模型,然后用这个模型去预测缺失的收入。这就是“让已经学过大量样本的老师来补全你的答案”。

实际使用中,有一种“迭代式”的流程:先用均值之类的简单方法初始化缺失值,然后在每一轮中,挑出一个特征当“目标”,用其他特征训练模型去预测它,更新缺失位置的数值,再换下一个特征,如此反复,直到数值稳定。这个过程叫迭代填充(Iterative Imputation),它让不同的特征之间互相“校准”,填补结果更自洽。更进一步,多重填补(Multiple Imputation)会多次执行这个过程,每次加入一点随机扰动,生成多份完整数据集,最后综合各份的结果,让估计更稳健——就像请多位独立评委打分,再取平均。

回到班主任比喻:统计填充法是“全班平均分补上去”,KNN 是“让好朋友来猜”,而模型预测则是“让阅卷经验丰富的老师,根据你其他科目的成绩和平时表现来预估你这次考试能得多少分”。它最费功夫,但往往最精准——因为它不仅利用了相似性,还利用了特征之间复杂的关联关系。当然,前提是你的“老师”足够靠谱:如果其他特征本身也大量缺失,或者模型过拟合,预测出来的值也会失真。

y^i=β0+β1xi1+β2xi2+⋯+βpxip\hat{y}_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \cdots + \beta_p x_{ip}
这是线性回归用于预测缺失值的公式,$\hat{y}_i$ 是预测值,$x_{i1}, \dots, x_{ip}$ 是该样本在其他特征上的取值。
  1. 线性组合预测值由所有已知特征加权求和得到。
    y^i=f(xi1,xi2,…,xip)\hat{y}_i = f(x_{i1}, x_{i2}, \dots, x_{ip})
  2. 回归系数$\beta_k$ 表示第 $k$ 个特征对目标的影响权重,模型训练时自动学习。
    min⁡β∑i(yi−y^i)2\min_{\beta} \sum_i (y_i - \hat{y}_i)^2
  3. 固定公式扩展线性回归的最简形态如上,换成树模型或神经网络就是非线性版本。

策略评估选择

工具都介绍完了,最后的关键问题是:“我到底该用哪一种?”答案没有绝对,取决于三个维度:缺失比例、缺失机制、业务场景。缺失比例在 5% 以下,删行或均值填补就够了;5%-20% 之间,KNN 或模型预测更合适;超过 30%,你要先设法治愈数据源头,单纯填补可能引入大量偏差。业务上,如果填错一个值代价很高(比如医疗诊断),那就用多重填补这种“稳健派”;如果是快速原型验证,均值填充完全够用。

一个实用的方法是做交叉验证评估:故意在完整数据上人工制造缺失值,然后用不同方法填补,比较哪些方法能让模型表现更好。这就像先“模拟考试”,看哪种复习策略在模拟卷上得分最高,再应用到真正的大考。你可以对比填出来的数据分布与原分布是否接近,也可以直接评估下游任务(比如分类准确率的提升)。始终记住:没有最好的方法,只有最适合当前数据和业务的方法。

选择策略就像厨师配菜:食材新鲜(缺失少)就简单处理,食材糟糕(缺失多)就得动用更精细的工艺。但你永远要在“厨房里先试吃”——用交叉验证制作一份“试吃装”,看看哪一种处理方法最适合同事们的口味(模型效果)。数据清洗的本质不是“把空填上”,而是“尽量减少人为偏差”——让原始数据的信号最大程度地保留下来,而不是被你的修补方法抹掉。懂得评估和权衡,才是数据清洗的真正手艺。

评估指标=RMSE(x^filled,xtrue)或Accuracydownstream\text{评估指标} = \text{RMSE}(\hat{x}_{\text{filled}}, x_{\text{true}}) \quad \text{或} \quad \text{Accuracy}_{\text{downstream}}
通过人工构造缺失值,计算填补值与真实值的均方根误差 RMSE,或直接比较下游模型性能,来判断哪一种填充策略更优。
  1. 人工构造缺失把完整数据集随机挖掉一些值,当作“模拟考场”。
    mask∼Bernoulli(r)\text{mask} \sim \text{Bernoulli}(r)
  2. 填补误差比较填充值与真实值的差距。
    RMSE=1m∑(x^i−xi)2\text{RMSE} = \sqrt{\frac{1}{m}\sum(\hat{x}_i - x_i)^2}
  3. 最终决策选择让 RMSE 最小或下游准确率最高的方法。

AI 应用场景

风控模型的特征工程流水线

阶段:数据清洗与特征工程

解决的问题:信贷风控场景中,用户填写的收入、职业、房产信息经常缺失。传统做法是直接删除含缺失的样本,导致通过率预测模型偏差大,且优质客户被误杀。用 KNN 填充和模型预测填充,借助征信报告中的其他变量补全收入,能更精准地评估还款能力。

具体案例:某金融科技公司构建信用评分卡时,“年收入”字段缺失率达 40%。团队先用多重填补法生成 5 份完整数据,分别训练逻辑回归模型,再综合投票,最终模型 AUC 提升了 8%,坏账率降低了 2.5 个百分点。这个案例是模型预测填充与多重填补的典型应用。

电商用户画像补全

阶段:用户画像与推荐系统

解决的问题:电商平台收集到的用户年龄、性别信息常因用户未填写而缺失,直接做用户画像会“以偏概全”。用众数填充性别、用中位数填充年龄,快而稳,但效果一般;改用基于购买记录的 KNN 填充,相似购买行为的用户相互补全,大幅提升画像准确率。

具体案例:某电商平台发现 “性别” 字段缺失 35%,通过 KNN 填充(基于浏览品类、客单价、活跃时段等 12 个特征)补全后,推荐系统的 CTR 提升了 15%。这就是 KNN 填充在用户冷启动场景中的实用价值。

医学研究数据治理

阶段:临床试验数据处理

解决的问题:临床试验中患者的生理指标常因仪器故障或中途退出而缺失。医学数据容错率极低,删行会造成样本量不足,均值填充会过度压缩方差。多重填补法因其稳健性,成为医学统计的首选。

具体案例:某新药二期临床试验,血压指标缺失 12%。团队采用多重填补生成多个完整数据集分别建模,最后合并估计效应量,既保证了统计功效,又避免了偏差。这是模型预测填充与多重填补在严谨科学场景的标杆案例。

Python 演示

python54 行
import numpy as npimport pandas as pdfrom sklearn.impute import KNNImputer, SimpleImputerfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import LinearRegression  def evaluate_imputation(X_missing, y, true_values, strategy='mean', k=5):    """评估不同缺失值填充策略的效果(RMSE越低越好)。"""    if strategy == 'mean':        imputer = SimpleImputer(strategy='mean')        X_filled = imputer.fit_transform(X_missing)    elif strategy == 'median':        imputer = SimpleImputer(strategy='median')        X_filled = imputer.fit_transform(X_missing)    elif strategy == 'knn':        imputer = KNNImputer(n_neighbors=k)        X_filled = imputer.fit_transform(X_missing)    elif strategy == 'model':        X_filled = X_missing.copy()        missing_mask = np.isnan(X_filled[:, 0])        X_known = X_filled[~missing_mask]        X_unknown = X_filled[missing_mask]        x0 = true_values[missing_mask]        for col in range(1, X_filled.shape[1]):            col_mask = ~np.isnan(X_known[:, col])            features = np.delete(X_known[:, 1:], col - 1, axis=1)[col_mask]            targets = X_known[col_mask, col]            model = LinearRegression()            model.fit(features, targets)        features_unknown = np.delete(X_unknown[:, 1:], 0, axis=1)        X_filled[missing_mask, 0] = model.predict(features_unknown)        print('model count sample:', np.sum(missing_mask),              'rmse:', np.sqrt(np.mean((X_filled[missing_mask, 0] - x0) ** 2)))    rmse = np.sqrt(np.mean((X_filled[:, 0] - true_values) ** 2))    scores = cross_val_score(RandomForestRegressor(n_estimators=50),                             X_filled, y, cv=3, scoring='r2')    return rmse, scores.mean()  if __name__ == '__main__':    rng = np.random.RandomState(42)    n = 200    X = rng.rand(n, 3) * 10    y = 2 * X[:, 0] + 1.5 * X[:, 1] - X[:, 2] + rng.randn(n) * 0.5    X_true = X[:, 0].copy()    X_missing = X.copy()    missing_idx = rng.choice(n, size=80, replace=False)    X_missing[missing_idx, 0] = np.nan    print('缺失比例: %.2f' % (80 / n))    for strategy in ['mean', 'median', 'knn', 'model']:        rmse, r2 = evaluate_imputation(X_missing, y, X_true, strategy)        print('%-8s RMSE=%.4f R2=%.4f' % (strategy, rmse, r2))
目的:对比均值、中位数、KNN、模型预测四种填充策略在缺失数据上的填补误差和下游模型表现。实际项目中,你应该用类似的评估框架来决定选哪把“修补刀”。
  1. rng.choice(n, size=80, replace=False)随机选出 80 个样本制造缺失值,模拟 MAR 场景。
  2. SimpleImputer(strategy='mean')调用 sklearn 的均值填充器,用一列的平均数填补该列缺失值。
  3. KNNImputer(n_neighbors=k)调用 KNN 填充器,找到每个缺失样本最相似的 K 个邻居,用加权平均填补。
  4. missing_mask = np.isnan(X_filled[:, 0])找出哪些样本在第一列上缺失,记为 True/False 掩码。
  5. model.fit(features, targets)用完整样本训练线性回归模型,学习“其他特征 → 目标特征”的关系。
  6. model.predict(features_unknown)用训练好的模型预测缺失值。
  7. np.sqrt(np.mean((X_filled[:, 0] - true_values) ** 2))计算 RMSE,量化真实值与填充值的差距。
  8. cross_val_score(...)对填充后的完整数据跑 3 折交叉验证,评估下游随机森林模型的泛化能力。

常见误区

误区“数据里有空值不专业,我无论如何都要把每空填满,否则模型跑不起来。”

正解有些模型(如 XGBoost、LightGBM)原生支持缺失值,会自动学习缺失样本的最优划分方向。盲目填充反而可能掩盖真实信号。就像一道菜里有些食材切得不够整齐,但只要味道对,没必要把所有食材都重新切一遍。正确做法是:先评估缺失比例和机制,再决定是否填充,以及用哪种方式填充。

为何常见:这是入门阶段“数据必须完美”的执念。大多数教程的数据集都是完整的,导致学习者把清洗默认成“填满所有空位”,却没想过模型本身是否有处理缺失的能力。

误区“均值填充很简单也常用,肯定是最稳的,用了总没错。”

正解均值填充会系统性缩小方差,让数据分布变得更集中,削弱变量之间的关系强度。当缺失比例较高(>15%)时,这种“均值化”效应会严重扭曲模型系数,甚至改变相关方向。就像给所有人都穿上均码衣服,身材差异被抹除,你无法再从外表判断谁高谁矮。相比均值,中位数在偏态分布中更稳健;如果特征间有相关性,KNN 或模型预测更能保留原始分布形态。

为何常见:均值是普通人最容易理解、代码实现也最简单的统计量。而且在小缺失比例(<5%)时,均值填充的负面影响确实不明显,学习者容易把它当成“万能解”。

误区“KNN 是机器学习方法,肯定比简单填充高级,效果一定更好。”

正解KNN 填充的效果依赖两个前提:特征之间存在真实相关性、数据维度不过高。当特征之间几乎无关(例如全是独立随机噪声),KNN 找出来的“近邻”其实离得很远,填充值近似于随机抽取,反而不如全局均值稳定。此外,高维稀疏数据中欧氏距离会失效(即“维度灾难”)。就像在一个大操场上找人问路,周围都是陌生人,问谁都差不多;不如直接看地图(全局统计)。经验法则:先用简单方法做基线,再对比 KNN 是否真的带来提升。

为何常见:大家容易崇拜“复杂=更好”的技术直觉。加上 KNN 名字里有“机器学习”,学习者自然会觉得它优于均值填充一档。

误区“模型预测不是最强的吗?那缺失再多我都能用它填。”

正解当某个字段缺失比例超过 50% 时,剩余已知样本太少,“老师”从少量案例中学不到可靠的规律,填出来的值等于是瞎猜。更严重的是,如果缺失与特定人群相关(MNAR),模型会把“缺失本身”当成规律,结果充满偏差。正确的做法是:缺失比例过高(>70%)时考虑删除该特征;30%-70% 时尝试多种方法并用业务指标评估;永远别把模型预测当万能灵药。

为何常见:这是把“模型能力强”和“数据可恢复性”混淆了。模型再强,也依赖输入数据的质量;从 30 个样本学出来的规律,不可能准确预测剩下 170 个样本。

误区“删行会减少样本量,模型学不到足够的东西,所以能别删就尽量别删。”

正解当缺失是完全随机的(MCAR)且比例较低(<5%)时,删除这些行等价于随机抽样,几乎不引入偏差。此时“删行”信息损失极小,甚至优于填充——因为填充总会引入人为噪声。就像一箱苹果只有一两个碰伤的,直接扔掉比硬把它们拼回去更干净。关键是先判断缺失机制:MCAR 下删行安全,MAR/MNAR 下删行才会引入偏差。

为何常见:学习者的共识是“数据越多越好”,忽略了有偏差的数据比少而精的数据更有害。删行损失的样本量是透明的,而偏差是隐形的,前者可见、后者难察。

面试题

Q1. 缺失值的三种主要机制不包括以下哪一项?

单选题 · easy

  • A.完全随机缺失(MCAR)
  • B.随机缺失(MAR)
  • C.非随机缺失(MNAR)
  • D.确定性填充缺失(DFM)← 正确答案

答案:D。缺失机制的经典三分类是 MCAR、MAR 和 MNAR。DFM 不是一个标准的缺失机制分类。完全随机缺失指缺失与任何变量无关,随机缺失指与已观测变量有关,非随机缺失指与缺失值本身有关。

Q2. 当数据缺失比例低于 5% 且机制为完全随机缺失时,最合理的选择是?

单选题 · easy

  • A.直接用行删除法删除含缺失的样本← 正确答案
  • B.用随机森林预测填充
  • C.用多重填补法
  • D.忽略缺失值不处理

答案:A。MCAR 下缺失比例很低时,删除含缺失样本等价于随机抽样,不会引入偏差,是最简单高效的选择。复杂方法(多重填补、随机森林)在缺失少时提升有限,且增加复杂度。

Q3. 对于严重偏态的收入数据,以下哪种统计量作为填充值最稳健?

单选题 · mid

  • A.均值
  • B.中位数← 正确答案
  • C.众数
  • D.最大值

答案:B。偏态分布中少数极端值会大幅拉高均值,而中位数不受极端值影响,更适合作为“中心趋势”的估计。众数适用于类别变量,最大值完全错误。选均值会让大量样本集中在被拉高的值周围,失真严重。

Q4. 在 KNN 填充中,K 值过大会导致什么问题?

单选题 · mid

  • A.计算复杂度显著下降
  • B.填充值过拟合噪声
  • C.远处的“泛泛之交”被纳入平均,填充结果失真← 正确答案
  • D.缺失值被保留为 NaN

答案:C。K 值越大,参与平均的邻居越多,距离较远、相似度低的样本也被拉进计算,导致填充值被“稀释”。K 太小则容易受异常点影响。通常 K 取 5-10 并用交叉验证调整。

Q5. 以下哪种情况适合使用常量填充(例如用 0 填充)?

单选题 · mid

  • A.性别字段缺失
  • B.收入字段缺失
  • C.消费金额缺失,且 0 有明确业务含义(表示无消费)← 正确答案
  • D.年龄缺失

答案:C。常量填充只有当填充值本身有业务含义时才合理。比如“消费金额”缺失可理解为没有消费记录,用 0 填充既合理又不引入偏差。性别用 0 填充毫无意义,收入年龄用 0 也是错误的。

Q6. 关于多重填补(Multiple Imputation)的描述,正确的是?

多选题 · hard

  • A.只生成一份完整数据并训练一个模型
  • B.多次生成完整数据集,加入随机扰动← 正确答案
  • C.综合多个数据集的分析结果,估计更稳健← 正确答案
  • D.适用于所有缺失场景且永远最优

答案:BC。多重填补的核心理念是生成多份完整数据集(每份都带微小随机扰动),分别在每份上建模,最后综合结果。它比单一填充更能反映不确定性。但它计算开销大,并非所有场景都最优,有些场景简单方法已足够。

Q7. 在 MNAR(非随机缺失)机制下,以下哪项说法最准确?

单选题 · hard

  • A.直接删除含缺失的行不会引入系统性偏差
  • B.缺失本身可能与缺失值相关,盲目填充会扭曲分布← 正确答案
  • C.均值填充完全不受影响
  • D.MCAR 和 MNAR 处理方式完全相同

答案:B。MNAR 下,缺失与否受缺失值本身影响(如高收入者不填收入),直接删除会使样本偏向低收入群体,均值填充同样会低估真实水平。MCAR 才能用删除法而少偏差。MNAR 是最难处理的机制,需结合业务深入分析。

Q8. 使用交叉验证评估填充方法时,正确的做法是?

多选题 · mid

  • A.在完整数据上人为制造缺失值,比较填充值与真实值的 RMSE← 正确答案
  • B.直接查看缺失值原始值(因为它是可见的)
  • C.比较不同填充方法对下游模型性能的影响← 正确答案
  • D.只选择让填充速度最快的方法

答案:AC。评估填充质量的一条有效路径是人为制造缺失、填充、计算 RMSE 与真实值的差距;另一条路是训练下游模型比较性能。B 错在缺失值本身不可见,无法直接比较。D 片面对,速度不应凌驾于效果之上。

Q9. sklearn 中用于 KNN 填充的类是?

单选题 · easy

  • A.SimpleImputer
  • B.KNNImputer← 正确答案
  • C.MissingIndicator
  • D.RFImputer

答案:B。KNNImputer 是 sklearn.impute 模块中专门为 KNN 填充设计的类,默认使用欧氏距离并支持加权平均。SimpleImputer 用于均值、中位数、众数等统计填充。MissingIndicator 用于生成缺失指示矩阵(缺失指示变量),不是填充器。

Q10. 关于缺失指示变量(Missing Indicator)的说法,正确的是?

多选题 · hard

  • A.把“是否缺失”本身作为一列新特征加入模型← 正确答案
  • B.可以捕捉“缺失与否”对预测目标的影响模式← 正确答案
  • C.仅适用于树模型,不适用于线性模型
  • D.在高缺失比例场景下,缺失模式本身可能就是强特征← 正确答案

答案:ABD。缺失指示变量把缺失模式本身编码为特征(0/1),帮助模型捕捉“缺失”这件事的预测力。线性模型同样可以使用。C 错误。在 MNAR 场景中,是否缺失与目标值相关,缺失指示变量可能成为重要的信号特征。