python 如何通过KNN来填充缺失值

 更新时间:2021年05月21日 12:09:43   作者:六mo神剑  
这篇文章主要介绍了python 通过KNN来填充缺失值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

看代码吧~

# 加载库
import numpy as np
from fancyimpute import KNN
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
# 创建模拟特征矩阵
features, _ = make_blobs(n_samples = 1000,
                         n_features = 2,
                         random_state = 1)
# 标准化特征
scaler = StandardScaler()
standardized_features = scaler.fit_transform(features)
standardized_features
# 制造缺失值
true_value = standardized_features[0,0]
standardized_features[0,0] = np.nan
standardized_features
# 预测
features_knn_imputed = KNN(k=5, verbose=0).fit_transform(standardized_features)
# features_knn_imputed = KNN(k=5, verbose=0).complete(standardized_features)
features_knn_imputed
# #对比真实值和预测值
print("真实值:", true_value)
print("预测值:", features_knn_imputed[0,0])
# 加载库
import numpy as np
from fancyimpute import KNN
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
​
# 创建模拟特征矩阵
features, _ = make_blobs(n_samples = 1000,
                         n_features = 2,
                         random_state = 1)​
# 标准化特征
scaler = StandardScaler()
standardized_features = scaler.fit_transform(features)
standardized_features
# 制造缺失值
true_value = standardized_features[0,0]
standardized_features[0,0] = np.nan
standardized_features
# 预测
features_knn_imputed = KNN(k=5, verbose=0).fit_transform(standardized_features)
# features_knn_imputed = KNN(k=5, verbose=0).complete(standardized_features)
features_knn_imputed
# #对比真实值和预测值
print("真实值:", true_value)
print("预测值:", features_knn_imputed[0,0])
真实值: 0.8730186113995938
预测值: 1.0955332713113226

补充:scikit-learn中一种便捷可靠的缺失值填充方法:KNNImputer

在数据挖掘工作中,处理样本中的缺失值是必不可少的一步。其中对于缺失值插补方法的选择至关重要,因为它会对最后模型拟合的效果产生重要影响。

在2019年底,scikit-learn发布了0.22版本,此次版本除了修复之前的一些bug外,还更新了很多新功能,对于数据挖掘人员来说更加好用了。其中我发现了一个新增的非常好用的缺失值插补方法:KNNImputer。这个基于KNN算法的新方法使得我们现在可以更便捷地处理缺失值,并且与直接用均值、中位数相比更为可靠。利用“近朱者赤”的KNN算法原理,这种插补方法借助其他特征的分布来对目标特征进行缺失值填充。

下面,就让我们用实际例子来看看KNNImputer是如何使用的吧‎

使用KNNImputer需要从scikit-learn中导入:

from sklearn.impute import KNNImputer

先来一个小例子开开胃,data中第二个样本存在缺失值。

data = [[2, 4, 8], [3, np.nan, 7], [5, 8, 3], [4, 3, 8]]

KNNImputer中的超参数与KNN算法一样,n_neighbors为选择“邻居”样本的个数,先试试n_neighbors=1。

imputer = KNNImputer(n_neighbors=1)
imputer.fit_transform(data)

可以看到,因为第二个样本的第一列特征3和第三列特征7,与第一行样本的第一列特征2和第三列特征8的欧氏距离最近,所以缺失值按照第一个样本来填充,填充值为4。那么n_neighbors=2呢?

imputer = KNNImputer(n_neighbors=2)
imputer.fit_transform(data)

此时根据欧氏距离算出最近相邻的是第一行样本与第四行样本,此时的填充值就是这两个样本第二列特征4和3的均值:3.5。

接下来让我们看一个实际案例,该数据集来自Kaggle皮马人糖尿病预测的分类赛题,其中有不少缺失值,我们试试用KNNImputer进行插补。

import numpy as np
import pandas as pd
import pandas_profiling as pp
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(context="notebook", style="darkgrid")
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
 
from sklearn.impute import KNNImputer
#Loading the dataset
diabetes_data = pd.read_csv('pima-indians-diabetes.csv')
diabetes_data.columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 
                       'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']
diabetes_data.head()

在这个数据集中,0值代表的就是缺失值,所以我们需要先将0转化为nan值然后进行缺失值处理。

