【漫话机器学习系列】256.用 k-NN 填补缺失值

news2025/7/19 2:41:09

用 k-NN 填补缺失值:原理、实现与应用

在实际的数据科学项目中,我们经常会遇到数据缺失(Missing Values)的问题。缺失值如果处理不当,不仅会影响模型训练,还可能导致最终结果偏差。

今天,我们来学习一种简单而有效的方法——使用 k 最近邻(k-Nearest Neighbors,简称 k-NN)来填补缺失值

下面是本文核心示意图:


(示意图来源:Chris Albon)


1. 为什么需要处理缺失值?

在机器学习中,大多数算法都要求输入的数据是完整的,即不能存在空缺值 (NaN)。而实际中由于采集错误、设备问题、用户行为等种种原因,数据集通常会出现不同程度的缺失。

常见的缺失值处理方法有:

  • 丢弃缺失的样本或特征

  • 使用均值、中位数、众数填充

  • 使用回归、插值等高级填补技术

  • 使用基于 k-NN 的方法进行填补

k-NN 填补是一种基于相似性的填补方法,通常能取得更好的效果,因为它考虑了数据的整体分布和结构。


2. 什么是 k-NN 填补缺失值?

简单来说,k-NN 填补就是:

找到与缺失样本最相似的 k 个样本,利用它们的特征值来填补缺失项。

根据上图,填补步骤可以总结为:

  1. 确定缺失值位置
    比如有一个样本在特征1、特征2上存在数据,但特征3缺失。

  2. 计算距离
    只基于已有特征(非缺失部分)计算该样本与其他样本之间的距离。

  3. 选取最近邻
    找到距离最近的 k 个样本(通常 k 取 5~10)。

  4. 填补缺失值
    取这 k 个样本在缺失特征上的中位数或者加权平均数,作为缺失值的估计。


3. 具体案例:基于 scikit-learn 实现

使用 scikit-learn,我们可以直接使用 KNNImputer 类来完成填补。示例代码如下:

from sklearn.impute import KNNImputer
import numpy as np

# 假设我们的数据矩阵中有一些缺失值
X = np.array([[1, 2, np.nan],
              [3, 4, 3],
              [5, 6, 2],
              [np.nan, 8, 1]])

# 创建一个k-NN填补器,设置k=2
imputer = KNNImputer(n_neighbors=2)

# 执行填补
X_filled = imputer.fit_transform(X)

print(X_filled)

输出结果示例

[[1.  2.  2.5]
 [3.  4.  3. ]
 [5.  6.  2. ]
 [4.  8.  1. ]]

可以看到,缺失值已经被合理地填补。


4. 关键细节和注意事项

  • 标准化很重要
    在 k-NN 中,距离计算受特征量纲影响很大。因此,通常需要对数据先进行标准化(如使用 StandardScalerMinMaxScaler)。

  • 选择合理的 k 值
    k 值太小,容易受噪声干扰;k 值太大,又可能引入无关样本。通常可以交叉验证或经验选择 5~10。

  • 缺失太多不适用
    如果数据中缺失比例太高,k-NN 填补可能不够可靠,此时可以考虑模型预测或直接删除缺失严重的样本/特征。

  • 计算复杂度
    k-NN 填补在大数据集上会比较慢,因为每次都要计算距离。可以考虑使用近似最近邻算法加速。


5. 应用场景

  • 客户信息表缺失部分字段

  • 医疗数据(如血液指标)存在缺失

  • 设备传感器数据偶尔掉包

  • 用户行为数据不完整

在这些场景下,使用 k-NN 填补都能取得比简单均值填补更好的效果。


6. 总结

k-NN 填补缺失值,是一种基于数据本身结构的智能填补方法,简单、直观、效果良好。
虽然计算量较大、对尺度敏感,但在中小规模数据上,特别是特征之间具有明显结构或聚类性的场景下,非常值得使用。

建议在实际使用时搭配标准化处理,并根据数据特点合理选择 k 值!


如果觉得有用,欢迎点赞、收藏、评论交流~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金格iWebOffice控件在新版谷歌Chrome中不能加载了怎么办?

金格iWebOffice控件是由江西金格网络科技有限责任公司开发的中间件软件,主要用于在浏览器中直接编辑Word、Excel、PowerPoint等Office文档,曾经是一款优秀国产的WebOffice插件。 由于2022年Chrome等浏览器取消支持PPAPI接口,导致这款金格iWe…

实验6分类汇总

