我在缺少值的数据集上使用 sklearn.impute.KNNImputer。我想尝试几个邻居。
要实例化 KNNImputer,应指定邻居的数量。然后使用
.fit()
方法计算距离矩阵。我可以通过对多个邻居进行插补来节省计算时间在我计算了距离矩阵之后。
如何使用 sklearn 计算不拟合的距离矩阵?
下面是玩具示例。运行大约需要 2 分钟,但每次插补需要大约 120 毫秒。如果我有距离矩阵,我可以更快地执行各种插补。
import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn.impute import KNNImputer
np.random.seed(666)
nb_lines = 2000
nb_columns = 8
miss_rate = 0.1
data = np.random.normal(size=(nb_lines, nb_columns))
miss_mask_temp = np.random.uniform(size=(nb_lines, nb_columns))
miss_mask = (miss_mask_temp < miss_rate)
nb_missing = np.sum(miss_mask)
data2 = np.copy(data)
data2[miss_mask] = np.nan
nb_neighbours = np.arange(1, 1001)
store_rmse = np.zeros(shape=nb_neighbours.shape)
store_time = np.zeros(shape=nb_neighbours.shape)
for n in range(nb_neighbours.shape[0]):
if (n+1)%50==0:
print(n+1, end=" ", flush=True)
if (n+1)%500==0:
print()
t1 = time.time()
nb_n = nb_neighbours[n]
myKNN = KNNImputer(n_neighbors=nb_n, weights="uniform", metric="nan_euclidean")
myKNN.fit(data2)
impute_knn = myKNN.transform(data2)
rmse = np.sqrt(np.sum(((data - impute_knn) ** 2) * miss_mask) / nb_missing)
store_rmse[n] = rmse
t2 = time.time()
store_time[n] = t2 - t1