3000字详解四种常用的缺失值处理方法
3000字详解四种常用的缺失值处理方法
在数据处理中,缺失值是一个常见的问题。如何处理这些缺失值,直接影响到后续的数据分析和模型训练效果。本文将详细介绍四种常用的缺失值处理方法,包括删除和填充两种主要策略,并通过代码示例进行说明。
对于缺失值的处理大致可分为以下三方面:
- 不处理
- 删除含有缺失值的样本
- 填充缺失值
不处理应该是效果最差的了,删除虽然可以有效处理缺失值,但是会损伤数据集,好不容易统计的数据因为一个特征的缺失说删就删实在说不过去。填充缺失值应该是最常用且有效的处理方式了,下面介绍四种处理缺失值的常用Tips。
我自己构建了一个简易的含有缺失值的DataFrame,所有操作都基于这个数据集进行。
1. 删除缺失值
删除虽说是一个可行的方式,但肯定是不能随便删除的,比如一个样本中仅有一个特征的值缺失,这样的情况下填充取得的效果一定会优于删除,所以在删除缺失值时,我们需要一个衡量的标准。
删除的方式无非有两种,一是删除缺失值所在行,也就是含有缺失值的样本;二就是删除缺失值所在列,也就是含有缺失值的特征,下面以后者为例。
首先需要确定的是删除的标准是什么?比如一个特征的缺失值所占比例已经超过了50%,如果选择填充的话,就表明该特征超五成的值都是自己猜测填入的,导致误差可能比删除这个特征还要大。
def find_missing(data):
missing_data = data.isnull()
for column in missing_data.columns.values.tolist():
print(column)
print(missing_data[column].value_counts())
print("")
通过上述代码,我们可以查看每个特征的缺失值情况。接下来,我们定义一个阈值,当特征的缺失值比例超过这个阈值时,我们就删除这个特征。
def drop_missing(data, threshold):
missing_data = data.isnull()
columns_to_drop = []
for column in missing_data.columns.values.tolist():
missing_ratio = missing_data[column].mean()
if missing_ratio > threshold:
columns_to_drop.append(column)
return data.drop(columns_to_drop, axis=1)
2. 填充缺失值
填充缺失值是一种更常用且更有效的处理方式。常见的填充方法有以下几种:
2.1 填充常数值
最简单的方法是用一个常数值填充缺失值,比如0、-1等。这种方法适用于那些缺失值占比很小的特征。
data.fillna(0)
2.2 填充平均值
对于数值型特征,可以用该特征的平均值来填充缺失值。
data.fillna(data.mean())
2.3 填充中位数
对于数值型特征,也可以用该特征的中位数来填充缺失值,这种方法对于异常值的鲁棒性更好。
data.fillna(data.median())
2.4 前向填充和后向填充
对于时间序列数据,可以使用前一个有效值(ffill)或后一个有效值(bfill)来填充缺失值。
data.fillna(method='ffill')
data.fillna(method='bfill')
2.5 使用模型预测填充
对于缺失值较多的特征,可以使用其他特征来预测缺失值。比如,可以使用回归模型来预测数值型特征的缺失值,使用分类模型来预测类别型特征的缺失值。
这种方法需要额外的数据预处理和模型训练,但通常能获得更好的填充效果。
3. 使用第三方库进行缺失值处理
除了上述方法,还可以使用一些第三方库来处理缺失值,比如missingno
库可以可视化缺失值的分布,fancyimpute
库提供了多种缺失值填充算法。
import missingno as msno
msno.matrix(data)
4. 小结
处理缺失值没有绝对正确的方法,需要根据具体的数据集和业务场景来选择合适的方法。一般来说,删除方法适用于缺失值占比很小的特征,填充方法适用于缺失值占比较大的特征。对于重要的特征,可以考虑使用模型预测填充。