1 方法介绍

class sklearn.impute.KNNImputer(*, missing_values=nan, n_neighbors=5, weights='uniform', metric='nan_euclidean', copy=True, add_indicator=False)

使用k近邻来完成缺失值的估算,用于对缺失值如None的填补。

每个样本的缺失值都是使用训练集中找到的n_neighbors最近邻的平均值估算的 。如果两个样本都没有丢失的特征很接近,那么这两个样本就是相近的。
该方法为scikit-learn 0.22版中的新功能。

2 常用参数

  • missing_values:number, string, np.nan or None, default=np.nan,缺失值的占位符。所有出现missing_values的情况都将被估算。对于具有缺失值的可空整数类型的pandas数据框,missing_values 应将其设置为np.nan,因为pd.NA将转换为np.nan。
  • n_neighbors:int, default=5,用于插补的相邻样本数。
  • weights:{‘uniform’, ‘distance’} or callable, default=’uniform’,预测中使用的权重函数。可能的值:‘uniform’:统一的权重。每个邻域内的所有点的权重是相等的;‘distance’:权重按点的距离的倒数表示。在这种情况下,查询点较近的邻居将比较远的邻居具有更大的影响; callable:用户定义的函数,该函数接受距离数组,并返回包含权重的相同形状的数组。

3 示例

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

示例1:处理np.nan

X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2)
X = imputer.fit_transform(X)
print(X)
[[1.  2.  4. ]
 [3.  4.  3. ]
 [5.5 6.  5. ]
 [8.  8.  7. ]]

示例2:处理None值

X = [[1, 2, None], [3, 4, 3], [None, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2)
print(imputer.fit_transform(X))
print(type(imputer.fit_transform(X))) # 返回
[[1.  2.  4. ]
 [3.  4.  3. ]
 [5.5 6.  5. ]
 [8.  8.  7. ]]
<class 'numpy.ndarray'>

示例3:处理numpy中的0数据

X = np.array([[1, 2, 0], [3, 4, 3], [0, 6, 5], [8, 8, 7]])
imputer = KNNImputer(n_neighbors=2,missing_values=0)
print(imputer.fit_transform(X))
[[1.  2.  4. ]
 [3.  4.  3. ]
 [5.5 6.  5. ]
 [8.  8.  7. ]]

示例4:添加权重

weights='distance':权重按点的距离的倒数表示。在这种情况下,查询点较近的邻居将比较远的邻居具有更大的影响。

X = np.array([[1, 2, 0], [3, 4, 3], [0, 6, 5], [8, 8, 7]])
imputer = KNNImputer(n_neighbors=2,missing_values=0,weights='distance')
print(imputer.fit_transform(X))
[[1.         2.         3.66666667]
 [3.         4.         3.        ]
 [5.5        6.         5.        ]
 [8.         8.         7.        ]]

参考文献:scikit-learn中文社区

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