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