Как работать с мультиколлинеарностью признаков при построении модели классификации?

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

Ответ

Мультиколлинеарность (сильная корреляция между признаками) может ухудшить интерпретируемость линейных моделей и сделать оценки коэффициентов нестабильными. Вот практические шаги по борьбе с ней.

1. Выявление коррелирующих признаков:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# Расчет матрицы корреляций
corr_matrix = df.corr()

# Визуализация тепловой карты
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Матрица корреляций признаков')
plt.show()

# Автоматический поиск сильно коррелирующих пар (порог > 0.85)
high_corr_pairs = {}
for i in range(len(corr_matrix.columns)):
    for j in range(i+1, len(corr_matrix.columns)):
        if abs(corr_matrix.iloc[i, j]) > 0.85:
            col_i = corr_matrix.columns[i]
            col_j = corr_matrix.columns[j]
            high_corr_pairs[(col_i, col_j)] = corr_matrix.iloc[i, j]
print("Сильно коррелирующие пары:", high_corr_pairs)

2. Методы устранения мультиколлинеарности:

  • Удаление одного из признаков: Самый простой способ. Удаляйте тот признак, который менее значим с предметной точки зрения или имеет более высокую корреляцию с другими признаками.
  • Метод главных компонент (PCA): Преобразует исходные коррелированные признаки в набор некоррелированных (ортогональных) компонент.

    from sklearn.decomposition import PCA
    from sklearn.preprocessing import StandardScaler
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    pca = PCA(n_components=0.95) # Оставить 95% дисперсии
    X_pca = pca.fit_transform(X_scaled)
  • Регуляризация: Добавление штрафа к коэффициентам модели (L1-лассо или L2-ридж) автоматически снижает влияние мультиколлинеарности.
    from sklearn.linear_model import LogisticRegression
    # L2-регуляризация по умолчанию помогает бороться с коллинеарностью
    model = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs')

3. Выбор модели, устойчивой к коллинеарности:

  • Деревянные модели (Random Forest, Gradient Boosting): В основе лежит рекурсивное разбиение по одному признаку, поэтому они менее чувствительны к корреляциям. Однако интерпретация важности признаков может искажаться.
  • Линейные модели с регуляризацией: Всегда предпочтительнее обычной линейной регрессии/логистической регрессии при наличии корреляций.