KNN-импутация (KNN imputation, заполнение пропусков методом k ближайших соседей) — это способ заполнения пропущенных значений, при котором для каждого пропуска находятся наиболее похожих на него наблюдений (строк) в наборе данных, и пропуск замещается средним, медианой или взвешенным значением соответствующего признака у этих соседей.

Как это работает

  1. Выбор расстояния. Для каждой строки с пропуском вычисляется расстояние до всех остальных строк. Чаще всего используется евклидово расстояние, но с поправкой на пропуски: признаки, где у одной из строк значение отсутствует, просто исключаются из расчёта (в sklearn это nan_euclidean).
  2. Поиск соседей. Выбираются строк с наименьшим расстоянием, у которых значение нужного признака не пропущено.
  3. Заполнение. Пропуск заменяется:
    • средним арифметическим значений соседей (равные веса),
    • взвешенным средним, где вес обратно пропорционален расстоянию (ближе сосед — больше вклад),
    • медианой (устойчивее к выбросам).
  4. Повторение. Процедура выполняется для всех пропусков во всех признаках.

Важно: обычно импутация идёт по одному признаку за раз, но расстояния считаются по всем остальным признакам. Если в строке несколько пропусков, они заполняются последовательно или одновременно в зависимости от реализации.

Параметры

  • (число соседей): ключевой параметр. Маленькое даёт шумные оценки, большое — сглаживает локальную структуру. Часто берут –.
  • Метрика расстояния: евклидова, манхэттенская, косинусная и т.д. Для смешанных типов данных нужны специальные метрики (например, 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-импутация — это популярный непараметрический метод заполнения пропусков, основанный на похожести объектов, но требующий осторожности с масштабированием, выбором и размерностью данных.