Python缺失值预处理——复杂缺失值填补方法

star2017 1年前 ⋅ 176 阅读

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

数据准备

## 输出高清图像
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
## 图像显示中文的问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns 
sns.set(font= "Kaiti",style="ticks",font_scale=1.4)

## 导入本小节会使用到的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns 
import missingno as msno 
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
from missingpy import MissForest

## 读取用于演示的数据集
oceandf = pd.read_csv("data/chap2/热带大气海洋数据.csv")
## 判断每个变量中是否存在缺失值
pd.isna(oceandf).sum()
Year               0
Latitude           0
Longitude          0
SeaSurfaceTemp     3
AirTemp           81
Humidity          93
UWind              0
VWind              0
dtype: int64

IterativeImputer多变量缺失值填补

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

## 找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp) | pd.isna(oceandf.Humidity)
## IterativeImputer多变量缺失值填补方法
iterimp = IterativeImputer(random_state = 123)
oceandfiter = iterimp.fit_transform(oceandf)
## 获取填充后的变量
AirTemp = oceandfiter[:,4]
Humidity = oceandfiter[:,5]
## 可视化填充后的结果
plt.figure(figsize = (10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c = "blue",marker = "o",label = "非缺失值")
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用IterativeImputer方法填充")
plt.show()
Python缺失值预处理——复杂缺失值填补方法
图1 IterativeImputer方法填充缺失值

K近邻缺失值填补

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

## KNNImputer缺失值填补方法
knnimp = KNNImputer(n_neighbors = 5)
oceandfknn = knnimp.fit_transform(oceandf)
## 获取填充后的变量
AirTemp = oceandfknn[:,4]
Humidity = oceandfknn[:,5]
## 可视化填充后的结果
plt.figure(figsize = (10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c = "blue",marker = "o",label = "非缺失值")
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用KNNImputer方法填充")
plt.show()
Python缺失值预处理——复杂缺失值填补方法
图2 K近邻缺失值填补

MissForest缺失值填补

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

## MissForest缺失值填补方法
forestimp = MissForest(n_estimators = 100,random_state = 123)
oceandfforest = forestimp.fit_transform(oceandf)
## 获取填充后的变量
AirTemp = oceandfforest[:,4]
Humidity = oceandfforest[:,5]
## 可视化填充后的结果
plt.figure(figsize = (10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c = "blue",marker = "o",label = "非缺失值")
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用MissForest方法填充")
plt.show()
Python缺失值预处理——复杂缺失值填补方法
图3 MissForest缺失值填充

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

使用的数据获取链接:

链接:https://pan.baidu.com/s/1pYM1fTz9m7ZA6yOP54CWkg 
提取码:whj6

文章首发于微信公众号:Adam大数据分析小站
微信公众号:AdamBigData

本文来自zhihu,观点不代表一起大数据-技术文章心得立场,如若转载,请注明出处:https://zhuanlan.zhihu.com/p/348974197

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: