Оповещение о расхождениях в распределении с использованием знаний о модели

SHAP (Shapley Additive exPlanations) – это хорошо известный подход к машинному обучению для получения интерпретируемых результатов. Несомненно, возможность добавлять объяснительную информацию к любой модели, независимо от задачи прогнозирования, является большим преимуществом, которое делает SHAP широко распространенным. Возможность сопоставления каждого значения каждой выборки с соответствующим прогностическим вкладом делает его подходящим для более сложных приложений. В этом смысле мы уже доказали способность SHAP как эффективного метода выбора функций и настройки гиперпараметров.

Теперь мы хотим проверить, насколько SHAP может помочь в обнаружении сдвигов данных? Сдвиги данных могут стать настоящим кошмаром для конвейеров машинного обучения, выпущенных в производственных средах. Они случаются, когда распределения наших прогностических функций значимым образом расходятся с теми, которые наблюдались на этапе обучения. Как легко понять, какой бы ни был наш алгоритм прогнозирования, он дает противоречивые результаты по сравнению с результатами, полученными во время проверки.

Мы мало что можем сделать против изменений данных. Они неизбежны в большинстве приложений машинного обучения, использующих непрерывные потоки данных и подверженных внешней динамике. Мы можем неоднократно проверять правильность процедур приема данных или шагов предварительной обработки, но если они верны, проблема сохраняется. Чего мы абсолютно не должны делать, так это сдаваться. Есть несколько очень умных трюков и методов, которые мы можем использовать, чтобы предупреждать о дрейфе входящих данных и принимать соответствующие корректирующие меры.

Прежде всего, мы должны следить за распространением новых поступающих данных. Сравнивая их с наблюдаемыми на тренировке, мы можем проверить, есть ли у нас значимые сдвиги. Это должно быть сделано для всех интересующих функций и постоянно проверяться. Во-вторых, когда мы замечаем дрейф данных, мы должны позволить нашей модели изучить изменения. Этого можно легко достичь в приложениях, изначально поддерживающих непрерывное обучение (также известное как онлайн-обучение) или просто путем переобучения модели с учетом новых данных.

Все ли сдвиги данных одинаковы?Разные причины могут привести к разным видам дрейфа. Чтобы сделать это проще и легче, было бы фантастически ограничить количество необходимых проверок для выполнения. Таким образом, реализация элементов управления только для значимых предикторов может иметь решающее значение.

В этом посте мы используем возможности SHAP как независимой от модели среды для объяснимости, а также для мониторинга дрейфа. Установив элементы управления распределениями значений SHAP вместо необработанных значений, мы можем определить только эффективные сдвиги.

ЭКСПЕРИМЕНТАЛЬНАЯ УСТАНОВКА

Мы работаем в контексте бинарной классификации, где, учитывая некоторые особенности, мы пытаемся предсказать принадлежность класса каждой выборки. Все имеющиеся в нашем распоряжении функции следуют гауссовому распределению, но не все они равны. Некоторые из них являются информативными, поскольку они непосредственно способствуют созданию целевого класса. Другие являются избыточными, поскольку они генерируются как случайные линейные комбинации информативныхфункций. Наконец, у нас есть функции шум, которые не приносят никакой пользы в нашей контролируемой задаче.

Учитывая эти данные, понятно построение оптимальной системы мониторинга для обнаружения дрейфа. Оптимальный означает, что мы должны предупреждать только об изменениях, происходящих с информативными функциями (или также с избыточными функциями, это нормально). SHAP идеально подходит для этой цели. Предоставляя распределения вкладов функций, мы можем реализовывать элементы управления непосредственно на них.

ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ

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

Чтобы математически доказать наличие дрейфа распределения, мы применяем состязательный подход. Он состоит из настройки классификатора, который обучен различать источник происхождения некоторых выборок данных. Если такой классификатор может достичь высокой производительности, это означает, что источники данных совершенно разные (тестовые данные отличаются от обучающих). Обратное означает, что никаких явных различий не может быть обнаружено. Состязательный подход очень полезен для обнаружения различий в многомерном контексте и очень объяснимым способом. В качестве метрики качества выбираем двухвыборочный критерий Колмогорова-Смирнова. Он подходит для сравнения распределений двух независимых выборок. В нашем случае задействованные выборки представляют собой предсказанные вероятности принадлежности к тому или иному источнику данных. Все эти рассуждения можно легко свести к следующим строкам кода:

def ks_drift_detection(X1,X2, n_splits=5, seed=33):
    
    import numpy as np
    import pandas as pd
    from scipy.stats import ks_2samp
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import StratifiedKFold
    
    assert isinstance(X1,pd.DataFrame)
    assert isinstance(X2,pd.DataFrame)
    
    CV = StratifiedKFold(n_splits, shuffle=True, random_state=seed)
    y = np.r_[np.ones((X1.shape[0],)),np.zeros((X2.shape[0],))]
    pred = np.zeros_like(y)
    X = pd.concat([X1, X2], ignore_index=True, axis=0)
    
    for i,(id_train,id_test) in enumerate(CV.split(X,y)):
        
        model = LogisticRegression(random_state=seed)
        model.fit(X.iloc[id_train], y[id_train])
        
        pred[id_test] = model.predict_proba(X.iloc[id_test])[:,1] 

    ks = ks_2samp(pred[(y == 0)], pred[(y == 1)])
    
    return round(ks.statistic, 4), round(ks.pvalue, 4)

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

Как мы можем себе представить, мы регистрируем последовательные сдвиги для всех функций. Высокое значение Колмогорова-Смирнова означает, что мы можем легко отличить новые поступающие данные от тех, которые наблюдались при обучении. Таким образом, мы можем регистрировать несоответствия дрейфа данных и действовать соответствующим образом.

Что произойдет, если мы будем делать то же самое, проверяя распределения значений SHAP вместо необработанных? Мы надеемся найти доказательства дрейфа данных (как и ожидалось), но только по соответствующим функциям.

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

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

КРАТКОЕ СОДЕРЖАНИЕ

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

ПРОВЕРЬТЕ МОЙ РЕПО GITHUB

Оставайтесь на связи: Linkedin