4.10 删除带有缺失值的观察值
问题描述
删除带有缺失值的观察值。
解决方案
用一行NumPy代码就能轻松删除带缺失值的观察值:
或者,使用pandas丢弃有缺失值的观察值:
讨论
大多数机器学习算法不允许目标值或特征数组中存在缺失值。因此,不能简单地忽略数据中的缺失值,而是要在数据预处理阶段解决这个问题。
最简单的解决方法是删除所有含缺失值的观察值,用NumPy或者pandas很容易实现。
即便如此,删除带缺失值的观察值也是一件令人心痛的决定。这样做会让算法丢失观察值中那些非缺失值的信息,所以删除观察值只能作为最终别无他法时不得已的选择。
还有一点很重要,删除观察值可能会在数据中引入偏差,这主要由缺失值的成因决定。缺失值一共有三种类型:
完全随机缺失 (Missing Completely At Random,MCAR)
数据缺失的可能性与任何其他东西无关。例如,某个接受问卷调查的人会在回答问题前先掷一个骰子,如果掷出了6,她就跳过那个问题不做回答。
随机缺失 (Missing At Random ,MAR)
数据缺失的可能性不是完全随机的,与已经存在的其他特征有关。例如,在一次问卷调查中会问及性别和薪资水平,那么接受调查的女性更可能会跳过薪资的问题,但是她们选择是否不作答要看我们是否已经得知其性别信息。
完全非随机缺失 (Missing Not At Random,MNAR)
数据缺失的可能性完全是非随机的,并且与未在特征中反映出的信息有关。例如,一个问卷调查会问到被调查人的薪资水平,而女性更可能会跳过关于薪资水平的问题,但是我们的数据中没有关于性别的特征。
如果观察值是MCAR或者MAR,那么有时候删除它们是可接受的。但是如果它们是MNAR,那么数据缺失本身其实就是一个信息。删除MNAR观察值会导致数据产生偏差,因为这些观察值是由未观察到的系统效应产生的。
延伸阅读
●《定义三种类型的缺失数据》(http://bit.ly/2Fto4bx)
●《缺失数据的填充》(http://bit.ly/2FAkKLI)
