← Назад к вопросам

Какие знаешь способы заполнения пропусков?

2.2 Middle🔥 191 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Заполнение пропусков (импутация) — критическая часть предварительной обработки данных в ML. Это не просто замена значений, а стратегическое решение, которое влияет на качество модели.

Статистические методы

Простая подстановка средних/медиан/моды — самый базовый способ. Среднее хорошо для нормально распределённых данных, медиана робустнее к выбросам, мода для категориальных признаков.

from sklearn.impute import SimpleImputer

# Среднее значение
imputer = SimpleImputer(strategy="mean")
X_filled = imputer.fit_transform(X)

# Медиана (robust)
imputer = SimpleImputer(strategy="median")

Прямое и обратное заполнение — для временных рядов. Forward fill (ffill) использует последнее известное значение, backward fill (bfill) — следующее.

df["column"].fillna(method="ffill")  # Распространить последнее значение вперёд
df["column"].fillna(method="bfill")  # Распространить следующее назад

K-Nearest Neighbors (KNN)

Заполняет пропуск на основе k ближайших соседей по другим признакам:

from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)
X_filled = imputer.fit_transform(X)

Плюсы: учитывает сложные зависимости между признаками. Минусы: вычислительно дорого на больших данных.

Множественная импутация (MICE)

Iterative Imputer использует машинное обучение для предсказания пропусков:

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

imputer = IterativeImputer(estimator=Ridge(), max_iter=10)
X_filled = imputer.fit_transform(X)

Работает циклично: предсказывает один признак на основе других, потом второй и т.д. Сильнее KNN, но медленнее.

Deep Learning подходы

Для сложных данных можно использовать VAE или GAIN, но это над-инженеринг для большинства случаев.

Удаление пропусков

Иногда проще удалить строки/столбцы:

df.dropna()  # Удалить строки с пропусками
df.dropna(thresh=0.5)  # Оставить только столбцы с заполненностью >50%

Практические рекомендации

  1. Проанализируй паттерн: случайные пропуски (MCAR) vs зависимые (MAR/MNAR)
  2. Для MAR: используй MICE или KNN
  3. Для MCAR: простая статистика часто работает
  4. Для временных рядов: forward/backward fill
  5. Оцени влияние: сравни модели с разными стратегиями импутации

Выбор метода зависит от процента пропусков, природы данных и природы отсутствия.

Какие знаешь способы заполнения пропусков? | PrepBro