Ответ
Обработка выбросов — критический этап предобработки. Я выбираю метод, анализируя природу выброса (ошибка измерения vs редкое, но валидное событие) и задачу.
Основные методы:
1. Удаление (Trimming/Capping) Прямое удаление записей, выходящих за заданные границы. Риск — потеря информации.
# Удаление по IQR
Q1, Q3 = df['feature'].quantile([0.25, 0.75])
IQR = Q3 - Q1
lower_bound, upper_bound = Q1 - 1.5*IQR, Q3 + 1.5*IQR
df_clean = df[(df['feature'] >= lower_bound) & (df['feature'] <= upper_bound)]
2. Винзоризация (Winsorizing) Замена выбросов на значения определенных перцентилей (например, 1-го и 99-го). Сохраняет объем данных.
lower_limit = df['feature'].quantile(0.01)
upper_limit = df['feature'].quantile(0.99)
df['feature_winsorized'] = df['feature'].clip(lower_limit, upper_limit)
3. Математические преобразования Сжатие диапазона для уменьшения влияния экстремальных значений.
- Логарифмирование:
np.log1p(x)для правосторонних выбросов. - Квадратный корень:
np.sqrt(x). - Обратное преобразование:
1/x.
4. Биннинг (Binning) Группировка значений в интервалы (бинны). Выброс попадает в крайний бинн.
df['feature_binned'] = pd.cut(df['feature'], bins=5, labels=False)
5. Импутация Замена выброса на более репрезентативное значение: медиану, среднее по кластеру или предсказанное значение модели.
6. Алгоритмическое обнаружение и обработка Использование моделей (Isolation Forest, DBSCAN) для автоматического выделения выбросов с последующей их изоляцией или маркировкой.
Важное правило: Перед обработкой всегда нужно визуализировать распределение (гистограмма, boxplot) и попытаться понять причину появления выброса. В задачах обнаружения мошенничества или неисправностей выбросы часто являются целевым объектом поиска, и удалять их нельзя.