缺失数据
本课程重点讲解缺失数据,介绍一些从数据集中清理缺失数据的技术。
什么是缺失数据?
你已经读取了数据,却发现某些值缺失!接下来该怎么办?
首先,你应该尝试理解数据点为何缺失。这些缺失是随机的吗?如果是随机缺失,并且数据集足够大,可以直接删除这些行。但如果缺失并非随机,可能意味着零值?或者是否暗示着传感器故障?这类非随机缺失的数据应被修复或加以利用。例如,如果缺失值本应为零,就可以将其设为零。
其次,你需要考虑整体数据量与缺失数据行数之间的比例。如果你有100万条数据,仅有10条随机缺失,那么删除这些行可能是可行的。但如果你只有300条数据,其中100条缺失,那么删除三分之一的数据就值得慎重考虑了。假设无法找到缺失数据的根本原因,该如何处理?
填补缺失数据
有几种方法可以填补缺失值。
使用统计值填充
用统计值(如均值、中位数或众数)来填充某一列的缺失值。这种方法简单易行,但会降低该列内部的方差,而通常情况下,较高的方差(前提是真实存在)对机器学习模型是有利的。此外,这种做法有时并不合理。例如,在一个包含身高和体重的数据集中,若体重缺失,却统一用平均体重填充,无论身高如何——这显然忽略了身高与体重之间的相关性。
下面是一个使用统计值填补缺失值的简单示例:
1import numpy as np 2import pandas as pd 3pd_series = pd.Series([5, 10, np.nan, 15, 20, np.nan, 25, 50, np.nan]) 4print("非缺失值的平均值: {0}".format(pd_series.mean())) 5pd_series = pd_series.fillna(pd_series.mean()) 6print(pd_series)
上述代码中,我们创建了一个Pandas序列(即Pandas数据框的一列),并在其中插入了三个缺失值(用np.nan表示)。
Pandas 提供了 fillna() 函数,可轻松填充缺失值。我们传入希望使用的值,在此例中是未缺失值的均值。
使用模型预测
使用模型来学习合理的缺失值。本质上是利用已有数据来推断缺失变量的可能取值。在身高与体重的例子中,可以先用已知的身高数据训练一个预测体重的模型,然后将该模型应用于身高已知但体重缺失的情况,从而填补缺失值。一种常用的算法是K-最近邻(K-Nearest Neighbors)。
关于如何处理缺失数据的更多思路,可参考这篇文章。
跟踪与删除缺失数据
Pandas 还提供了便捷的方法来删除缺失值,使用 dropna() 函数:
1import numpy as np 2import pandas as pd 3 4# 创建一个包含缺失数据的序列 5pd_series = pd.Series([5, 10, np.nan, 15, 20, np.nan, 25, 50, np.nan]) 6# 删除含有缺失值的行 7pd_series = pd_series.dropna() 8print(pd_series)
你也可以通过 isnull() 函数找出哪些值是缺失的:
1import numpy as np 2import pandas as pd 3 4# 创建一个包含缺失值的序列 5pd_series = pd.Series([5, 10, np.nan, 15, 20, np.nan, 25, 50, np.nan]) 6# 显示哪些行缺失 7print(pd_series.isnull())
返回的结果是一个新的序列,其中 True 表示对应位置的值缺失,False 表示该位置有实际数值。
现在你已经熟悉了缺失数据的处理方法,下一课我们将学习如何处理与其他观测值显著不同的异常数据。