Aspiring Data Science
327 subscribers
390 photos
10 videos
6 files
1.46K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#ml #explainability #shap

Что, если кэфы Шеппли вычисляются слишком долго? Давайте попробуем при их вычислении уйти от подстановки всех значений переменной в сторону полного переобучения модели БЕЗ этой переменной (Naive Shapley), подумал автор этого поста. Идея интересная, только реальным сравнением и можно выявить слабости существующих инструментов (см. пост выше про баг в матплотлибе). Но, мне кажется, картинка из бенча самого автора весьма выразительна.
#ml #shap #interpretability #robustness

Вы работаете над задачей объяснения вклада признаков в результат некоторого бизнес-процесса. Натренировали неплохую модель (видите, что на test предсказания значимо лучше случайного гадания aka DummyClassifier). Посчитали кэфы Шепли, отсортировали по модулю, и собираетесь уже презентовать в статье/руководству/заказчику. И вдруг, перезапустив обучение, видите, что с новым инстансом классификатора список фичей существенно изменил порядок: некоторые фичи в списке упали, другие взлетели.
#ml #shap #interpretabiity #mutualinformation

О, этот удивительный мир халатности и безответственности. А может, просто здорового пофигизма? Как общеизвестно, пакет SHAP раскладывает предсказание модели для каждой строки данных на линейную сумму "вкладов" каждого признака, по сути формируя матрицу NxM (строк данных на число признаков). На базе этой информации SHAP предлагает пользователю несколько основных визуализаций:

1) summary всех признаков, отсортированные по убыванию модуля средней значимости на всём рабочем датасете

идёт в 2 вкусах: плоский одноцветный bar plot, где построен только модуль среднего, и более продвинутый beeswarm plot, где напротив признака отображены значения Шэпли этого признака для все строк данных. Да ещё и раскрашены в цветовой шкале значений этой фичи. Тем самым по beeswarm можно понять, к примеру, что в среднем повышение/понижение какой-то фичи сподвигает модель прогнозировать более высокий/низкий таргет.

2) объяснение индивидуального прогноза

идёт в 3 фасонах: force plot, waterfall plot, decision plot. последний обладает широкой функциональностью: может отображать несколько примеров сразу, работает с мультиклассовой классификацией, позволяет кластеризовать "пути" в пространстве признаков, по которым модель приходит к решению;

3) объяснение вклада индивидуального признака: scatte plot, ранее dependence plot. По X значение признака, по Y значение кэфа Шэпли для этого примера. Похоже чем-то на PDP по виду (но разная суть). И вот тут автор SHAP, видимо, вдохновлённый тем, что PDP может быть не только одномерным, предлагает бесплатно из коробки киллер фичу: так как по Y на графике все равно уже есть вариабельность, SHAP вам автоматически раскрасит точки в цвета...другой наиболее влияющей фичи (на основную фичу вашего графика). Звучит шикарно, и я думал, что "наиболее влияющая" уж в пакете-то SHAP определяется хитрыми интеракциями теории игр... Полез в код, куда там... Во-первых, там просто np.corrcoeff, во-вторых, и то на максимум 10_000 точек. Так а как же квартет Энскомба? Нелинейность у нас отменили? Хочу попробовать заменить пирсоновский corrcoeff на хотя бы взаимную информацию.

UPD: на мой взгляд, MI куда чётче разделяет низкие и высокие прогнозы. Пример в аттаче. Надо бы замёрджить PR.
#ml #interpretability #shap #facet

Новая интересная идея над SHAP. Как известно, каждая фича в рамках SHAP по каждому примеру получает некоторое значение, сдвигающее прогноз от среднего. А почему бы не рассмотреть фичу как вещественный вектор этих значений по всем примерам? Тогда у нас появляется возможность делать матоперации над векторами/фичами: считать углы, к примеру, тем самым выявляя фичи синергичные, ортогональные, и избыточны. Это красиво реализовано в библе Facet (pip install gamma-facet). Мне только кажется, они упустили, что переобучение модельки даст уже другие SHAP VALUES (особенно при мультиколлинеарности), и нельзя закладываться на единственный fit.