diabetes_data_copy = diabetes_data.copy(deep=True)
diabetes_data_copy[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']] = diabetes_data_copy[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']].replace(0, np.NaN)
 
print(diabetes_data_copy.isnull().sum())

在本文中,我们尝试用DiabetesPedigreeFunction与Age,对BloodPressure中的35个缺失值进行KNNImputer插补。

先来看一下缺失值都在哪几个样本:

null_index = diabetes_data_copy.loc[diabetes_data_copy['BloodPressure'].isnull(), :].index
null_index

imputer = KNNImputer(n_neighbors=10)
diabetes_data_copy[['BloodPressure', 'DiabetesPedigreeFunction', 'Age']] = imputer.fit_transform(diabetes_data_copy[['BloodPressure', 'DiabetesPedigreeFunction', 'Age']])
print(diabetes_data_copy.isnull().sum())

可以看到现在BloodPressure中的35个缺失值消失了。我们看看具体填充后的数据(只截图了部分):

diabetes_data_copy.iloc[null_index]

到此,BloodPressure中的缺失值已经根据DiabetesPedigreeFunction与Age运用KNNImputer填充完成了。注意的是,对于非数值型特征需要先转换为数值型特征再进行KNNImputer填充操作,因为目前KNNImputer方法只支持数值型特征(ʘ̆ωʘ̥̆‖)՞。

相关文章

  • Python 操作Excel-openpyxl模块用法实例

    Python 操作Excel-openpyxl模块用法实例

    openpyxl 模块是一个读写 Excel 2010 文档的 Python 库,如果要处理更早格式的 Excel 文 档,需要用到额外的库,openpyxl 是一个比较综合的工具,能够同时读取和修改 Excel 文档,这篇文章主要介绍了Python 操作Excel-openpyxl模块使用,需要的朋友可以参考下
    2023-05-05
  • Python 一篇文章看懂时间日期对象

    Python 一篇文章看懂时间日期对象

    学习每一门语言多多少少会用到与时间相关的东西,咱们今天呢就谈一谈Python中的时间与日期对象。在Python中时间对象一般可以用来测量效率。日期对象用来处理日期与字符串之间的关系
    2022-03-03
  • Python设计密码强度校验程序

    Python设计密码强度校验程序

    这篇文章主要介绍了Python如何设计密码强度校验程序,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python中导入csv数据文件的详细示例教程

    Python中导入csv数据文件的详细示例教程

    Python中的csv模块是一种用于读取和写入csv文件的模块,csv可以用于将数据从文件或者其他来源导入到Python中进行分析和处理,在这篇文章中,我们将全面介绍Python中如何导入csv文件,并将从多个方面进行详细探讨,感兴趣的朋友一起看看吧
    2024-03-03
  • 解决keras使用cov1D函数的输入问题

    解决keras使用cov1D函数的输入问题

    这篇文章主要介绍了解决keras使用cov1D函数的输入问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • OpenMV与JSON编码问题解析

    OpenMV与JSON编码问题解析

    这篇文章主要介绍了OpenMV与JSON编码,JSON是一种简洁高效的交换数据的格式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-06-06
  • Django项目中动态设置静态文件路径的全过程

    Django项目中动态设置静态文件路径的全过程

    这篇文章主要给大家介绍了关于Django项目中动态设置静态文件路径的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Python中turtle.write方法使用说明

    Python中turtle.write方法使用说明

    turtle模块以面向对象和面向过程的方式提供turtle图形基元,由于它使用Tkinter作为基础图形,因此需要安装有Tk支持的Python版本,下面这篇文章主要给大家介绍了关于Python中turtle.write方法使用说明的相关资料,需要的朋友可以参考下
    2022-02-02
  • 详解Django中异步任务之django-celery

    详解Django中异步任务之django-celery

    这篇文章主要介绍了详解Django中异步任务之django-celery,本文通过场景分析实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Python使用pyautocad+openpyxl处理cad文件示例

    Python使用pyautocad+openpyxl处理cad文件示例

    这篇文章主要介绍了Python使用pyautocad+openpyxl处理cad文件,结合实例形式分析了Python使用pyautocad与openpyxl模块读写cad文件相关应用操作技巧,需要的朋友可以参考下
    2019-07-07

最新评论