如何处理数据集中的缺失数据

129 阅读6分钟

在处理真实世界的数据集时,缺失值是很常见的--比如说,不是Kaggle上提供的经过清洗的数据。

缺失的数据可能是由于人为因素(例如,一个人故意不回答调查问题)、电子传感器的问题或其他因素造成的。而当这种情况发生时,你可能会失去重要的信息。

现在,没有完美的方法来处理缺失值,让你对缺失值有一个准确的结果。但是,有几种技术你可以利用,会给你带来不错的性能。

在这篇文章中,我们将探讨如何以正确的方式处理缺失数据(正确的方式意味着为我们的数据集可能代表的任何情况选择适当的技术)。

请记住,这些方法没有一个是完美的--它们仍然会引入一些偏见,例如偏向于一个类别而不是另一个类别--但它们是有用的。

在我们开始之前,我想先引用乔治-博克斯的一段话来支持前面的说法。

所有模型都是近似值。基本上所有的模型都是错的,但有些是有用的。

现在不再多说,让我们开始吧。

有哪些类型的缺失数据?

你可能想知道缺失值是否有类型。是的,它们有--在现实世界中,这些缺失值可以分为三类。

了解这些类别将使你对如何处理你的数据集中的缺失值有一定的了解。

这些类别中包括:

  • 完全随机缺失(MCAR)。
  • 随机缺失(MAR)。
  • 非随机缺失(NMAR)。

完全随机缺失的数据(MCAR)

这些是完全随机缺失的数据。也就是说,缺失是独立于数据的。这种类型的数据缺失没有可识别的模式。

这意味着你无法预测数值的缺失是否是由于特定情况造成的。它们只是完全随机地缺失。

随机缺失的数据(MAR)

这些类型的数据是随机缺失的,但不是完全缺失。数据的缺失性是由你看到的数据决定的。

例如,考虑到你建立了一个智能手表,可以每小时跟踪人们的心率。然后你把手表分发给一群人佩戴,这样你就可以收集数据进行分析。

收集完数据后,你发现有些数据丢失了,这是由于有些人不愿意在晚上戴上这块手表。因此,我们可以得出结论,缺失是由观察到的数据造成的。

非随机缺失的数据(NMAR)

这些是不随机缺失的数据,也被称为可忽略的数据。换句话说,缺失数据的缺失性是由感兴趣的变量决定的。

一个常见的例子是,在一项调查中,学生被问及他们拥有多少辆汽车。在这种情况下,一些学生可能故意不完成调查,从而导致数据缺失。

你应该如何处理缺失的数据?

正如我们刚才所了解的,这些技术在确定缺失值方面不可能那么精确。它们似乎都有一些偏差。

处理缺失值一般分为两类。我们将看一下每一类中最常见的。这两类情况如下:

  • 删减
  • 代入法

如何用删除法处理缺失数据

处理缺失数据的最普遍的方法之一是删除。而在删除方法中,最常用的方法之一是使用明智的列表删除法。

什么是列表式删除法?

在列表式删除法中,如果数据集中的一条记录或观测值包含一些缺失值,你就会将其删除。

你可以对上述任何一个缺失值类别进行列表式删除,但其缺点之一是潜在的信息损失。

对于何时执行列表式删除,一般的经验法则是当有缺失值的观察值的数量超过没有缺失值的观察值的数量。这是因为数据集没有大量的信息可以提供给缺失值,所以最好是放弃这些值或者完全抛弃数据集。

你可以在Python中通过简单地使用Pandas的.dropna 方法来实现列表式删除,比如这样。

df.dropna(axis=1, inplace=True)

如何用代入法处理缺失数据?

另一种经常使用的处理缺失数据的一般方法是用一个替代值来填补缺失值。

这种方法包括各种不同的方法,但我们在这里将集中讨论最普遍的方法。

事先了解一个理想的数字

这种方法需要用一个特定的值来替代缺失的值。要使用它,你需要有数据集的领域知识。你用它来填充MAR和MCAR值。

为了在Python中实现它,你可以像这样使用Pandas中的.fillna 方法。

df.fillna(inplace=True)

回归归纳法

回归归因法包括创建一个模型,根据另一个变量来预测一个变量的观察值。然后你用这个模型来填补该变量的缺失值。

当数据集中的特征相互依赖时,这种技术被用于MAR和MCAR类别。例如,使用一个线性回归模型。

简单代入法

这种方法涉及利用缺失值发生的变量的数字摘要(即使用特征或变量的中心趋势摘要,如平均数、中位数和模式)。

当你使用这种策略来填补缺失值时,你需要评估变量的分布,以确定应用哪种中心趋势总结。

你在MCAR类别中使用这种方法。而你在Python中使用Scikit-learn库中的SimpleImputer 转化器来实现它。

from sklearn.impute import SimpleImputer
#Specify the strategy to be the median class
fea_transformer = SimpleImputer(strategy="median")
values = fea_transformer.fit_transform(df[["Distance"]])
pd.DataFrame(values)

KNN归纳法

KNN归因法是简单归因法的一个更公平的方法。它的操作是用离它最近的邻居的平均数来替换缺失的数据。

你可以对MCAR或MAR类别使用KNN归因法。

from sklearn.impute import KNNImputer
# I specify the nearest neighbor to be 3 
fea_transformer = KNNImputer(n_neighbors=3)
values = fea_transformer.fit_transform(df[["Distance"]])
pd.DataFrame(values)

如何使用学习算法

我们在这篇文章中提到的最后一个策略是使用机器学习算法来处理缺失数据。

一些学习算法允许我们用缺失值来拟合数据集。然后,数据集算法在数据集中搜索模式,并利用它们来填补缺失的数值。这样的算法包括XGboost、Gradient Boosting和其他算法。但进一步的讨论不在本文的范围之内。

结论和学习更多

在这篇文章中,我们已经涵盖了一些你日常使用的最普遍的技术来处理缺失数据。

但学习并没有到此为止。还有其他几种技术可以帮助我们填充数据集,但关键是要掌握这些技术中的基本机制,以便我们能够正确地管理缺失值。谢谢你的阅读。