设计性实验 (1)查询每门课程的平均分,包括课程号和平均分。 SELECT Cno AS 课程号, AVG(Degree) AS 平均分 FROM Score065 GROUP BY Cno;(2)查询每门课程的平均分,包括课程号、课程名和平均分。 SELECT c.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) AS 平均分 FROM …

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517

感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分(25-05-04)这一天是青年节,在这一天与青年朋友交流这个是事先规划好的: “可以猜一猜,博士会被撤销吗?导师会被处理吗?千万不要回复,放心里,过段时间看结果,看看自己预估社会能力如何。 观察社会新闻,可以用…

Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程

文章目录 前言Python 3.11介绍Python 3.11安装包下载Python 3.11安装步骤 前言 作为当前最热门的编程语言之一,Python 3.11 不仅拥有简洁优雅的语法,还在性能上实现了飞跃,代码运行速度提升显著。无论是初入编程的小白,还是经验丰…

一个指令,让任意 AI 快速生成思维导图

大家好,我是安仔,一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧,让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 ~ KimiXMind 安仔经常用 XMind 来绘制思维导图,但是 AI 是没…

FPGA图像处理(六)------ 图像腐蚀and图像膨胀

默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…

LVDS系列12:Xilinx Ultrascale系可编程输入延迟(二)

本节讲解Ultrascale IDELAYE3的参数;  IDELAYE3参数: REFCLK_FREQUENCY:如果使用COUNT模式,保持300MHz的默认值即可; 如果使用TIME模式,则该值与IDELAYCTRL参考时钟要匹配; DELAY_SRC&#…

ARM (Attention Refinement Module)

ARM模块【来源于BiSeNet】:细化特征图的注意力,增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块,它通过注意力机制来细化特征图&…

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)

文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例,新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除,删除值和未删除…

前端二进制数据指南:从 ArrayBuffer 到高级流处理

前端开发中,二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释: 前端二进制数据介绍 1. 什么是前端二进制数据? 指计算机原始的 0 和 1 格式的数据(比如一张图片的底层代码&#xff…

如何选择高性价比的 1T 服务器租用服务​

选择高性价比的 1T 服务器租用服务​,可参考以下内容: 1、根据需求选配置​ 明确自身业务需求是关键。若为小型网站或轻量级应用,数据存储与处理需求不高,选择基础配置服务器即可。如个人博客网站,普通的 Intel Xeon …

一个可拖拉实现列表排序的WPF开源控件

从零学习构建一个完整的系统 推荐一个可通过拖拉,来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目,用于在WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…

AI-02a5a6.神经网络-与学习相关的技巧-批量归一化

批量归一化 Batch Normalization 设置合适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利的进行学习。那么,更进一步,强制性的调整激活值的分布,是的各层拥有适当的广度呢?批量归一化&#…

SVGPlay:一次 CodeBuddy 主动构建的动画工具之旅

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 背景与想法 我一直对 SVG 图标的动画处理有浓厚兴趣,特别是描边、渐变、交互等效果能为图标增添许…

自己手写tomcat项目

一:Servlet的原理 在Servlet(接口中)有: 1.init():初始化servlet 2.getServletConfig():获取当前servlet的配置信息 3.service():服务器(在HttpServlet中实现,目的是为了更好的匹配http的请求方式) 4.g…

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…

生成对抗网络(Generative Adversarial Networks ,GAN)

生成对抗网络是深度学习领域最具革命性的生成模型之一。 一 GAN框架 1.1组成 构造生成器(G)与判别器(D)进行动态对抗,实现数据的无监督生成。 G(造假者):接收噪声 ​&#xff0c…

在WSL中的Ubuntu发行版上安装Anaconda、CUDA、CUDNN和TensorRT

在Windows 11的WSL(Windows Subsystem for Linux)环境中安装Anaconda、CUDA、CUDNN和TensorRT的详细步骤整理: 本文是用cuda12.4与CuDNN 8.9.7 和 TensorRT 9.1.0 及以上对应 一、前言(准备) 确保电脑上有NVIDIA GPU…

代码随想录算法训练营第60期第三十九天打卡

大家好,我们今天继续讲解我们的动态规划章节,昨天我们讲到了动态规划章节的背包问题,昨天讲解的主要是0-1背包问题,那么今天我们可能就会涉及到完全背包问题,昨天的题目有一道叫做分割等和子集,今天应该会有…

计算机网络体系结构深度解析:从理论到实践的全面梳理

计算机网络体系结构深度解析:从理论到实践的全面梳理 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,祝愿大家期末都能考一个好成绩! 一、常见计算机网络体系结构 …