缺失数据与插补(missing data and imputation)
/ MISS-ing DAY-tuh and im-pyoo-TAY-shun /
真实的数据集都是有窟窿的。某位受访者跳过了收入那道题,某个传感器掉线了一个小时,某份病历干脆缺了一项压根没开过的检查。这些空白就是缺失数据,而由于多数模型一遇空格就卡壳,你必须决定拿它们怎么办。插补,就是用合理的估计把这些窟窿填上的动作。
首先要问:这个值为什么会缺——这会改变一切。有时数据是完全随机缺失的(记录板被雨淋了)。有时缺失则有一个与数值本身相关的原因(收入极高的人不愿填报)。后一种情形很危险:「缺失」这件事本身就携带了信息,草率地填补会让你的结论产生偏差。简单的插补方法用该列的均值、中位数或众数来替补空白;更聪明的方法会用其他特征去预测那个缺失值,或者在多种貌似合理的填补值上反复运行分析(即多重插补 multiple imputation),以诚实地反映由此增添的不确定性。
为何重要:把任何含空白的行统统丢弃,可能扔掉你大半的数据,更糟的是,还可能系统性地剔除掉某一类人或某一类情形,使模型产生偏差。用心的插补能让数据保持可用。但每一个被插补的值都是猜测,而非事实——一个好做法是额外加一列「曾经缺失」的标记,好让模型能学到「缺失本身或许就有意义」,而不是假装那个空缺从未存在过。
一份贷款数据集里有8%的申请人缺了收入。把所有空白都用平均收入填上,看着很整齐——可如果留空的人多半是失业者,你就等于凭空给他们编了一个舒适的中等收入,把真实的风险藏了起来。加上一个「收入缺失」的标记,能让模型对这一群体保持恰当的警惕。
一个值「为何缺失」,有时比你填进去的那个值更重要。
和所有预处理一样,插补必须只在训练数据上拟合。用包含测试集在内的整份数据去算一个均值来填空,是一种隐蔽的数据泄露,会把你的分数衬托得过分好看。