在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天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
|
12天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
44 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
12天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
45 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
12天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
54 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
17天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
18天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
25 1
|
19天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
19天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
24天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
18天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
26 0
下一篇
无影云桌面