在python中使用KNN算法处理缺失的数据

简介: 在python中使用KNN算法处理缺失的数据

处理缺失的数据并不是一件容易的事。 方法的范围从简单的均值插补和观察值的完全删除到像MICE这样的更高级的技术。 解决问题的挑战性是选择使用哪种方法。 今天,我们将探索一种简单但高效的填补缺失数据的方法-KNN算法。

640.png

KNN代表“ K最近邻居”,这是一种简单算法,可根据定义的最接近邻居数进行预测。它计算从您要分类的实例到训练集中其他所有实例的距离。

正如标题所示,我们不会将算法用于分类目的,而是填充缺失值。本文将使用房屋价格数据集,这是一个简单而著名的数据集,仅包含500多个条目。

这篇文章的结构如下:

  1. 数据集加载和探索
  2. KNN归因
  3. 归因优化
  4. 结论

数据集加载和探索

如前所述,首先下载房屋数据集。另外,请确保同时导入了Numpy和Pandas。这是前几行的外观:

640.png

默认情况下,数据集缺失值非常低-单个属性中只有五个:

640.png

让我们改变一下。您通常不会这样做,但是我们需要更多缺少的值。首先,我们创建两个随机数数组,其范围从1到数据集的长度。第一个数组包含35个元素,第二个数组包含20个(任意选择):

i1=np.random.choice(a=df.index, size=35)
i2=np.random.choice(a=df.index, size=20)

这是第一个数组的样子:

640.png

您的数组将有所不同,因为随机化过程是随机的。接下来,我们将用NAN替换特定索引处的现有值。这是如何做:

df.loc[i1, 'INDUS'] =np.nandf.loc[i2, 'TAX'] =np.nan

现在,让我们再次检查缺失值-这次,计数有所不同:

640.png

这就是我们从归因开始的全部前置工作。让我们在下一部分中进行操作。

KNN归因

整个插补可归结为4行代码-其中之一是库导入。我们需要sklearn.impute中的KNNImputer,然后以一种著名的Scikit-Learn方式创建它的实例。该类需要一个强制性参数– n_neighbors。它告诉冒充参数K的大小是多少。

首先,让我们选择3的任意数字。稍后我们将优化此参数,但是3足以启动。接下来,我们可以在计算机上调用fit_transform方法以估算缺失的数据。

最后,我们将结果数组转换为pandas.DataFrame对象,以便于解释。这是代码:

fromsklearn.imputeimportKNNImputerimputer=KNNImputer(n_neighbors=3)
imputed=imputer.fit_transform(df)
df_imputed=pd.DataFrame(imputed, columns=df.columns)

非常简单。让我们现在检查缺失值:

640.png

尽管如此,仍然存在一个问题-我们如何为K选择正确的值?

归因优化

该住房数据集旨在通过回归算法进行预测建模,因为目标变量是连续的(MEDV)。这意味着我们可以训练许多预测模型,其中使用不同的K值估算缺失值,并查看哪个模型表现最佳。

但首先是导入。我们需要Scikit-Learn提供的一些功能-将数据集分为训练和测试子集,训练模型并进行验证。我们选择了“随机森林”算法进行训练。RMSE用于验证:

fromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestRegressorfromsklearn.metricsimportmean_squared_errorrmse=lambday, yhat: np.sqrt(mean_squared_error(y, yhat))

以下是执行优化的必要步骤:

迭代K的可能范围-1到20之间的所有奇数都可以

  1. 使用当前的K值执行插补
  2. 将数据集分为训练和测试子集
  3. 拟合随机森林模型
  4. 预测测试集
  5. 使用RMSE进行评估

听起来很多,但可以归结为大约15行代码。这是代码段:

defoptimize_k(data, target):
errors= []
forkinrange(1, 20, 2):
imputer=KNNImputer(n_neighbors=k)
imputed=imputer.fit_transform(data)
df_imputed=pd.DataFrame(imputed, columns=df.columns)
X=df_imputed.drop(target, axis=1)
y=df_imputed[target]
X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.2, random_state=42)
model=RandomForestRegressor()
model.fit(X_train, y_train)
preds=model.predict(X_test)
error=rmse(y_test, preds)
errors.append({'K': k, 'RMSE': error})
returnerrors

现在,我们可以使用修改后的数据集(在3列中缺少值)调用optimize_k函数,并传入目标变量(MEDV):

k_errors=optimize_k(data=df, target='MEDV')

就是这样!k_errors数组如下所示:

640.png

以可视化方式表示:

640.png

看起来K = 15是给定范围内的最佳值,因为它导致最小的误差。我们不会涵盖该错误的解释,因为它超出了本文的范围。让我们在下一节中总结一下。

总结

编写处理缺少数据归因的代码很容易,因为有很多现有的算法可以让我们直接使用。但是我们很难理解里面原因-了解应该推定哪些属性,不应该推算哪些属性。例如,可能由于客户未使用该类型的服务而缺失了某些值,因此没有必要执行估算。

最终确定是否需要进行缺失数据的处理,还需要有领域的专业知识,与领域专家进行咨询并研究领域是一种很好的方法。


目录
相关文章
|
2天前
|
机器学习/深度学习 算法 搜索推荐
联邦学习的未来:深入剖析FedAvg算法与数据不均衡的解决之道
随着数据隐私和数据安全法规的不断加强,传统的集中式机器学习方法受到越来越多的限制。为了在分布式数据场景中高效训练模型,同时保护用户数据隐私,联邦学习(Federated Learning, FL)应运而生。它允许多个参与方在本地数据上训练模型,并通过共享模型参数而非原始数据,实现协同建模。
|
1天前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
102 82
|
7天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
2天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
24 12
|
1天前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
27 9
|
1天前
|
数据采集 存储 前端开发
用Python抓取亚马逊动态加载数据,一文读懂
用Python抓取亚马逊动态加载数据,一文读懂
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80
|
24天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码

热门文章

最新文章