数据挖掘竞赛实战:方法与案例
上QQ阅读APP看书,第一时间看更新

2.2.1 缺失值

由于各种原因,获取的数据出现缺失值,如传感器故障,用户因为隐私而不愿提供等。缺失值处理看起来微不足道,但不同的处理方式可能对模型产生很大的影响。缺失值处理主要有两个作用:一是提升模型预测精度;二是部分模型(如LR、NN等)无法处理有缺失值存在的输入,必须进行处理。

可以通过以下命令计算每列缺失值的百分比。

df.isna().sum()/len(df)*100

缺失值处理的方法需要根据具体场景进行选择,主要包括以下3种方法。

1.不处理

有些模型(如LightGBM)可以通过内置的算法直接处理缺失值,此时无须对缺失值进行处理。

2.缺失值删除法

缺失值删除法包括删除特征和删除样本两种,对于缺失比例较大的场景,可以尝试采用此方法,代码如下。

3.使用代表值填充

使用代表值填充包括以下4种。

1)使用数据范围之外的数值进行填充

使用数据范围之外的数值进行填充可以保留缺失值原本的信息,代码如下。

df['feature_2'].fillna(df['feature_2'].min() - 1, inplace=True)

2)使用统计值填充

使用统计值(如均值或中位数)填充可以使数据更加符合正态分布,代码如下。

# 用均值填充
df['feature_3'].fillna(df['feature_3'].mean(), inplace=True)
# 用中位数填充
df['feature_3'].fillna(df['feature_3'].median(), inplace=True)

3)使用相邻值填充

若相邻样本存在某种联系(如表示传感器连续的两次采样结果),可以使用相邻值进行填充,代码如下。

df['feature_4'].fillna(method='ffill', inplace=True) # 用前一个有效观察值填充
df['feature_4'].fillna(method='bfill', inplace=True) # 用后一个有效观察值填充

4)使用预测值填充

当数据量足够大,且要填充的列比较容易拟合时,可以使用预测值填充的方式,这种方法填充后的数据更加准确,可以减少由人为数据分析所带来的影响,代码如下。