KNN缺失值填充-基于KNNImputer插补方法原理示例

填充示例

import numpy as np
import pandas as pd
from sklearn.impute import KNNImputer
# 假设我们有以下包含缺失值的Pandas DataFrame
data = {
    'A': [80, 90, np.nan, 95],
    'B': [60, 65, 56,np.nan],
    'C': [np.nan,57,80,78],
    'D': [78,83,67,np.nan]
}

df = pd.DataFrame(data)

# 使用 KNNImputer 来填充缺失值
# n_neighbors 是邻居的数量,即用于填充的k个最近邻居
# weights 定义了是否考虑邻居的距离('uniform'或根据距离加权'distance')
knn_imputer = KNNImputer(n_neighbors=2, weights='uniform')

# 将DataFrame的非数值列转换为数值列,以便KNNImputer可以处理
# 这里我们只处理数值列,因此选择df.select_dtypes(include=[np.number])
# 如果数据集中包含非数值列,可以使用适当的编码方法转换它们
numeric_df = df.select_dtypes(include=[np.number])

# 拟合并转换数据
imputed_data = knn_imputer.fit_transform(numeric_df)

# 将填充后的数据转换回DataFrame
imputed_df = pd.DataFrame(imputed_data, columns=numeric_df.columns)

# 打印结果
print(df)
print(imputed_df)
'''
   A     B     C     D
0  80.0  60.0   NaN  78.0
1  90.0  65.0  57.0  83.0
2   NaN  56.0  80.0  67.0
3  95.0   NaN  78.0   NaN
      A     B     C     D
0  80.0  60.0  68.5  78.0
1  90.0  65.0  57.0  83.0
2  87.5  56.0  80.0  67.0
3  95.0  58.0  78.0  72.5
'''
from sklearn.metrics.pairwise import nan_euclidean_distances
nan_euclidean_distances(df)

'''输出
array([[ 0.        , 14.14213562, 16.55294536, 30.        ],
       [14.14213562,  0.        , 33.9803865 , 30.52867504],
       [16.55294536, 33.9803865 ,  0.        ,  4.        ],
       [30.        , 30.52867504,  4.        ,  0.        ]])
'''

举例解析

X=df.values
X,nan_euclidean_distances(X)

'''输出
(array([[80., 60., nan, 78.],
        [90., 65., 57., 83.],
        [nan, 56., 80., 67.],
        [95., nan, 78., nan]]),
 array([[ 0.        , 14.14213562, 16.55294536, 30.        ],
        [14.14213562,  0.        , 33.9803865 , 30.52867504],
        [16.55294536, 33.9803865 ,  0.        ,  4.        ],
        [30.        , 30.52867504,  4.        ,  0.        ]]))
'''
  • nan_euclidean_distances(X) 会返回一个距离矩阵,其中的每个元素 [i, j] 表示样本 X[i] 和样本 X[j] 之间的距离。
    由于我们使用的是同一个数组 X 作为输入,所以距离矩阵将是方阵,并且对角线上的元素表示每个样本与自身的距离(由于忽略了 NaN 值,这些值可能不为0)。
  • 举例解释:
    先将df转成数组X来看,总共有四行,如X[0]为[80., 60., nan, 78.],X[0]与各行(共4行)距离为[ 0. , 14.14213562, 16.55294536, 30. ],
    X[0]和X[1]距离计算: 4 3 ( ( 80 − 90 ) 2 + ( 60 − 65 ) 2 + ( 78 − 83 ) 2 ) = 10 2 \sqrt{\frac{4}{3}((80-90)^2 + (60-65)^2+ (78-83)^2)}=10\sqrt2 34((8090)2+(6065)2+(7883)2) =102
    其中4是元素总数,3是除去缺失值的元素数。
    n_neighbors=2时,X[0]除去本身距离0,与X[1]和X[2]最近。则将其中两行与X[0]缺失值同列的元素取均值:(X[1,2]+X[2,2])/2=68.5,则X[0,2]填充为68.5。
    在这里插入图片描述

参考链接

KNN缺失值的插补原理

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值