KNN-импутация (KNN imputation, заполнение пропусков методом k ближайших соседей) — это способ заполнения пропущенных значений, при котором для каждого пропуска находятся наиболее похожих на него наблюдений (строк) в наборе данных, и пропуск замещается средним, медианой или взвешенным значением соответствующего признака у этих соседей.
Как это работает
- Выбор расстояния. Для каждой строки с пропуском вычисляется расстояние до всех остальных строк. Чаще всего используется евклидово расстояние, но с поправкой на пропуски: признаки, где у одной из строк значение отсутствует, просто исключаются из расчёта (в
sklearnэтоnan_euclidean). - Поиск соседей. Выбираются строк с наименьшим расстоянием, у которых значение нужного признака не пропущено.
- Заполнение. Пропуск заменяется:
- средним арифметическим значений соседей (равные веса),
- взвешенным средним, где вес обратно пропорционален расстоянию (ближе сосед — больше вклад),
- медианой (устойчивее к выбросам).
- Повторение. Процедура выполняется для всех пропусков во всех признаках.
Важно: обычно импутация идёт по одному признаку за раз, но расстояния считаются по всем остальным признакам. Если в строке несколько пропусков, они заполняются последовательно или одновременно в зависимости от реализации.
Параметры
- (число соседей): ключевой параметр. Маленькое даёт шумные оценки, большое — сглаживает локальную структуру. Часто берут –.
- Метрика расстояния: евклидова, манхэттенская, косинусная и т.д. Для смешанных типов данных нужны специальные метрики (например, Gower).
- Веса: uniform (все соседи равны) или distance (обратно пропорционально расстоянию).
- Масштабирование: обязательно, так как расстояние чувствительно к единицам измерения. Перед KNN-импутацией признаки стандартизуют или нормализуют.
Преимущества
- Прост в реализации и интуитивно понятен.
- Учитывает локальную структуру данных: похожие объекты получают похожие заполнения.
- Не требует предположений о распределении, непараметрический.
- Может улавливать нелинейные взаимосвязи (в отличие от линейной регрессии).
Недостатки
- Одиночная импутация: возвращает один заполненный набор, не даёт оценки неопределённости (в отличие от MICE).
- Вычислительная сложность: для каждого пропуска нужно искать соседей по всей выборке; на больших данных работает медленно.
- Проклятие размерности: в многомерных пространствах расстояния становятся менее информативными, качество падает.
- Чувствительность к масштабу и выбросам.
- Плохо работает с категориальными признаками без специального кодирования или метрик.
- Не гарантирует статистической состоятельности при MAR/MNAR, хотя часто используется на практике.
Пример на Python (scikit-learn)
import numpy as np
from sklearn.impute import KNNImputer
X = np.array([[1, 2, np.nan],
[3, np.nan, 5],
[7, 8, 9],
[2, 4, 6]])
imputer = KNNImputer(n_neighbors=2, weights="uniform")
X_filled = imputer.fit_transform(X)
print(X_filled)Здесь KNNImputer заполнит пропуски средним значением двух ближайших соседей, вычисленных по nan_euclidean расстоянию.
Сравнение с другими методами
- Среднее/медиана: проще, но игнорирует связи между признаками.
- IterativeImputer / MICE: строит модель для каждого признака, может давать множественную импутацию; KNN — более «геометрический» и локальный подход.
- KNN часто выбирают, когда данные имеют кластерную структуру и пропуски немногочисленны, а вычислительные ресурсы позволяют.
Таким образом, KNN-импутация — это популярный непараметрический метод заполнения пропусков, основанный на похожести объектов, но требующий осторожности с масштабированием, выбором и размерностью данных.