k 近邻法(kNN)插补

R 中的缺失值填补处理

Michal Oleszak

Machine Learning Engineer

k 近邻法(kNN)插补

一个包含三列 A、B、C 的表。A 列有一个缺失值。

R 中的缺失值填补处理

k 近邻法(kNN)插补

一个包含三列 A、B、C 的表。A 列有一个缺失值。三行无缺失的行被着色高亮。

对每个含缺失的观测:

  1. 找到与其最相似的 k 个观测(捐赠者、邻居)。
R 中的缺失值填补处理

k 近邻法(kNN)插补

一个包含三列 A、B、C 的表。三行无缺失的行被着色高亮。A 列原先的缺失值被替换为高亮行同列数值的平均值。

对每个含缺失的观测:

  1. 找到与其最相似的 k 个观测(捐赠者、邻居)。
  2. 用 k 个捐赠者的聚合值替换缺失值(均值、中位数、众数)。
R 中的缺失值填补处理

距离度量

两条观测 a 与 b 的距离:

数值型变量 n 个的欧氏距离:

$\sqrt{\Sigma_{i=1}^{n} (a_i - b_i)^{2}}$

因子型变量 f 个的曼哈顿距离:

$\Sigma_{i=1}^{f} |a_i - b_i|$

分类型变量 c 个的汉明距离:

$\Sigma_{i=1}^{c} I(a_i \neq b_i)$

一个坐标系,两个点以直线相连。

一个坐标系,两个点以两条互相垂直的折线路径相连,仿佛为矩形对角。

R 中的缺失值填补处理

Gower 距离

一个模拟的数据框,包含三类变量,每类用不同颜色标注:数值型、因子型和分类型。

R 中的缺失值填补处理

Gower 距离

一个模拟的数据框,包含三类变量,每类用不同颜色标注:数值型、因子型和分类型。每类变量都有一支箭头指向对应的距离度量:分别是欧氏、曼哈顿和汉明距离。三种距离共同指向一个写有 Gower 距离的椭圆,表示其为三者的组合。

R 中的缺失值填补处理

kNN 插补实操

library(VIM)
nhanes_imp <- kNN(nhanes, k = 5, variable = c("TotChol", "Pulse"))
head(nhanes_imp)
  Age Gender Weight Height Diabetes TotChol Pulse PhysActive TotChol_imp Pulse_imp
1  16   male   73.2  172.0    FALSE    3.00    76       TRUE       FALSE     FALSE
2  17   male   72.3  176.0    FALSE    2.61    74       TRUE       FALSE     FALSE
3  12   male   57.7  158.9    FALSE    4.27    80       TRUE       FALSE     FALSE
4  16   male   88.9  183.3    FALSE    3.62    58       TRUE       FALSE     FALSE
5  13 female   45.1  157.6    FALSE    2.66    92       TRUE       FALSE     FALSE
6  16 female   48.7  158.4    FALSE    4.32    58      FALSE       FALSE     FALSE
R 中的缺失值填补处理

为捐赠者加权

  • 对于某条观测选定的 k 个邻居中,有的更相似。
  • 聚合邻居取值时,可对更近的邻居赋予更高权重。
  • 用加权平均聚合邻居,权重为到各邻居距离的倒数
  • 仅适用于数值型变量的插补。
nhanes_imp <- nhanes %>% 
  kNN(variable = c("TotChol", "Pulse"),
      k = 5,
      numFun = weighted.mean,
      weightDist = TRUE)
R 中的缺失值填补处理

变量排序

  • kNN 按变量逐个循环插补。
  • 每次都会重新计算观测间距离。
  • 若首个变量缺失多,第二个变量的距离计算将大量依赖已插补值。
  • 运行 kNN 前按缺失数升序排序变量较好。
R 中的缺失值填补处理

变量排序实操

vars_by_NAs <- nhanes %>% 
  is.na() %>%
  colSums() %>%
  sort(decreasing = FALSE) %>% 
  names()
nhanes_imp <- nhanes %>% 
  select(vars_by_NAs) %>% 
  kNN(k = 5)
R 中的缺失值填补处理

让我们练习 kNN 插补!

R 中的缺失值填补处理

Preparing Video For Download...