Какие знаешь методы обработки выбросов в данных?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы обработки выбросов в данных
Выбросы (outliers) — это экстремальные значения, которые существенно отличаются от основной массы данных. Их обработка критична для качества моделей машинного обучения, так как они могут исказить результаты и снизить точность предсказаний.
1. Статистические методы
Z-score метод — один из самых популярных. Выбросом считается значение, где |z| > 3:
from scipy import stats
z_scores = np.abs(stats.zscore(data))
outliers_mask = z_scores > 3
data_clean = data[~outliers_mask]
Метод межквартильного размаха (IQR) — очень надёжный и часто используется в индустрии:
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers_mask = (data < lower_bound) | (data > upper_bound)
2. Методы на основе расстояний
Isolation Forest — алгоритм, специально разработанный для обнаружения аномалий:
from sklearn.ensemble import IsolationForest
iso_forest = IsolationForest(contamination=0.05, random_state=42)
outliers = iso_forest.fit_predict(data)
data_clean = data[outliers != -1]
Local Outlier Factor (LOF) — учитывает локальную плотность точек:
from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20)
outliers = lof.fit_predict(data)
data_clean = data[outliers != -1]
3. Методы, специфичные для временных рядов
Seasonal Decomposition — разложение на тренд, сезонность и остаток. Выбросы выявляются как аномалии в остатке.
Prophet — библиотека Facebook, автоматически обнаруживает аномалии:
from prophet import Prophet
model = Prophet()
model.fit(df)
forecast = model.predict(df)
model.plot(forecast) # видны аномалии
4. Стратегии обработки
Удаление — удалить выбросы полностью. Используется, если их мало (< 5%) и они — ошибки ввода.
Замена — заменить на медиану, среднее или другой репрезентативный квантиль:
median = data.median()
data[outliers_mask] = median
Трансформация — применить логарифм, квадратный корень или Box-Cox для сжатия диапазона:
from scipy.stats import boxcox
data_transformed, lambda_param = boxcox(data + 1)
Winsorization — ограничить экстремальные значения перцентилями (например, 5-й и 95-й):
from scipy.stats import mstats
data_winsorized = mstats.winsorize(data, limits=[0.05, 0.05])
5. Контекст и домен
Выбор метода зависит от:
- Природы данных: финансовые, медицинские, IoT сенсоры требуют разных подходов
- Размера выборки: на маленьких выборках удаление опасно
- Бизнес-логики: в некоторых случаях выбросы — важные аномалии, а не ошибки
- Типа задачи: для регрессии выбросы критичнее, чем для классификации
Лучше всего использовать комбинированный подход: обнаружить выбросы несколькими методами и принять взвешенное решение вместе с экспертом домена.