Как алгоритмы на основе деревьев (Random Forest, XGBoost) справляются с данными высокой размерности?

«Как алгоритмы на основе деревьев (Random Forest, XGBoost) справляются с данными высокой размерности?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Деревья и их ансамбли имеют встроенные механизмы для работы с большим количеством признаков, но требуют настройки:

  1. Встроенный отбор признаков: При каждом разбиении узла алгоритм рассматривает только случайное подмножество признаков (max_features). Это уменьшает корреляцию между деревьями в ансамбле и борется с шумом.

    from sklearn.ensemble import RandomForestClassifier
    # Использование sqrt(n_features) признаков на разбиение — стандартная практика
    model = RandomForestClassifier(n_estimators=100, max_features='sqrt')
  2. Важность признаков (Feature Importance): После обучения можно получить feature_importances_ и отфильтровать неинформативные признаки.

    importances = model.feature_importances_
    # Выбор топ-K самых важных признаков
    important_indices = importances.argsort()[-10:]
    X_reduced = X[:, important_indices]
  3. Ограничение глубины и минимального числа образцов в листе: Предотвращает запоминание шума в высокоразмерном пространстве.

  4. Комбинация с методами снижения размерности: Для экстремально высокой размерности (например, текст, гены) эффективно предварительно применить PCA, TruncatedSVD или отбор на основе дисперсии.

    from sklearn.decomposition import PCA
    pca = PCA(n_components=0.95)  # оставить 95% дисперсии
    X_pca = pca.fit_transform(X_high_dim)
    # Обучать модель уже на X_pca