【热卡填充法介绍】

文章目录

  • 前言
  • 一、什么是热卡填充法?
  • 二、热卡填充法的基本思想
  • 三、热卡填充法的常见类型
    • [1. 随机热卡填充](#1. 随机热卡填充)
    • [2. 最近邻热卡填充](#2. 最近邻热卡填充)
    • [3. 分层热卡填充](#3. 分层热卡填充)
    • [4. 单热卡与多热卡](#4. 单热卡与多热卡)
  • 四、热卡填充法的适用场景
    • [1. 数据具有明显分组特征](#1. 数据具有明显分组特征)
    • [2. 需要尽量保留原始分布](#2. 需要尽量保留原始分布)
    • [3. 缺失比例不高](#3. 缺失比例不高)
    • [4. 对统计性质要求较高](#4. 对统计性质要求较高)
  • 五、热卡填充法的优点和缺点
    • 优点
      • [1. 更接近真实数据](#1. 更接近真实数据)
      • [2. 保持数据分布](#2. 保持数据分布)
      • [3. 对类别型变量友好](#3. 对类别型变量友好)
      • [4. 适合业务规则明显的数据](#4. 适合业务规则明显的数据)
    • 缺点
      • [1. 实现比简单填充更复杂](#1. 实现比简单填充更复杂)
      • [2. 结果带有随机性](#2. 结果带有随机性)
      • [3. 依赖相似样本质量](#3. 依赖相似样本质量)
      • [4. 大规模数据计算成本更高](#4. 大规模数据计算成本更高)
  • [六、Python 实现热卡填充法](#六、Python 实现热卡填充法)
    • [1. 准备数据](#1. 准备数据)
    • [2. 按规则构造热卡候选池](#2. 按规则构造热卡候选池)
    • [3. 查看填充结果](#3. 查看填充结果)
  • 七、热卡填充法的改进思路
    • [1. 加入更多特征](#1. 加入更多特征)
    • [2. 使用 K 近邻思想](#2. 使用 K 近邻思想)
    • [3. 分类变量和数值变量分开处理](#3. 分类变量和数值变量分开处理)
    • [4. 结合业务规则](#4. 结合业务规则)
  • 八、热卡填充法和其他缺失值方法的对比
    • [1. 与删除法对比](#1. 与删除法对比)
    • [2. 与均值填充对比](#2. 与均值填充对比)
    • [3. 与回归填充对比](#3. 与回归填充对比)

前言

在实际数据分析和机器学习项目中,缺失值是非常常见的问题。面对缺失值,很多人第一时间会想到均值填充、中位数填充或者直接删除缺失行。但这些方法虽然简单,却常常会破坏数据分布,甚至影响后续模型效果。热卡填充法是一种更贴近真实数据分布的缺失值处理方法。它不会简单地用一个固定值替代缺失值,而是从"相似样本"中随机抽取一个值进行填充,因此在很多场景下能够更好地保持数据的原始特征。


一、什么是热卡填充法?

热卡填充法,英文通常称为 Hot Deck Imputation,是一种常见的缺失值填充方法。

它的核心思想是:

对于某条记录中缺失的字段,不直接使用统计量替代,而是从"与它相似的其他完整样本"中随机挑选一个值来填充。

这里的"热卡"可以理解为"当前可用的样本池"。也就是说,填充值不是凭空计算出来的,而是来源于真实样本,因此更容易保留数据原有的分布特征。

举个简单例子:

假设我们有一份用户数据,年龄、性别、收入、消费等级等字段中存在缺失值。

如果某个"20多岁、男性、城市用户"的收入缺失,那么我们可以去找一些"年龄相近、性别相同、地区相似"的用户,从他们的收入中随机抽取一个值来作为填充值。

这种方式比"所有人都填平均收入"更自然,也更符合真实业务场景。


二、热卡填充法的基本思想

热卡填充法并不是随便从全体样本里抽一个值,而是通常遵循"相似性原则"。

也就是说,先找到和缺失样本相似的样本集合,再从这个集合中选择填充值。

常见的相似性判断方式包括:

  1. 按类别分组

    例如根据性别、地区、职业、年龄段进行分组。

  2. 按距离匹配

    例如使用欧氏距离、曼哈顿距离、余弦相似度等方式寻找最接近的样本。

  3. 按规则筛选

    例如"年龄在 25~30 岁之间,且学历相同"的样本都可以作为候选热卡。

热卡填充法的关键并不是"填什么值",而是"从哪里取值"。


三、热卡填充法的常见类型

热卡填充法并不是单一形式,实际应用中常见的方式有以下几种。

1. 随机热卡填充

从同一组相似样本中随机抽取一个值进行填充。

例如:

  • 缺失用户属于"上海、25~30 岁、女性"组
  • 在这个组中找到已有的收入值
  • 随机取一个作为填充值

这种方法简单直接,保留了数据的随机性。


2. 最近邻热卡填充

先寻找最相近的样本,再使用该样本的值进行填充,或者从最近的几个样本中随机抽取。

例如:

  • 找到与目标样本最相似的 5 个样本
  • 从这 5 个样本的目标字段中随机选择一个值

这种方式比纯随机热卡更有针对性。


3. 分层热卡填充

先按某些关键字段分层,再在同层内部进行填充。

例如:

  • 先按性别分层
  • 再按年龄段分层
  • 最后在同层中随机抽取值

这种方式在人口统计数据、问卷数据中非常常见。


4. 单热卡与多热卡

  • 单热卡:每个缺失值只填充一次。
  • 多热卡:对同一个缺失值进行多次填充,生成多个完整数据集,再进行综合分析。

多热卡在统计分析中更严谨,但实现更复杂。

本文重点介绍更容易落地的单热卡填充。


四、热卡填充法的适用场景

热卡填充法适合以下场景:

1. 数据具有明显分组特征

例如:

  • 性别
  • 年龄段
  • 地区
  • 职业
  • 教育水平

这类字段能够帮助你找到"相似样本"。

2. 需要尽量保留原始分布

如果直接用均值填充,可能会导致:

  • 数据方差变小
  • 极值被抹平
  • 类别特征失真

热卡填充法更适合保持真实波动。

3. 缺失比例不高

当缺失值非常多时,热卡填充法的候选样本可能不足,效果会下降。

因此它更适合中低比例缺失场景。

4. 对统计性质要求较高

在调查问卷、社会统计、医疗研究等场景中,热卡填充法常用于减少填充带来的偏差。


五、热卡填充法的优点和缺点

优点

1. 更接近真实数据

填充值来源于真实样本,而不是人为计算出来的固定值,因此更自然。

2. 保持数据分布

相比均值填充,热卡填充更容易保留变量的原始分布和离散特征。

3. 对类别型变量友好

对于分类数据,均值填充没有意义,而热卡填充可以直接从相似类别样本中抽值。

4. 适合业务规则明显的数据

只要能够合理定义"相似样本",热卡法通常都能发挥作用。


缺点

1. 实现比简单填充更复杂

需要先定义分组规则或相似度计算方式。

2. 结果带有随机性

同一份数据多次填充,结果可能略有不同。

3. 依赖相似样本质量

如果候选样本本身不够代表性,填充结果也会受到影响。

4. 大规模数据计算成本更高

尤其是基于距离搜索的热卡填充,会增加计算开销。


六、Python 实现热卡填充法

下面通过一个简单案例,演示如何使用 Python 实现热卡填充法。

假设有一份用户数据,其中 income 字段存在缺失值,我们希望根据 agegender 进行热卡填充。

1. 准备数据

python 复制代码
import pandas as pd
import numpy as np

data = pd.DataFrame({
    'name': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十'],
    'age': [23, 25, 24, 31, 29, 26, 24, 30],
    'gender': ['男', '男', '女', '女', '男', '女', '男', '女'],
    'income': [8000, 8500, np.nan, 12000, 9500, np.nan, 7800, 11000]
})

print(data)

输出结果类似于:

python 复制代码
  name  age gender   income
0  张三  23     男   8000.0
1  李四  25     男   8500.0
2  王五  24     女      NaN
3  赵六  31     女  12000.0
4  孙七  29     男   9500.0
5  周八  26     女      NaN
6  吴九  24     男   7800.0
7  郑十  30     女  11000.0

2. 按规则构造热卡候选池

这里我们定义一个简单规则:

  • 年龄相差不超过 3 岁
  • 性别相同

满足这两个条件的样本作为候选热卡。

python 复制代码
def hot_deck_fill(df, target_col, group_cols, age_col='age', age_window=3):
    df = df.copy()
    
    for idx, row in df[df[target_col].isna()].iterrows():
        candidates = df[df[target_col].notna()].copy()
        
        for col in group_cols:
            candidates = candidates[candidates[col] == row[col]]
        
        candidates = candidates[
            (candidates[age_col] >= row[age_col] - age_window) &
            (candidates[age_col] <= row[age_col] + age_window)
        ]
        
        if len(candidates) > 0:
            df.at[idx, target_col] = candidates[target_col].sample(1).iloc[0]
        else:
            # 如果没有找到候选样本,可以退化为全局随机抽取
            df.at[idx, target_col] = df[df[target_col].notna()][target_col].sample(1).iloc[0]
    
    return df

filled_data = hot_deck_fill(data, 'income', ['gender'])
print(filled_data)

这个函数做了几件事:

  • 找出 income 缺失的行
  • 在非缺失样本中筛选 gender 相同的记录
  • 再筛选年龄相近的样本
  • 从候选池中随机抽取一个收入值进行填充

3. 查看填充结果

python 复制代码
print("填充前:")
print(data)

print("\n填充后:")
print(filled_data)

七、热卡填充法的改进思路

在实际项目中,简单热卡法还可以进一步优化。

1. 加入更多特征

不仅用性别和年龄,还可以加入:

  • 地区
  • 职业
  • 教育水平
  • 消费等级

特征越丰富,候选样本越准确。


2. 使用 K 近邻思想

可以用距离度量找到最相似的 K 个样本,再从中抽取填充值。

这种方式本质上更接近"基于邻居的热卡填充"。


3. 分类变量和数值变量分开处理

  • 类别变量:直接从相似样本中随机抽取
  • 数值变量:从候选样本中抽取,或者结合分布信息进行约束

4. 结合业务规则

例如在金融数据中:

  • 年龄不能为负
  • 收入不应超过某个极端阈值
  • 某些字段必须遵循逻辑关系

热卡填充时要把这些规则考虑进去,否则会生成不合理数据。


八、热卡填充法和其他缺失值方法的对比

1. 与删除法对比

删除法虽然简单,但会损失样本量。

热卡填充法可以保留更多数据,适合样本较少的情况。

2. 与均值填充对比

均值填充会压缩数据波动,尤其对收入、消费、评分等变量影响明显。

热卡填充能保留一定随机性和离散性。

3. 与回归填充对比

回归填充会利用变量之间的关系进行预测,适合结构化数据。

热卡填充则更直观,更容易解释,尤其适合类别变量。

相关推荐
片酷2 小时前
【Isaacsim&Isaaclab】安装教程
linux·开发语言·python
microxiaoxiao2 小时前
Aeroshell:2026 年,支持AI的SSH 终端
运维·人工智能·ssh
RunsenLIu2 小时前
019 | backtrader回测布林带突破策略
开发语言·python
feng14562 小时前
稳定性-风险文化建设和风险意识培养
运维·人工智能
小程故事多_802 小时前
AI编码效率革命,Agent Orchestrator如何让多智能体并行开发成为现实
人工智能·架构·智能体
feng14562 小时前
OpenSREClaw - OpenClaw 多 Agent 架构
人工智能·架构
olivesun882 小时前
20万元 · 1年期 · A股组合投资方案
大数据·人工智能·物联网
陈天伟教授2 小时前
GPT Image 2
开发语言·人工智能·架构