当前位置: 首页 > news >正文

【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)

数据科学必备技能:填补缺失值(Imputing Missing Values)

在数据分析和机器学习项目中,缺失值(Missing Values) 是非常常见的问题。缺失的数据如果处理不当,会严重影响模型的训练效果,甚至导致模型性能大幅下降。因此,掌握缺失值填补的方法,是数据科学工作中非常重要的一步。

本文将基于一张图,详细介绍几种常见且实用的缺失值填补方法,并结合实际例子进行讲解。


1. 定量分析:用平均值填补

如果缺失的是定量变量(Quantitative Variable),如数值型数据:年龄、身高、收入等,常用均值(mean)进行填补。

原理:均值可以代表数据的整体水平,用均值填补可以尽量减少数据波动带来的影响。

示例
假设你有一组数据:

年龄
25
27
NaN
29
31

缺失了一个年龄值,可以先计算现有数据的平均值:

然后将缺失值填补为28。

代码示例(Python + Pandas)

import pandas as pddf = pd.DataFrame({'Age': [25, 27, None, 29, 31]})
df['Age'].fillna(df['Age'].mean(), inplace=True)
print(df)

2. 定性分析:用众数填补

如果缺失的是定性变量(Categorical Variable),如性别、城市类别、颜色等,常用众数(mode)进行填补。

原理:众数是出现次数最多的类别,使用众数可以最大限度保持数据分布的一致性。

示例
假设你的数据如下:

城市
北京
上海
NaN
北京
广州

北京出现次数最多,因此缺失值可以填补为“北京”。

代码示例(Python + Pandas)

import pandas as pddf = pd.DataFrame({'City': ['北京', '上海', None, '北京', '广州']})
df['City'].fillna(df['City'].mode()[0], inplace=True)
print(df)

3. 使用模型预测填补缺失值

对于缺失值较多、或者缺失值和其他特征有明显相关性的情况,可以使用预测模型来填补缺失值。例如,使用 K近邻(KNN)决策树线性回归等算法。

3.1 K近邻(KNN)填补

KNN可以根据数据中与缺失值样本最相似的其他样本的特征,预测其可能的取值。

原理简述

  • 找到与缺失样本最接近的K个完整样本;

  • 取这K个样本中对应特征的均值(定量)或众数(定性)作为填补值。

代码示例(Python + sklearn)

import numpy as np
import pandas as pd
from sklearn.impute import KNNImputerdf = pd.DataFrame({'Height': [1.7, 1.8, np.nan, 1.6, 1.75],'Weight': [65, 80, 70, 60, 75]
})imputer = KNNImputer(n_neighbors=2)
df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
print(df_filled)

拓展内容:其他常用填补策略

除了以上三种常见方法,还有一些高级处理方法:

  • 插值法(Interpolation):适用于时间序列数据,比如线性插值、样条插值等。

  • 基于多重插补(MICE):多次预测缺失值,减少单次预测误差。

  • 直接删除缺失行/列:如果缺失比例非常高,可以考虑删除相关样本或特征。

  • 添加缺失值指示变量:为缺失的位置添加0/1标记,作为额外特征喂给模型。

选择哪种方法,需要根据数据特点、业务需求、模型要求综合判断。


总结

场景填补方法
定量分析(数值型)平均值填补
定性分析(类别型)众数填补
缺失复杂、相关性强建模预测填补

掌握缺失值处理的正确姿势,可以有效提升数据质量,保证后续分析和建模的准确性。在实际工作中,建议结合探索性数据分析(EDA)对缺失情况进行全面了解后,制定最适合的填补策略。


如果你觉得本文有帮助,欢迎点赞、收藏或留言交流~

http://www.xdnf.cn/news/431911.html

相关文章:

  • OpenAI新开源项目Codex CLI提升开发效率的新利器
  • 国自然项目|朱蓓薇院士团队谭明乾教授课题组在ACS Nano(IF=15.8)发表高水平文章!
  • 雅思口语 Part 1 Math
  • 从零开始掌握FreeRTOS(2)链表之节点的定义
  • 虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
  • 自然语言生成在商业智能中的应用实践
  • Future,Callable,CompletableFuture是什么?
  • 2025年项目管理软件革命:AI与国产化浪潮如何重塑企业协作生态
  • tc qdisc参数详解
  • 智慧校园场景下iVX 研发基座应用实践与行业适配研究
  • Milvus(21):过滤搜索、范围搜索、分组搜索
  • python面试实战经验分享
  • Python 实战:如何智能修改字典中的实体值?
  • 从 Vue3 回望 Vue2:响应式的内核革命
  • 集成设备管理(IDM)
  • Android组件权威解析:Activity与Fragment的深度探索与实战
  • 双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题
  • AI模拟了一场5亿年的进化
  • Python Django基于模板的药品名称识别系统【附源码、文档说明】
  • 支付宝小程序开发指南
  • servlet-api
  • 转发多台px4仿真UDP数据到地面站
  • R²AIN SUITE:AI+文档切片,重塑知识管理新标杆
  • Sails.js 知识框架整理
  • 超声波传感器模块
  • 消息~组件(群聊类型)ConcurrentHashMap发送
  • 自适应稀疏核卷积网络:一种高效灵活的图像处理方案
  • Java自定义线程池:从原理到高性能实践
  • NY164NY165美光固态闪存NY166NY172
  • 医疗设备EMC测试为什么推荐GRJ1080B系列滤波器?