10 строк кода Python для автоматизации обнаружения причин, которые вы должны увидеть

Введение

В центре внимания моего недавнего исследования был причинно-следственный вывод, обусловленный растущим количеством запросов, которые я получаю от клиентов, чтобы перейти от прогнозов машинного обучения к ответам на вопросы «что, если?» введите вопросы, чтобы стимулировать воздействие и результаты.

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

Это побудило меня прочитать «Книгу о том, почему» Джудеи Перл и Даны Маккензи (несколько раз!) один.

Данные могут выявить корреляцию, но не причинно-следственную связь, так как же можно «обнаружить» причинно-следственную связь?

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

Прежде чем мы углубимся в причинно-следственные связи, подумайте…

Присоединение к Medium по моей реферальной ссылке (я получу часть комиссии, если вы зарегистрируетесь по этой ссылке).

Подписка на бесплатную электронную почту всякий раз, когда я публикую новую историю.

Беглый взгляд на мои предыдущие статьи.

Загружаю мою бесплатную систему принятия стратегических решений на основе данных.

Посещение моего сайта по науке о данных — The Data Blog.

Можно ли установить причинно-следственную связь по данным?

Рассмотрим количество значений из следующего набора двоичных данных …

Примечание. Набор данных "Восход солнца/петушок" представляет собой синтетические данные, созданные автором. Полный источник и справочные сведения см. в разделе "Ссылки" в конце статьи.

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

Количество случаев, когда петушок кукарекает, когда солнце не встает или когда солнце встает, а петушок молчит, практически одинаково (50 000 против 47 500), поэтому причинно-следственный ответ не может быть найден путем сравнения относительных объемов данных.

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

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

Так что же могут сделать библиотеки?

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

Существует алгоритм под названием «NOTEARS», который утверждает, что способен реализовать обнаружение причин, поэтому давайте попробуем его и посмотрим, что он может сделать…

Примечание. Набор данных по оспе представляет собой синтетические данные, созданные автором. Полный источник и справочные сведения см. в разделе ссылок в конце статьи.

Этот набор данных моделирует причинно-следственные связи в прививках от оспы. Давайте запустим на нем алгоритм NOTEARS и посмотрим, что он может сделать…

[('Reaction?', 'Vaccination?'),
 ('Smallpox?', 'Reaction?'),
 ('Death?', 'Reaction?'),
 ('Death?', 'Smallpox?')]

Если бы мы визуализировали результаты, полученные NOTEARS, это выглядело бы так…

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

Используя знания экспертов в данной области, мы можем легко установить, что вакцинация оказывает причинно-следственное влияние на то, возникает ли у пациента реакция и развивается ли у него болезнь, а реакция и оспа имеют причинно-следственную связь со смертью…

Итак, мы установили, что даже в очень простой каузальной модели алгоритм каузального обнаружения NOTEARS не дает правильных результатов. Кроме того, читатель одной из моих предыдущих статей указал, что NOTEARS не работает в Python 3.9, и поскольку я собираюсь обновить его, это еще одна большая проблема.

Если вы хотите узнать больше о непригодности NOTEARS для причинно-следственной связи, вот отличная научная статья — https://arxiv.org/pdf/2104.05441.pdf (Маркус Кайзер и Максим Сипос).

Прежде чем мы откажемся от полностью автоматизированного обнаружения причин, давайте взглянем на альтернативу NOTEARS, алгоритм «Лассо».

Примечание. Набор данных о доходах переписи / доходах выпускников лицензирован для публичного использования. Полный источник и справочные сведения см. в разделе ссылок в конце статьи.

О боже, Лассо - это катастрофа! Он предсказал, что все является причиной всего остального и что узлы также являются причиной самих себя!

Мои последние попытки состояли в том, чтобы попробовать алгоритмы GES, GIES и LINGAM, но все они требуют библиотек R. Я не использую R, и даже если бы мне удалось правильно настроить конфигурацию, я бы никогда не смог создать переносимый код, который могли бы использовать другие исследователи данных.

Доступные библиотеки и алгоритмы причинного обнаружения не работают, и это подкрепляет мнение, выраженное в «Книге почему», то есть, что причинно-следственная связь не может быть реконструирована только на основе данных.

Этот вывод привел меня к разработке собственного подхода…

Карты на стол, я не написал алгоритм обнаружения причин. Скорее мой алгоритм реализует корреляционное обнаружение с изюминкой (без каламбура!).

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

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

Я развил свое мышление следующим образом: в моделях причинного обнаружения мы обычно идентифицируем «эффект», то есть интересующую нас характеристику данных (например, «цель» в прогнозах машинного обучения). В примере с оспой это «Смерть?», а в примере с доходом выпускника — «greaterthank50k».

Следовательно, если есть корреляции между каким-либо признаком и «эффектом», причинно-следственная связь должна быть направлена ​​от других признаков к эффекту, поскольку он находится на «конце линии».

