在 knn 插补方法中计算 "distance average" 以替换特定列中的 NaN 值

During calculation of "distance average" in knn imputation method for replacing NaN value in particular column

我在从头实现Knn插补法处理缺失数据时遇到了这个问题。我创建了一个虚拟数据集并为包含缺失值的行找到最近的邻居这是我的数据集

    A    B    C       D       E
0   NaN  2.0   4.0    10.0    100.0
1   NaN  3.0   9.0    12.0     NaN
2   5.0  2.0   20.0   50.0    75.0
3   3.0  5.0   7.0     NaN    150.0
4   2.0  9.0   7.0    30.0    90.0

对于 行 0 最近的邻居是 1 和 2 并替换 NaN (0, A) 处的值我们计算同一列中最近邻值之间的距离平均值,但是如果最近邻值之一也是 NaN?

怎么办?

示例

假设第 3 行 的最近邻居是 2 和 4,因此第 3 行中的缺失值列 D 为了替换这个缺失值,我们计算 D 列中最近邻值之间的平均距离,就像这样

distance average = [(1/D1) * 50.0 + (1/D2) * 30.0]/2

并将 (3, D) 处的 nan 值替换为该平均值(其中 D1 和 D2 对应 南欧距离 )。但是在 行 0 的情况下,最近的邻居是 1 和 2 并且要替换 (0, A ) 处的 nan 值,我们需要计算A 列中第 1 行和第 2 行值之间的距离平均值 (2, A) 处的值是 5.0 很好,但在 (1, A) 处是 NaN 所以我们不能那样计算

distance average = [(1/D3) * NaN + (1/D4) * 5.0]/2

那么我们如何替换 (0, A) 处的 NaN 值呢? sklearn KNNImputer 如何处理这种情况?

sklearn KNNImputer uses the nan_euclidean_distances metric as a default. According to its user guide

If a sample has more than one feature missing, then the neighbors for that sample can be different depending on the particular feature being imputed.

该算法可能会使用不同的邻域集来估算 D 列中的单个缺失值和 A 列中的两个缺失值。

这是 KNNImputer 的简单实现:

import numpy as np
import pandas as pd
from sklearn.impute import KNNImputer


A = [np.nan, np.nan, 5, 3, 2]
B = [2, 3, 2, 5, 9]
C = [4, 9, 20, 7, 7]
D = [10, 12, 50, np.nan, 30]
E = [100, np.nan, 75, 150, 90]

columns=['A', 'B', 'C', 'D', 'E']

data = pd.DataFrame(list(zip(A, B, C, D, E)),
                    columns=columns)

imputer = KNNImputer(n_neighbors=2)

imputed_data = pd.DataFrame(imputer.fit_transform(data), columns=columns)

这是输出:

     A    B     C     D      E
0  3.5  2.0   4.0  10.0  100.0
1  2.5  3.0   9.0  12.0  125.0
2  5.0  2.0  20.0  50.0   75.0
3  3.0  5.0   7.0  11.0  150.0
4  2.0  9.0   7.0  30.0   90.0