一个数据科学团队花了两周训练的预测模型,上线后准确率暴跌40%。排查三天后发现:训练时随手删掉的"空行",全是某类高价值用户的特征缺失。这不是技术事故,是方法论层面的盲区。

处理缺失数据(Missing Data)是数据清洗中最容易被低估的环节。新手爱用dropna()一键删除,老手知道这叫"选择性偏差"(Selection Bias)——你删掉的不是噪声,是信号本身。

MCAR/MAR/MNAR:三种"失踪案"的侦破思路

MCAR/MAR/MNAR:三种"失踪案"的侦破思路

数据不会无缘无故消失。统计学家把缺失机制分成三类,对应三种处理策略。

MCAR(完全随机缺失)像服务器抽风——某行某列的数据就是没存上,跟其他变量没关系。这种情况最简单:正态分布用均值(Mean),有极端值用中位数(Median),分类变量用众数(Mode)。

MAR(随机缺失)更常见。原文举了个汽车数据的例子:2024款车型的"发动机马力"字段完整,1980年代的老车却大面积缺失。缺失与否跟"年份"这个变量相关,但跟马力本身无关。

这时候用分组填充(Grouped Imputation)。df.groupby('make')['hp'].transform('median')——让宝马跟宝马比,拉达跟拉达比,别拿豪华品牌的均值去填经济型车的空。

MNAR(非随机缺失)最棘手。高收入人群故意不填收入、故障频发的设备厂商拒绝披露维修记录——缺失本身就是信息。这时候别硬编数字,新建一个二进制列"信息是否可得",让模型自己学习"沉默的含义"。

填0不是万能药:Constant Fill的适用边界

填0不是万能药:Constant Fill的适用边界

代码里写df.fillna(0)很顺手,但0在不同语境下语义完全不同。

奢侈品字段缺失时,填0等于告诉模型"这人没买",逻辑成立。但把发动机马力的缺失值填0,模型会以为这车没发动机——从统计推断变成统计灾难。

原文没给具体数字,但行业经验是:连续变量用0填充前,必须先确认"0"在业务语境中是否代表"不存在"而非"未知"。

Baseline Model的生存法则

Baseline Model的生存法则

数据竞赛里有个潜规则:先跑通一个简陋的基线模型(Baseline Model),再谈特征工程。但基线模型的脆弱性,往往就藏在缺失值的处理方式里。

同样的算法,用均值填充和用模型预测填充(如KNN插补、多重插补),AUC差距可能超过0.05。在点击率预测这类场景,0.01的AUC提升就能带来百万级收入变化。

原文把插补(Imputation)比作"数据复苏术"——这个类比精准。但复苏不是复活,任何填充都会引入估计误差。关键不是消灭误差,是让误差分布不破坏模型的核心假设。

你最近一次处理缺失数据时,有没有先画一张"缺失模式热力图"?还是直接dropna()之后才发现样本量少了60%?