Python机器学习算法与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 缺失值处理

数据缺失是指在数据采集、传输和处理等过程中,由于某些原因导致数据不完整的情况。由于待分析数据的获取过程可能存在各种干扰因素,因此,在进行数据分析时数据存在缺失值是很常见的一种现象。针对带有缺失值的数据集,如何使用合适的方法处理缺失值是数据预处理的关键问题之一。

缺失值的处理方法有很多,如剔除缺失值、均值填充、K-近邻缺失值填补等方法。接下来利用具体的数据集,结合Python库中的相关函数,介绍如何处理数据中的缺失值。

2.1.1 简单的缺失值处理方法

本节将介绍如何使用Python发现数据中的缺失值,以及使用一些简单的方法对缺失值进行处理,如剔除缺失值、均值填充等。

1.发现数据中的缺失值

对数据进行缺失值处理时,第一步要做的就是分析数据中是否存在缺失值,以及缺失值存在的形式。下面导入一个数据集,介绍从数据中发现缺失值的方法。针对导入的数据表,可以使用pd.isna()方法判断每个位置是否为缺失值,例如pd.isna(oceandf).sum()在判断数据oceandf中的每个元素是否为缺失值后,使用sum()方法对每列求和,计算出每个变量缺失值的数量,相关输出如下:

从上面的输出结果中可以发现,一共有3个变量带有缺失值,分别是SeaSurfaceTemp变量有3个缺失值、AirTemp变量有81个缺失值、Humidity变量有93个缺失值。虽然知道了数据中缺失值的情况,但是还不知道缺失值在数据表中的分布情况,针对这种情况,可以使用msno.matrix()函数可视化出缺失值在数据中的分布情况,程序如下,运行结果如图2-1所示。

图2-1 缺失值分布可视化

图2-1可以分为两个部分,左边部分表示缺失值在数据中的分布,736表示数据表中第736行数据,在每个变量图像中,空白的部位表示该处存在缺失值,右侧的折线表示每个样本缺失值的情况,8表示数据中一共有8个变量,5表示对应的样本只有5个变量是完整的,存在3个缺失值。通过图2-1可以对数据表中缺失值的分布情况一目了然。

在发现数据中带有缺失值后,就需要根据缺失值的情况进行预处理,下面介绍几种简单的数据缺失值预处理方法。

2.剔除带有缺失值的行或列

剔除带有缺失值的行或列是最简单的缺失值处理方法。通常情况下,如果数据中只有较少的样本带有缺失值,则可以剔除带有缺失值的行。如果某列的数据带有大量的缺失值,进行缺失值填充可能会带来更多的负面影响,则可以直接剔除缺失值所在的列。剔除数据中带有缺失值的行或列,可以使用数据的dropna()方法,指定该方法的参数axis=0则会剔除带有缺失值所在的行,指定参数axis=1则会剔除带有缺失值的列,相关程序如下:

3.对缺失值进行插补

处理带有缺失值的相关数据的另一种方式,就是使用新的数据进行缺失值插补。下面介绍如何使用缺失值的均值、前面的值等进行缺失值插补。在这之前首先使用散点图,可视化出剔除带有缺失值行后,AirTemp和Humidity变量的数据分布。程序如下,运行后的结果如图2-2所示。

注意:程序可视化出的是数据在剔除缺失值所在的行后的结果,而这里仍然使用原始数据表oceandf进行可视化,这是因为在可视化时,使用的plt.scatter()函数会自动地不显示带有缺失值的点。

图2-2 剔除带有缺失值行的散点图

针对数据表数据,pandas库提供了数据表的fillna()方法,该方法可以通过参数method设置缺失值的填充方式,常用的方式有method="ffill",使用缺失值前面的值进行填充;method="bfill",使用缺失值后面的值进行填充。下面针对oceandf数据集分别使用这两种方式填充缺失值,并可视化出填充后缺失值所在的位置。首先使用method="ffill"的方法,程序如下:

上面的程序为了分别可视化出带有缺失值的数据和非缺失值的数据,先找到缺失值所在位置的索引nanaindex,然后进行缺失值填充后,使用散点图可视化填充使用的数据。程序运行后的结果如图2-3所示。在图中,圆点(蓝色)表示不带缺失值的数据,矩形(红色)表示带有缺失值的数据。从图中可以发现填充的缺失值分布在两条直线上,这是因为每个变量的缺失值比较集中,数据填充值较为单一。

图2-3 使用缺失值前面的值进行填充

下面针对oceandf数据集,使用method="bfill"方法,利用缺失值后面的值进行填充,并可视化填充后缺失值所在的位置,程序如下:

程序运行后的结果如图2-4所示,可以发现填充的缺失值位置已经发生了改变,但是分布趋势变化不大。

图2-4 使用缺失值后面的值进行填充

注意:针对该数据集,因为两个变量的缺失值分布的位置较为集中,所以不太适合使用前面或者后面的值进行缺失值填充,当缺失值的分布在每个变量中较为离散时,使用这种方法较为合适。

使用均值对有缺失值的变量进行填充,也是常用的缺失值处理方法之一,下面先使用每个变量的均值对变量进行缺失值填充,然后使用同样的方式可视化缺失值处理结果,程序如下,程序运行后的结果如图2-5所示。

图2-5 使用变量均值进行缺失值填充

从上面的3种缺失值填充结果可以发现,针对该数据使用简单的缺失值填充方法,并不能获得很好的缺失值填充效果,造成这个结果的一个重要原因就是,在缺失值填充时,只单一地分析一个变量,并不能从整体数据出发,不能借助样本的其他信息进行填充。因此下一节将会介绍几种复杂的缺失值填充方法。

2.1.2 复杂的缺失值填充方法

复杂的缺失值填充方法会考虑到数据的整体情况,然后再对有缺失值的数据进行填充,本节将介绍3种复杂的缺失值填充方法。

1.IterativeImputer多变量缺失值填充

IterativeImputer是sklearn库中提供的一种缺失值填充方式,该方法会考虑数据在高维空间中的整体分布情况,然后对有缺失值的样本进行填充。相应的程序如下,将填充的结果可视化后如图2-6所示。

图2-6 使用IterativeImputer方法填充缺失值

从图2-6所示的可视化结果中可以发现,相对于简单的缺失值填充方法,该方法填充的结果更符合数据的分布规律。

2.K-近邻缺失值填充

K-近邻缺失值填充方法是复杂的缺失值填充方式之一,该方法会利用带有缺失值样本的多个近邻的综合情况,对缺失值样本进行填充,该方法可以使用sklearn库中的KNNImputer来完成。程序如下,可视化后的结果如图2-7所示。

图2-7 使用K-近邻缺失值填充(使用KNNImputer完成)

从图2-7中可以发现,K-近邻缺失值填充结果在数据分布上也较符合原始数据的分布,比简单的缺失值填充效果好。

3.随机森林缺失值填充

针对带有缺失值的数据,也可以使用随机森林缺失值填充方法。该方法利用随机森林的思想进行缺失值填充,也是一种考虑数据整体情况的缺失值填充方法。该方法可以使用missingpy库中的MissForest完成。程序如下,程序运行后的结果如图2-8所示。

图2-8 使用MissForest填充缺失值

上面介绍的3种复杂的数据填充方法,在填充缺失值时,都会考虑数据的整体分布情况,所以会有更好的填充效果。