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

Что делать, если есть выбросы в данных?

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

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

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

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

Выбросы в данных — частая проблема при работе с реальными данными. Обработка выбросов требует тщательного анализа перед принятием решения.

Идентификация выбросов

Перед тем как избавляться от выбросов, нужно их обнаружить. Основные методы:

IQR метод (Interquartile Range) — самый простой и надёжный:

import pandas as pd
import numpy as np

Q1 = df["column"].quantile(0.25)
Q3 = df["column"].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = (df["column"] < lower_bound) | (df["column"] > upper_bound)
print(f"Найдено {outliers.sum()} выбросов")

Z-score метод для нормально распределённых данных:

from scipy import stats

z_scores = np.abs(stats.zscore(df["column"]))
outliers = z_scores > 3

LOF (Local Outlier Factor) для многомерных данных:

from sklearn.neighbors import LocalOutlierFactor

lof = LocalOutlierFactor(n_neighbors=20)
outlier_labels = lof.fit_predict(X)
outliers = outlier_labels == -1

Стратегии обработки выбросов

Удаление выбросов

Самый простой подход — просто удалить их:

df_clean = df[~outliers]

Но это опасно! Выброс может быть ошибкой в данных, реальным редким явлением или информативным сигналом для модели.

Трансформация данных

Трансформация может снизить влияние выбросов без их удаления:

df["log_column"] = np.log1p(df["column"])

from scipy.stats import boxcox
df["transformed"], lambda_param = boxcox(df["column"] + 1)

df["rank"] = df["column"].rank()

Capping/Winsorization

Ограничение выбросов до определённого процентиля:

lower_percentile = df["column"].quantile(0.05)
upper_percentile = df["column"].quantile(0.95)

df["capped"] = df["column"].clip(lower_percentile, upper_percentile)

Робастные методы

Некоторые алгоритмы менее чувствительны к выбросам:

from sklearn.linear_model import HuberRegressor
model = HuberRegressor(epsilon=1.35, max_iter=1000)

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()

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

  1. Всегда исследуй выбросы перед удалением — могут быть информативны
  2. Для tree-based моделей — выбросы часто не проблема
  3. Для линейных моделей — используй робастные методы
  4. Для временных рядов — выбросы могут быть аномалиями
  5. Документируй решение — это особенность данных
  6. Сравни результаты с выбросами и без

Выбросы не всегда враги. Иногда они содержат ценную информацию.

Что делать, если есть выбросы в данных? | PrepBro