You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用自定义权重实现KNN插补的方法咨询

自定义权重实现KNN插补(处理Loan列NaN值)

核心逻辑

scikit-learn的KNNImputer支持通过可调用函数自定义权重规则,你只需要写一个符合要求的权重函数,传给weights参数即可。这个函数必须接收两个参数:

  • distances:当前待插补样本到每个近邻的距离数组
  • indices:近邻样本在原数据集中的索引数组
    最终返回和距离数组长度一致的权重数组(建议归一化,让权重总和为1,保证插补值是合理的加权平均)

分步实现示例

1. 导入依赖库

import pandas as pd
from sklearn.impute import KNNImputer

2. 准备数据集(匹配你的随机数据结构)

假设你的数据都是数值型(KNN需要计算距离,若有类别特征需先编码,比如用LabelEncoder或OneHotEncoder),模拟示例如下:

# 模拟和你数据集结构类似的样本数据
data = {
    'Age': [28, 32, 40, None, 35],
    'Income': [65000, 72000, None, 88000, 78000],
    'Loan': [12000, None, 16000, 20000, None]
}
df = pd.DataFrame(data)

3. 定义自定义权重函数

这里实现距离反比权重——距离越近的样本,对插补值的影响越大:

def custom_weights(distances, indices):
    # 加极小值避免除以0的报错
    weights = 1 / (distances + 1e-8)
    # 归一化处理,确保权重总和为1
    weights = weights / weights.sum()
    return weights

你也可以根据需求修改逻辑,比如给特定距离范围的样本设置固定权重,或者结合其他特征动态调整权重占比。

4. 执行KNN插补

# 初始化插补器,指定邻居数和自定义权重
imputer = KNNImputer(n_neighbors=3, weights=custom_weights)

# 拟合并转换数据(KNNImputer要求输入为二维数组)
imputed_data = imputer.fit_transform(df)

# 将转换后的数据转回DataFrame格式
df_imputed = pd.DataFrame(imputed_data, columns=df.columns)

# 查看插补后的结果
print(df_imputed)

关键注意事项

  • 确保所有输入特征为数值型:如果存在类别特征,必须先做编码处理(有序类别用LabelEncoder,无序多分类用OneHotEncoder)
  • 邻居数n_neighbors需根据数据集规模调整,一般从3、5这类小数值开始尝试
  • 自定义权重函数必须处理距离为0的情况(加极小值),避免触发除以0的错误

内容的提问来源于stack exchange,提问作者mlm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:08:18