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

Я работаю в команде Elsa Health, где мы создаем технологии поддержки принятия решений для поставщиков медицинских услуг. Причинно-следственные связи присутствуют повсюду, и в здравоохранении крайне важно четко и честно рассказывать, как факторы / переменные связаны и связаны друг с другом очень простым и интуитивно понятным способом.

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

TL; DR;

Как мы используем предыдущие знания для построения причинно-следственных моделей:

  1. Исследуйте существующие знания, просматривая литературу, эксперименты, документацию, интервью и любые другие базы знаний, которые мы только можем придумать.
  2. Объедините все наши выводы в рисунок, который показывает, как идеи нашего исследования связаны друг с другом. Для этого мы используем DAG, а иногда можем получить несколько DAG из-за противоречивой информации.
  3. Проверяйте свою DAG с помощью экспертов в предметной области, повторяйте, проверяйте, повторяйте, проверяйте, повторяйте и т. Д.
  4. Напишите программное обеспечение, которое представляет нашу DAG и позволяет нам легко моделировать и вмешиваться.
  5. Моделируйте данные из нашей причинно-следственной модели, просматривайте результаты моделирования, повторяйте, просматривайте, итерируйте, просматривайте, повторяйте,….

Модель - это упрощение реальности.

Установка сцены

Благодаря недавней (поразительной) демократизации технологий и ресурсов машинного обучения барьер для входа ниже, чем когда-либо прежде.

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

Цикл (чрезмерно упрощенный) выглядит примерно так:

  1. Собирайте и очищайте свои данные
  2. Бросьте данные в некоторые алгоритмы или, возможно, вместо этого используйте некоторые алгоритмы
  3. Внесите некоторые изменения в свои алгоритмы, изменив параметры и гиперпараметры.
  4. Выберите модель (часто черный ящик), которая работает лучше всего, и используйте ее.

В этом нет ничего объективно неправильного, однако очень легко попасть в петлю, где это единственная стратегия, которую мы выбираем при столкновении с новой проблемой, не учитывая существующие варианты.

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

Недостаток / недостаток статистического / машинного обучения, на который часто указывают, - это его неспособность учесть причинно-следственные связи внутри и вне данных. Эти причинно-следственные связи создают данные, которые мы наблюдаем, и во МНОГИХ случаях эти отношения, которые мы используем в качестве предварительных знаний, хорошо известны, задокументированы и даже несколько раз доказаны.

Аргументы в пользу предварительного знания

TL; DR; Мы стараемся максимально использовать существующие знания для выявления причинно-следственных связей между факторами (P(Y | Q, do(X = x))), что, по нашему мнению, более полезно в наших сценариях использования, чем изучение корреляции на основе часто скудных данных (P(Y | Q, X) и P(Q, X, Y))

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

Простой сценарий: возьмем, к примеру, построение модели, чтобы определить, болен ли пациент в конкретном районе малярией. Для этого мы собираем данные о пациентах с малярией и без нее и узнаем либо вероятность малярии с учетом признаков, симптомов, демографических данных и пола, обозначенных как P(malaria | signs, symptoms, demographic, sex), либо вероятность увидеть пациента с этими признаками, симптомами, демографическими данными, полом и малярия вместе, обозначенная как P(signs, symptoms, demographic, sex, malaria), если мы собрали данные:

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

В качестве альтернативы мы могли бы сделать следующее:

  1. Потратьте несколько часов на изучение и чтение литературы вроде [1], [2], [3] и т. Д.
  2. Свяжитесь с несколькими врачами / педиатрами / исследователями и расспросите их о том, что они узнали в школе, а также о том, что они видят на местах.
  3. Постройте простую причинно-следственную модель, которая представляет переменные / факторы, которые вы обнаружили, и начните с нее. Пример простой модели можно увидеть в разделе Представление знаний в виде графиков ниже.

Некоторые из преимуществ этого второго подхода:

  1. Мы умеем быстро узнавать новое.
  2. Нам не мешает отсутствие качественных данных для обучения наших алгоритмов.
  3. Мы можем избежать предвзятости в данных, в нашем случае это были поставщики медицинских услуг, которые ставили неправильные диагнозы из-за недоступности инструментов тестирования и расследования.
  4. Модель довольно прозрачна и понятна для чтения и понимания всеми заинтересованными сторонами, будущими исследователями и регулирующими органами - это «модель белого ящика», то есть я могу видеть, как она вырабатывает свои решения / рекомендации.
  5. Вероятно, что наиболее важно, мы можем очень четко включить причинно-следственную связь и сказать, что Малярия вызывает лихорадку в 95% случаев у детей младше 5 лет.

