Классический мониторинг дрейфа данных часто пропускает скрытые триггеры, когда признаки взаимодействуют комбинаторно. Представьте: каждый признак по отдельности стабилен, но их совместное распределение дрейфует — это "троянский конь" для моделей.
Почему одномерные тесты не работают
Стандартные тесты (PSI, KS, AD) проверяют одномерные распределения. Но дрейф может возникать только в определённых подпространствах признаков. Например, в модели кредитного скоринга возраст и доход по отдельности стабильны, но среди клиентов с высоким доходом и возрастом больше 50 лет резко меняется поведение. Типичная ошибка: считать, что отсутствие дрейфа на уровне отдельных признаков гарантирует стабильность модели. В production это приводит к неожиданному падению метрик без видимых причин.
Subset-анализ Фубини
Идея из интегральной геометрии: вместо проверки всего пространства признаков проецируем распределение на все возможные подмножества признаков малой размерности (например, все пары или тройки). Для каждого подмножества вычисляем метрику дрейфа (например, Wasserstein distance). Если в каком-то подпространстве метрика аномально высока — это невыявленный триггер. Для пары "возраст и доход" дрейф может проявиться только в их сумме или произведении.
Пример кода на Python:
from itertools import combinations
import numpy as np
from scipy.stats import wasserstein_distance
def fubini_drift_detection(X_ref, X_prod, subset_size=2):
triggers = []
features = X_ref.shape[1]
for subset in combinations(range(features), subset_size):
ref_sub = X_ref[:, subset]
prod_sub = X_prod[:, subset]
proj_ref = np.sum(ref_sub, axis=1)
proj_prod = np.sum(prod_sub, axis=1)
w_dist = wasserstein_distance(proj_ref, proj_prod)
if w_dist > 0.1:
triggers.append((subset, w_dist))
return triggers
Компенсация и trade-offs
После обнаружения триггера применяем два подхода. Первый — адаптивное ресемплирование: перевзвешиваем выборку пропорционально плотности в дрейфующих подпространствах. Второй — domain-specific feature engineering: добавляем комбинаторные признаки-индикаторы для триггерных подмножеств, например, произведение признаков или логический флаг.
Предупреждение о комбинаторном взрыве
Анализ всех комбинаций признаков — комбинаторный взрыв. На практике ограничиваемся размерностью 2-3, используя иерархический поиск: сначала все пары, затем тройки только значимых признаков из пар. Это даёт баланс между полнотой обнаружения и вычислительной стоимостью. Например, для 50 признаков анализ всех пар даёт 1225 комбинаций — это выполнимо за минуты.
Вывод: Subset-анализ Фубини позволяет обнаруживать дрейф в комбинаторно-зависимых признаках на недели раньше одномерных тестов, предотвращая неожиданное падение production-метрик.