DevGang
Авторизоваться

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

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

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

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

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

Модель причинного вывода состоит из двух ключевых компонентов:

  1. «Направленный ациклический граф» (DAG), который описывает, что вызывает то, что иногда называют диаграммой причинного вывода.
  2. Набор «Таблиц условной вероятности» (CPT), которые описывают вероятности перехода от одного узла к другому.

Вот пример, который показывает, как оба компонента работают вместе в модели причинного вывода (числа в ячейках — это вероятности).

Начало работы

Начнем с выбора некоторых данных для моделирования.

Выбранные мной данные относятся к влиянию наличия диплома на заработную плату и были получены из бесплатного репозитория машинного обучения UCI (https://archive.ics.uci.edu/ml/datasets/census+income).


import pandas as pd
from IPython.display import display

df_census = pd.read_excel("data/census_income.xlsx")

display(df_census.head())
display(df_census.describe().T)

Построение причинно-следственной модели

Я решил построить причинно-следственную модель с использованием pgmpy библиотеки (https://pgmpy.org/) следующим образом


from pgmpy.models import BayesianNetwork

census_model = BayesianNetwork([('age', 'hasGraduateDegree'),
                                ('age', 'greaterThan50k'),
                                ('hasGraduateDegree', 'greaterThan50k')])

Очень полезно визуализировать причинно-следственные связи и структуру


dag_tools.display_pyvis_model(census_model, figsize=(400,400))

Последним шагом в построении модели является подгонка данных следующим образом:

census_model.fit(df_census)
census_model.check_model()

Таблицы условной вероятности

Очень легко использовать нативный функционал в pgmpy библиотеке, чтобы бегло взглянуть на КПП

for cpt in census_model.get_cpds():
    print(cpt)
+---------+--------------+ 
| возраст(17) | 0,0128214 | 
+---------+--------------+ 
| возраст(18) | 0,0179637 | 
+---------+--------------+ 
| возраст(19) | 0,0225917 | 
+---------+--------------+ 
| возраст(20) | 0,0236202 | 
+---------+--------------+ 
| возраст(21) | 0,0223174 | 
+---------+--------------+ 
| возраст(22) | 0,0234145 | 
+---------+--------------+ 
| возраст(23) | 0,0264313 | 
+---------+--------------+ 
... 
+---------+----------- --+ 
| возраст(88) | 0,000102845 | 
+---------+--------------+ 
| возраст(90) | 0,00126843 | 
+---------+--------------+ 
+---------- --+-----+----------+-------+
| возраст | ... | возраст(88) | возраст(90) | 
+--------------------------+-----+----------+------ ---------------+ 
| hasGraduateDegree(False) | ... | 1.0 | 0,8918918918918919 | 
+--------------------------+-----+----------+------ ---------------+ 
| hasGraduateDegree(True) | ... | 0,0 | 0,10810810810810811 | 
+--------------------------+-----+----------+------ ---------------+ 
+-----------------------+-----+--- ----------------------+ 
| возраст | ... | возраст(90) | 
+-----------------------+------+----- ------+ 
| имеетвысшую степень | ... | hasGraduateDegree(True) | 
+-----------------------+------+----- ------+
| больше чем 50 000 (ложь) | ... | 0,25 | 
+-----------------------+------+----- ------+ 
| больше чем 50 000 (правда) | ... | 0,75 | 
+-----------------------+------+----- ------+

Результат очень неудовлетворительный.

  1. CPT, представляющий вероятности age, распределен по вертикали (поскольку возраст имеет много стадий, по одной для каждого возраста от 17 до 90 лет).
  2. CPT для вероятностей hasGraduateDegree еще хуже. Поскольку эта таблица распределена по горизонтали pgmpy, все столбцы для возрастов от 17 до 87 лет были усечены, а на дисплее остались только возрасты 88 и 90 лет. Это могло бы соответствовать таблице в ячейке, но полученное усечение не позволяет понять, что происходит.
  3. CPT для greaterThan50k имеет те же проблемы, что и hasGraduateDegree.
  4. Последняя проблема с pgmpy выводом для CPT заключается в том, что они «перевернуты». Если вы читали Judea Pearl, опубликовавшего много основополагающих работ по причинно-следственным связям (включая «Книгу почему»), вы читали примеры, в которых Перл выражает свои CPT с помощью «Probability», выраженной в столбцах, и «Given» условий, выражено по рядам

Лучшее решение

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

Таким образом, неинтуитивный вывод pgmpy привел к разработке собственной cpt_tools библиотеки для решения всех проблем 

Давайте посмотрим на вывод, сгенерированный с помощью cpt_tools

for cpt in census_model.get_cpds():
    cpt_tools.display_cpt(cpt)

Выглядит намного лучше всего в 1 строке кода Python из cpt_tools библиотеки

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

Если вы хотите увидеть весь CPT без горизонтального усечения, просто измените display.max_rows параметр pandas, а затем используйте его cpt_tools.display_cpt следующим образом:

pd.set_option('display.max_rows', None)
cpt_tools.display_cpt(census_model.get_cpds()[2])
pd.reset_option('display.max_rows')

Исходный код

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

Вывод

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

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

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

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В подарок 100$ на счет при регистрации

Получить