什么是KNN填充
当数据集缺失数据时候,基于K临近算法进行数据补充的一种方法。
使用数据集中与确实样本最相似的K个样本的值进行填充
工作原理
对于一个有缺失值的样本,算法找到与其最相似的K个样本(也就是K个最邻近的点),来估算当前的缺失值
主要步骤
- 选择K值:决定利用几个临近点来估算。K的取值可以依赖交叉验证或经验所得。
- 计算距离:计算缺失样本与其他样本的距离,通常是欧氏距离。将不包含缺失这一列的其他列的所有值与另一个点做计算。
- 选择最邻近的点:选择最邻近的K个点。
- 填充缺失值:根据这K个点来估算缺失值。例如众数,中位数,平均数等。
具体实现
在scikit-learn中,可以直接使用KNNImputer
函数
# 创建 KNNImputer 对象并指定最近邻数
imputer = KNNImputer(n_neighbors=2)
自己来写过程:
当只选择一个点的时候
def KNNImputers(df, k):
'''
:param df: 缺失的df
:param k: 几个临近点
:return: 补充后的
'''
result=copy.deepcopy(df)
base=copy.deepcopy(df.iloc[:,:-1])#选择除去目标列的所有
#计算每一个数据中与缺失数据组的欧氏距离
for row in df.index:
k=1
if pd.isnull(result.iloc[row,-1]):#若目标缺失部分为空
dis=np.linalg.norm((base-base.iloc[row,:]),axis=1)#计算欧氏距离
#将每一个feature的距离arg,然后排序,找到最小的那个的索引
index=dis.argsort()[k]
#看选中的这一个目标参数是否是空的,直到不空为止
while pd.isnull(df.iloc[index,-1]) and k<dis.shape[0]:
k+=1
index=dis.argsort()[k]
if k<dis.shape[0]:
val=df.iloc[index,-1]
result.iloc[row,-1]=val
return result
使用场景
适用于缺少值比较少且数据集不太大的情况。因为大型数据集寻找临近值的过程会很耗时。