Показан реальный пример из строительной индустрии с CV и HPT. Очень интересны и красивы их симуляционные графики.

https://www.youtube.com/watch?v=fTQhfxZxavQ&ab_channel=PyData
#shap #explainability #ml

Шок-контент, либа SHAP, оказывается, не поддерживается уже несколько лет. Может, автор умер, или просто забил, не знаю. А я-то думаю, чего она такая медленная, ужасный код, а тут ещё вчера выяснилось, что ошибки, всплывавшие ещё пару лет тому, до сих пор не исправлены, и issues висят открытые. Так что лучше полагайтесь на другие реализации, если найдёте. Вроде в Rapids/CuML что-то есть.
#shap

Что получается, если самому реализовать расчёт значений Шэпли в ML с помощью "наивного" определения (как взвешенной суммы разностей вкладов коалиций с- и без- признака). Особенно интересно сравнение с библиотекой shap по части коррелированных признаков.

https://edden-gerber.github.io/shapley-part-2/
#shap

Кстати, хорошая новость. Пару лет тому я сообщал, что библиотека shap заброшена, автор забил на неё болт. Многое изменилось! У него хватило совести поручить развитие активистам, и сейчас активно релизятся новые версии. Не обошлось и без ломающих изменений, к сожалению, но так гораздо лучше, чем никак.

Работа с багрепортами осталась дрянная.

https://shap.readthedocs.io/en/latest/release_notes.html
#featureselection #shap

Ну и теперь к практической реализации отборщика признаков на основе этой прекрасной идеи. Как это вообще сделать?

Обучать одну большую модель на всех признаках надо обязательно. Это, по счастливому совпадению, 1-й шаг всех RFE-* методов.
Далее получаем "простые" кэфы Шэпли самым быстрым (но не приближённым) методом. По желанию усредняем на CV.

И тут открывается простор для фантазии:

Полный брутфорс:

Генерим все 2^n_features сочетаний признаков, сортируем индексы признаков в сочетаниях.
суммируем шэпли-значения 1й комбинации. далее удаляем суммы убывших, прибавляем суммы прибывших в комбинацию признаков. раз в N итераций ресет суммы, чтобы сбросить накопленную ошибку суммирования.

Генетик:

Вектор 1/0 длины n_features генов - это особь популяции, её фитнесс оценивать мы умеем (суммируя его шэпли-значения и считая от них и ground truth нашу ml-метрику).
применяем направленный поиск путём скрещивания, мутаций, и прочего элитизма. Запускаем эволюцию, играем в Создателя, смеёмся страшным голосом mwa-ha-ha.

Любая другая эвристика, типа имитации отжига:

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

Градиентный поиск:

Ну да, это ж бинарный вектор, нет непрерывности, как по нему дифференцировать? Есть идея применить "признаки Шрёдингера"! ))
А именно, размазать их бинарность с помощью весового коэффициента. Они могут как бы входить, а как бы и нет в комбинацию с определённым весом. А чтобы вес в итоге ограничивался промежутком [0,1], к нему можно применить сигмоиду. Тем самым autograd-оптимизатор по идее сможет найти экстремумы ML-метрики, плавно включив/исключив признаки из комбинации.

А если итоговая ML-метрика недифференцируема (типа ROC, PR AUC)? Ну тогда ведь можно взять Brier score или какую-то подходящую прокси.
Уже есть набросок кода для pytorch, попробую затестить.

Не знаю, что сработает лучше, есть надежды на градик.

В любом случае, надо дать методу оптимизации поработать (в рамках бюджета времени), и получить от него топ-N лучших кандидатов. А их уже "честно" проверить (в оставшееся время) на insample CV и вернуть самую лучшую/устойчивую комбинацию признаков.

Надо ещё помнить, что точность метода может падать при уменьшении количества кандидатов в группе по сравнению с размерностью матрицы значений Шэпли, но это обсудим позже.