Следующим моим шагом была разработка рекурсивного алгоритма, который можно визуализировать следующим образом…

Дубликаты и двунаправленные ссылки должны быть исключены принудительно. Я также хотел иметь возможность явно включать или исключать соединения (ребра) и явно исключать функции (узлы).

Это 10 строк рекурсивного кода Python, которые я придумал для реализации причинного обнаружения.

Решение в действии

Чтобы показать, как работает решение, я выбрал некоторые данные об отмене бронирования отелей.

Давайте начнем с чтения данных и изучения корреляций…

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

Первый запуск алгоритма обнаружения включает в себя удержание итераций до 1, поэтому мы просто смотрим на корреляции (которые должны быть причинно-следственными) с «эффектом», то есть отменяется ли бронирование отеля или нет…

Хорошо, это неплохое начало, давайте увеличим количество итераций/рекурсий/слоев до 3, немного подправим порог корреляции и посмотрим, что у нас получится…

Хорошо, тоже не так уж плохо, но он немного «занят», поэтому следующим шагом будет исключение некоторых узлов, которые, как мы подозреваем, могут вызывать некоторый шум (примечание: в реальном бизнес-кейсе мы будем говорить с наши эксперты в области на данном этапе).

Это начинает выглядеть лучше. Помните, что мой алгоритм уверен, что ссылки на «IsCancelled» являются причинно-следственными, потому что это «эффект», поэтому после него ничего не следует.

Однако другие слои дерева просто коррелируют друг с другом, направление стрелок было добавлено просто на основе порядка, в котором их нашел алгоритм.

Работая с экспертами в этой области (или, в данном случае, с моим собственным опытом бронирования отелей!) Я заметил следующее:

  • Ссылка от «DifferentRoomAssigned» к «LeadTime» имеет неправильное направление, потому что длительное время выполнения бронирования увеличивает вероятность того, что бронирование номеров изменится, а не наоборот.
  • Корреляция между «BookingChanges» и «DifferentRoomAssigned» ниже порогового значения, но причинно-следственная связь может быть существенной, поэтому ее необходимо включить.

Следующая попытка дает указание алгоритму внести эти исправления —

Заключительная итерация: учет «незамеченных искажающих факторов»

«Ненаблюдаемый мешающий фактор» — это фактор, который, по нашему мнению, влияет на нашу причинно-следственную модель, обеспечивая связь между некоторыми узлами, но который не измерялся и, следовательно, не был включен в диаграмму.

Мой опыт посещения отелей и мое знание набора данных об отелях заставили меня заподозрить, что на данные об отелях влияет «незамеченный фактор».

В данных два отеля — «городской» и «курортный». Это привело меня к гипотезе о том, что ненаблюдаемым мешающим фактором в этой причинно-следственной модели является «причина проживания в отеле».

Моя гипотеза состоит в том, что отдыхающие в основном останавливаются в курортном отеле, а деловые люди и туристы в основном останавливаются в городском отеле.

Более того, я выдвинул гипотезу о том, что эти две группы имеют разное поведение и что это «ненаблюдаемый мешающий фактор» (ненаблюдаемый, потому что данные не фиксируют «причину пребывания»).

NOTEARS и другие подобные алгоритмы не могут учитывать «ненаблюдаемые помехи», но разработанный мной алгоритм может учитывать их, явно включив их следующим образом…

Результатом последней итерации является правдоподобная, удобочитаемая и понятная визуализация причинно-следственной связи в данных об отеле, которую я с уверенностью могу изучить и уточнить вместе с экспертами в данной области. Это ключевые моменты…

  • Существует «незаметный мешающий фактор», который является основной причиной пребывания (отпуск или деловой/туристический отпуск).
  • «Страна» оказывает причинно-следственное влияние на ненаблюдаемого конфаундера — те, кто путешествует из некоторых стран, скорее всего, будут в отпуске.
  • То же самое относится и к «TotalGuests». Большие компании, скорее всего, будут отдыхать, одинокие - в командировках, а двойные - на городских каникулах.
  • Ненаблюдаемая «причина пребывания» оказывает причинно-следственное влияние на «LeadTime», «HotelType» и «DepositType».
  • «LeadTime», «DifferentRoomAssigned», «HotelType», «DepositType» и «Reason for Stay» (U) оказывают причинно-следственное влияние на «IsCanceled».

Заключение

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

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

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

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

Если вам понравилась эта статья, подумайте…

Присоединение к Medium по моей реферальной ссылке (я получу часть комиссии, если вы зарегистрируетесь по этой ссылке).



Подписка на бесплатную электронную почту всякий раз, когда я публикую новую историю.

Беглый взгляд на мои предыдущие статьи.

Загружаю мою бесплатную систему принятия стратегических решений на основе данных.

Посещение моего сайта по науке о данных — The Data Blog.

Рекомендации

Данные о восходе солнца / крике петушка

Данные по оспе

Доходы выпускников / данные переписи доходов

Данные о бронировании отелей