一个空单元格,有时是整行数据里信息量最大的部分。问题在于,你通常得查数据字典才能知道它到底意味着什么——而面对800个名为f_0347的匿名列,这招根本行不通。所以我们直接测量它,再把结果和已有文献对照。
Ames房价数据:1,460笔交易、79个列,其中19列含空值。
打开网易新闻 查看精彩图片
“缺失超70%的列直接删掉”——这句话被写进过无数条数据处理管线。在Ames上,这条规则会删掉4列,其中3列的空缺里藏着真实的房价信号。
这个数据集的空值是有结构的。GarageQual(车库质量)为空,不代表数值丢失,而是这栋房子根本没有车库;Alley(小巷)为空,意味着没有小巷通道。空,本身就是测量结果。
这些规律在这里容易看出来,因为列名是英文、还有公开的数据字典。但在真实项目常见的匿名化特征供应商数据流上,就不容易了。所以值得回答的问题不是“缺失是否携带信号”,而是:在不了解列含义的前提下,能不能判断出来?
1 · 空单元格有价格标签
先做粗检验:某列为空的行,和不为空的行,销售价格有没有差异?在同一批行上同时为空的列描述的是同一个事实,所以5个车库相关列合并成一个维度。
图1显示:没有车库的房子,中位价比有车库的房子低6.8万美元(该数据集房价中位数16.3万美元)。注意符号反转:有小巷或有围栏的房子反而更便宜——这些特征标记的是更老、更密集的街区。“空=更差”不是可以默认的规则。
然后是更严格的测试:把表里所有数值全部扔掉,只保留一个19列的True/False矩阵——记录每个单元格是否为空。只用这个矩阵训练模型。
图2显示(五折交叉验证):一个从未见过房屋面积、街区或建造年份的模型,仅凭哪些单元格为空,就达到了R²=0.41。
空值的信息量相当大。但我们能读懂它,靠的是数据字典——而这一步恰恰无法规模化。
热门跟贴