Ответ
Градиентный бустинг (XGBoost, LightGBM, CatBoost) обладает встроенной устойчивостью к некоторым типам ошибок в данных, но не ко всем.
1. Случайный шум в признаках:
Модели на основе деревьев, особенно бустинг, довольно робастны к умеренному случайному шуму. Поскольку каждое дерево строится на подвыборке данных и признаков (параметры subsample, colsample_bytree), влияние шума «усредняется» по ансамблю. Качество может немного снизиться, но не катастрофически.
2. Систематическое смещение или ошибка кодирования: Это критично. Например, если в признаке «возраст» все значения случайно увеличены на 10 лет, модель выучит неверные пороги разбиения. Влияние будет значительным, так как смещение искажает истинные закономерности.
3. Пропущенные значения (NaN):
- CatBoost и LightGBM умеют работать с пропусками «из коробки», рассматривая их как отдельное значение при поиске наилучшего разбиения.
- XGBoost сам не обрабатывает NaN. Если их не обработать (заполнить, например, -999), они будут попадать в то дочернее узло, которое дает наилучший прирост качества, что может быть неоптимально.
Пример, демонстрирующий устойчивость к шуму:
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# Оценка на чистых данных
gbc = GradientBoostingClassifier(n_estimators=100, random_state=42)
baseline_score = cross_val_score(gbc, X, y, cv=5).mean()
print(f"Baseline CV accuracy: {baseline_score:.4f}")
# Добавляем случайный шум ко всем признакам
noise_scale = 1.0 # Стандартное отклонение шума
X_noisy = X + np.random.normal(0, noise_scale, X.shape)
noisy_score = cross_val_score(gbc, X_noisy, y, cv=5).mean()
print(f"Noisy data CV accuracy: {noisy_score:.4f}")
print(f"Accuracy drop: {baseline_score - noisy_score:.4f}")
Вывод: Бустинг — не панацея. Обязательный этап — исследование и очистка данных (EDA). Нужно искать и исправлять именно систематические ошибки, выбросы и корректно обрабатывать пропуски перед передачей данных в модель, даже такую мощную.