数据缺失值填充:局部性与趋势性方法解析
立即解锁
发布时间: 2025-09-07 01:59:22 阅读量: 12 订阅数: 47 AIGC 


数据清洗的艺术与实践
# 数据缺失值填充:局部性与趋势性方法解析
## 1. 局部性填充
### 1.1 局部性与趋势的关系
在某种意义上,趋势和局部性是明显相关的。以时间序列为例,同一仪器在某一特定分钟的测量值与下一分钟的测量值是“局部”相关的。不过,不同领域的时间尺度差异很大,如在分子动力学领域,时间步长约为飞秒($10^{-15}$ 秒),一分钟远远超出了可模拟的范围;而在地质学或宇宙学中,在划分时代时,一分钟又微不足道。
### 1.2 局部性的概念
局部性并不局限于序列,在维度空间(无论是直接代表物理空间,还是参数或相空间)中,局部性可以简单理解为空间中的“接近度”。基于附近的值来估算缺失值,通常是填补实际缺失数据的合理方法。在某些情况下,基于局部性的填充比假设全局默认值更能反映底层数据。
### 1.3 手写数字图像示例
从UCI机器学习库获取的手写数字数据集,扫描图像包含抗锯齿处理,黑色笔画周围通常有不同灰度的像素。对部分图像随机删除一些像素,用 -1 表示缺失的灰度值,实际扫描像素值在 0(白色)到 16(黑色)之间。
```python
print("Array shape:", digits.shape)
# 输出示例
# Array shape: (50, 8, 8)
```
每个数字数组中有几个 -1 值,可通过可视化像素及其值来了解缺失数据的情况。
### 1.4 缺失像素填充方法
为了填充缺失像素,这里简单假设每个缺失像素是其相邻像素的平均值。以下是实现该功能的代码:
```python
import numpy as np
# Coded for clarity, not for best vectorized speed
# Function definition only; used in later cell
def fill_missing(digit):
digit = digit.copy()
missing = np.where(digit == -1)
for y, x in zip(*missing): # Pull off x/y position of pixel
# Do not want negative indices in slice
x_start = max(0, x-1)
y_start = max(0, y-1)
# No harm in index larger than size
x_end = x+2
y_end = y+2
# What if another -1 is in region? Remove all the -1s
region = digit[y_start:y_end, x_start:x_end].flatten()
region = region[region >=0]
total = np.sum(region)
avg = total // region.size
digit[y, x] = avg
return digit
new = np.empty_like(digits)
for n in range(new.shape[0]):
new[n] = fill_missing(digits[n])
```
通过遍历原始数据集中的样本,调用 `fill_missing` 函数,可构建一个新的数据集。
### 1.5 填充方法的思考
在实际应用中,要明确填充的目标,并考虑特定填充方法对后续建模或分析的影响。不同的填充方法可能更适合不同的模型。
## 2. 趋势填充
### 2.1 趋势填充的概念和应用场景
数据科学家最常用的趋势填充数据是时间序列数据。如果按相对规律的时间间隔进行观测,大致可以猜测缺失的观测值与附近带时间戳的观测值相似。趋势填充在金融模型中很常见,证券市场交易的事件间隔可能不规则。但这种方法也有局限性,无法处理周期短于缺失数据间隔的高频信号。
### 2.2 趋势填充的类型
| 类型 | 描述 | 实现方式 |
| --- | --- | --- |
| 前向/后向填充 | 假设缺失值与序列中前一个/后一个值相同 | Pandas Series.fillna() 方法,R tidyverse 中 tidyr 包的 fill() 函数 |
| 局部回归 | 假设相邻观测值之间存在连续函数,通常假设为线性函数,取相邻观测值的平均值填充缺失值 | |
| 时间敏感回归 | 考虑相邻值的实际时间间隔,值在较长时间段内可能变化更大 | |
| 非局部回归 | 回归可以是全局的或在比相邻元素更宽的范围内进行窗口化,线性回归较常见 | |
| 相关性填充 | 某一列(特征)中的缺失值与其他列中的数据显著相关,可基于相关性假设值 | |
### 2.3 简单时间序列示例
构建一个日期分辨率的小 Pandas Series,观测日期间隔不均匀。
```python
import pandas as pd
date_series = pd.Series({
'2001-01-01': -10.0,
'2001-01-05': 1.0,
'2001-01-10': 2.0,
'2001-02-01': np.nan,
'2001-02-05': 4.0
})
```
- **前向/后向填充**
```python
print(date_series.ffill()) # 前向填充
print(date_series.bfill()) # 后向填充
```
- **局部回归(
0
0
复制全文
相关推荐