Дело против предшествующего знания

Есть несколько потенциальных недостатков включения предшествующих знаний, которые могут быть субъективными, в вашу новую модель, которая будет взаимодействовать с миром. Два из них:

  1. Предвзятость - несмотря на то, что в данных много предвзятости, и явное построение вашей причинно-следственной модели или DAG четко выявит любые имеющиеся предубеждения, некоторые предубеждения и мнения все же могут проникнуть в окончательную модель в зависимости от создателя модели и рецензентов. имеет для моделей, которые он строит
  2. Неверные знания - многие вещи до сих пор неизвестны, а иногда даже эксперты имеют неверную информацию / знания. Хотя это становится все более и более редким, это все же происходит, и с этим следует быть осторожным.

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

Представление знаний в виде графиков

При визуализации нашей причинно-следственной модели ее легко и интуитивно легко нарисовать как направленный ациклический граф, или, для краткости, более известный как DAG.

DAG - это тип графа с узлами (называемыми вершинами) и стрелками между узлами (называемыми ребрами или дугами), которые указывают в направлении причинности / влияния. Простой пример этого показан ниже, где мы представляем граф G с двумя вершинами a и b и одним ребром из a и указываем на b, символизируя, что a оказывает влияние на b. Это можно объяснить тем, что изменение a приводит к изменению b, но изменение b не приводит к изменению a.

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

Проще говоря, модель, которая изучает корреляции, предполагает, что курение вызывает рак легких так же, как рак легких вызывает курение. Стрелка очень важна!

Ниже приведен упрощенный пример DAG, созданный на основе исследований и бесед с несколькими врачами:

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

Мотивационный пример часто приводил Джудею Перл, автора «Книги почему»:

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

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

В то время как причинные структуры позволяют нам выражать причинность, do-Calculus (также известный как исчисление Жемчужины) является средством, с помощью которого мы взаимодействуем с нашей моделью и манипулируем ею. Используя этот метод, мы можем задавать вопросы а что, если.

Из приведенного выше DAG малярии мы можем задать такие интересные вопросы, как:

  1. Как будут выглядеть показатели заболеваемости малярией, если мы обеспечим финансирование для обеспечения 80% населения данного района противомоскитными сетками - P(Malaria | do(give 80% of population mosquito nets)
  2. Какой процент больных малярией с лихорадкой страдает перемежающейся лихорадкой?

Чтобы выразить это в более абстрактных и общих терминах, на Графике G с ребрами a, b и c, таким, что a -> b -> c, мы можем «вмешаться» и задать такие вопросы, как:

  1. Что будет c, если я сделаю b правдой, обозначенную как P(c | do(b = true))
  2. Что будет b, если я сделаю c ложным, обозначенное как P(b | do(c = false)). Предупреждение о спойлере - с b ничего не случится, потому что наши причинные допущения диктуют, что направление влияния не c -> b, и это пример, когда статистические модели не работают, потому что они основаны на корреляциях.

Для лучшего объяснения причинно-следственного вывода и исчисления, с которыми я столкнулся, обязательно прочтите статью https://www.inference.vc/untitled/.

Как бы мы это реализовали

Давайте создадим простую модель на языке программирования Julia с помощью пакета Omega, который делает вероятностное программирование и причинное моделирование действительно простым и интуитивно понятным. Для получения дополнительной информации об Omega.jl настоятельно рекомендую видео:

Чтобы эта демонстрация работала, я предполагаю, что вы установили Julia на свой компьютер и добавили пакеты Omega.jl и UnicodePlots для причинного моделирования и построения графиков соответственно.

В этом примере мы просто создадим модель для Сезона, Использование москитной сетки, лихорадки, головная боль, перемежающаяся лихорадка и малярия:

Это все, что нам нужно для определения причинной модели в Джулии. Чтобы попробовать это, мы можем сделать несколько имитаций данных:

Что должно распечатать следующий вывод:

С помощью приведенного выше кода вы запускаете 10000 симуляций каждого случая, и ваш результат будет следующим:

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

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

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

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

Чтобы узнать больше о нашей работе, подпишитесь на нас в твиттере: @ 3210jr, @elsahealth!

использованная литература