在机器学习中处理缺失数据的方法

AiTechYun

编辑:yuxiangyu

数据中包含缺失值表示我们现实世界中的数据是混乱的。可能产生的原因有:数据录入过程中的人为错误,传感器读数不正确以及数据处理管道中的软件bug等。

一般来说这是令人沮丧的事情。缺少数据可能是代码中最常见的错误来源,也是大部分进行异常处理的原因。如果你删除它们,可能会大大减少可用的数据量,而在机器学习中数据不足的是最糟糕的情况。

但是,在缺少数据点的情况下,通常还存在隐藏的模式。它们可以提供有助于解决你正尝试解决问题的更多信息。

我们对待数据中的缺失值就如同对待音乐中的停顿一样 – 表面上它可能被认为是负面的(不提供任何信息),但其内部隐藏着巨大的潜力。

方法

注意:我们将使用Python和人口普查数据集(针对本教程的目的进行修改)

你可能会惊讶地发现处理缺失数据的方法非常多。这证明了这一问题的重要性,也这证明创造性解决问题的潜力很大。

你要做的第一件事是统计你有多少人,并试着想象他们的分布。为了使这一步正常工作,你应该手动检查数据(或者至少检查它的一个子集),以确定它们是如何被指定的(即确定它们是何种缺失)。可能的情况有哦:“NaN”,“NA”,“None”,“ ”,“?”等等。如果除了NaN以外,你应该使用np.nan来标准化它们。为了可视化,我们在这里使用missingno包。

import missingno as msnomsno.matrix(census_data)

缺失数据的可视化 白色的地方表示NA的字段

我们从最简单的事情开始:删除。正如前面提到的,虽然这是一个快速的解决方案。但是,除非你的缺失值的比例相对较低(

import numpy as npcensus_data = census_data.replace('np.nan', 0)

第二糟糕的方法是用0(或-1)替换。虽然这能够帮助你顺利运行模型,但这种方法可能非常危险的。原因是有时候这个价可能会让人产生误解。设想在回归问题中出现负值(如预测温度),在这种情况下,这个值会成为一个实际的数据点。

现在我们已经有了这些,让我们变得更有创意。我们可以按其父数据类型拆分缺失值的类型:

数字NaN

一个标准的,通常非常好的方法是用均值,中位数或众数替换缺失值。对于数值,一半来说你应该使用平均值。如果有一些离群值的话,可以试试使用中位数(因为中位数对离群值的不那么敏感)。

from sklearn.preprocessing import Imputerimputer = Imputer(missing_values=np.nan, strategy='median', axis=0)census_data[['fnlwgt']] = imputer.fit_transform(census_data[['fnlwgt']])

分类NaN

分类值可能比较麻烦,所以在编辑之后,你一定要注意模型性能指标(比较之前和之后看看是否有异常情况)。标准的做法是用最常见的条目替换缺失的条目:

census_data['marital.status'].value_counts()Married-civ-spouse 14808Never-married 10590Divorced 4406Separated 1017Widowed 979Married-spouse-absent 413Married-AF-spouse 23Name: marital.status, dtype: int64def replace_most_common(x): if pd.isnull(x): return most_common else: return xcensus_data = census_data['marital.status'].map(replace_most_common)

结论

我想要表达的关键是,你需要寻找到不同的方法从缺失的数据中获得更多的信息,更重要的是培养你洞察力的机会,而不是烦恼。要快乐的编程。

高级方法和可视化

你可以理论上通过拟合一个回归模型(比如线性回归或kNN算法)来估算缺失值。剩下的实现是留给读者的示例。

kNN可视化示例

下面是一些能在missingno包中找到的可视化的图像,它可以以相关矩阵或树状图的方式帮助你了解缺失值之间的关系:

缺失值的相关矩阵 经常同时缺失的值可以帮助你解决问题

缺失值的树状图

或者,你也可以考虑选择一个处理缺失值的算法(例如,Boosting算法)。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171216B06Z8W00?refer=cp_1026

扫码关注云+社区