
В нашем веке центральное место в анализе и использовании данных занимает Data Science. Однако часто данное понятие сводят к одним лишь алгоритмам машинного обучения или даже искусственному интеллекту, преуменьшая другие важные аспекты этой области знаний. История формирования современной науки о данных началась со сближения двух могущественных инструментов — эконометрики и машинного обучения. В разные времена они казались двумя противоположностями в анализе данных. Машинное обучение было ориентировано на высокую точность прогнозов, порой жертвуя понятностью моделей. Эконометрика же делала акцент на интерпретируемости, понимании причинно‑следственных связей, иногда оставаясь в тени из‑за ограниченности моделей.
Однако со временем стало ясно, что для полного понимания данных необходимо научиться объединять эти два подхода. Здесь на сцену выходит причинно‑следственный вывод (Causal Inference). Эта область Data Science помогает раскрыть причины явлений, объединяя преимущества как машинного обучения, так и эконометрики.
Judea Pearl в своей статье 2021 года подчёркивает важность причинно‑следственного вывода как «ключевого элемента для достижения баланса между радикальным эмпиризмом ML и интерпретационным подходом эконометрики».
Таким образом, Causal Inference — это область статистики и научных исследований, направленная на выявление и измерение причинно‑следственных связей между переменными. Она помогает определить, какое воздействие оказывает изменение одной переменной на другую, отличая это воздействие от простых корреляций.
Возможность с помощью Causal Inference не только прогнозировать события, но и понимать их причины, делает его неотъемлемой частью современной науки о данных, значительно повышающей качество принимаемых решений и эффективность использования доступной информации.
В этом цикле статей мы рассмотрим базовые и продвинутые инструменты Causal Inference в рамках задачи выявления «причинности» и исследования «эффекта». Кратко коснёмся теоретических аспектов и научимся применять некоторые алгоритмы на практике.
Будем использовать язык программирования Python, библиотеку HypEx с реализацией алгоритмов. В качестве примеров будут использованы как синтетические, так и реальные наборы данных.
А МL-то голый!
Безусловно, ML — мощный инструмент для обработки информации. И с его помощью мы можем совершать самые разнообразные и впечатляющие вещи. Главное требование заключается в том, чтобы сформулировать наши задачи как задачи прогнозирования.
Хотите перевести текст с английского на португальский? Тогда создайте модель машинного обучения, которая предсказывает португальские предложения по английским. Хотите распознавать лица? Тогда разработайте модель машинного обучения, которая предскажет наличие лица в определённой области изображения. Хотите создать автомобиль с автоматическим управлением? Тогда создайте модель машинного обучения, которая предсказывает направление поворота руля, а также давление на тормоза и акселератор при предоставлении изображений и сенсорных данных, полученных из окружающей среды автомобиля.
Как подчёркивают Ajay Agrawal, Joshua Gans и Avi Goldfarb в книге «Prediction Machines»:
Новая волна искусственного интеллекта на самом деле приносит нам не интеллект, а важный компонент интеллекта — прогнозирование.
Однако ML — не панацея. Он может производить чудеса в рамках строгих условий, но при этом может потерпеть крах, если данные отличаются от того, что модель «привыкла видеть». Машинное обучение известно своей недостаточной способностью решать проблемы обратной причинности. Решение таких проблем требует ответа на вопросы типа «а что, если», которые экономисты называют контрфактическими. Что произойдёт, если я использую другую цену вместо той, которую я запрашиваю за свой товар в настоящее время? Что поменяется, если я буду придерживаться диеты с низким содержанием сахара вместо диеты с низким содержанием жиров, на которой я нахожусь? Что случилось бы с экономическим прогрессом Европы, если бы Колумб не открыл Америку? Если вы работаете в банке, выдаёте кредиты, вам придётся разобраться, как смена клиентской линии влияет на вашу выручку. Или, если вы работаете в органах местного самоуправления, вас могут попросить придумать, как улучшить систему школьного образования. Стоит ли выдать планшет каждому ребенку, потому что эпоха цифровых знаний велит вам это сделать? Или же лучше построить большую старомодную библиотеку?
Как отмечается в книге Matheus Facure Alves «Causal Inference for The Brave and True»:
в основе этих вопросов лежит причинно-следственная связь ... и, к сожалению для машинного обучения, мы не можем полагаться на прогнозы корреляционного типа, чтобы на них ответить
Вкачестве наглядной иллюстрации такой истории из Ajay Agrawal, Joshua Gans, Avi Goldfarb «Prediction Machines»:
Во многих отраслях низкая цена ассоциируется с низкими продажами. Например, в гостиничной индустрии цены низки вне туристического сезона, а в период пикового спроса цены высоки и гостиницы полностью заполнены. Исходя из этих данных, наивное предположение может подсказать, что повышение цены приведет к увеличению числа проданных номеров.
По сути, ответ на вопросы о причинности является более сложной задачей, чем многие могут подумать. Это то, чему посвящён курс «\coursename». В нём мы исследуем, как использовать данные для изучения причинно‑следственных связей и оценки воздействия вмешательств на результаты.
Если мы владеем интернет‑магазином и хотим понять, какие элементы дизайна сайта и маркетинговые кампании влияют на продажи, то с помощью методов причинно‑следственной связи мы сможем определить, какие из них действительно приносят наибольший доход, и направить ресурсы в нужное русло.
Порой наши методы просты, и в ходе одного лишь изучения данных случается выявить совершенно неожиданные причинно‑следственные связи. Как, например, исследование статистики заболевания оспой среди деревенских жителей, фермеров и доярок привело к изобретению первой в мире вакцины от оспы.
Иногда эксперимент непрост и проходит с допущением ошибок. Тогда могут возникать заблуждения и неясные выводы. Например, знаменитый «зефирный эксперимент Уолтера Мишеля», его опровержение и опровержение этого опровержения.
Сперва определимся с тем, что конкретно мы хотим научиться делать.
Постановка задачи и обозначения
Формализуем задачу следующим образом.
Пусть имеется множество объектов, которые представляют интерес в рамках исследования (назовём его , от английского слова «universe»). Этими объектами могут быть пациенты, потенциальные клиенты коммерческой компании, города в Европе — что угодно. Значение произвольного параметра
у объекта
будем обозначать с добавлением верхнего индекса, а вектор значений этого параметра — без индекса:
,
.
Рассмотрим возможность воздействия на объект. Оно может принимать различные формы, включая лечение пациента, проведение рекламной кампании по привлечению клиентов или введение административных ограничений в определенных городах. Это лишь некоторые из бесчисленных вариантов воздействия, которые могут быть применены.
Формально, в контексте причинно‑следственного вывода, воздействие представляет собой разделение множества объектов на две части на основе бинарного признака. Часто воздействие может быть совершенно несущественным или вовсе отсутствовать, и в таком случае мы имеем дело с фиктивным воздействием, что также является распространенным явлением. В терминологии причинно‑следственного вывода, воздействие, которое исследуется, называется «treatment» (лечение). Этот термин произошел из области медицинских испытаний, где он используется для обозначения лечебного метода или медикамента, применяемого к пациентам. Однако в контексте причинно‑следственного вывода «treatment» может обозначать любое воздействие на часть исследуемой системы. Это может быть рекламная кампания, изменение политики или любое другое вмешательство.
Мы будем представлять влияние в виде двоичного признака , который может принимать значения 0 или 1, без учета промежуточной интенсивности. Обозначим сравниваемые множества объектов, разделенных по значению
, как
и
соответственно. Целевую переменную изучаемого объекта обозначим как «target» или
. Это обычно вещественная величина, измеряемая в определенный момент времени, часто в будущем относительно момента формирования групп
и
.
Важно отметить, что этот самый «момент измерения», также как и способ его совершить, четко фиксируются и являются уникальными для конкретного . Например, при исследовании влияния мартовских SMS‑оповещений на клиентов нас может интересовать, как это отразится на количестве их покупок в июне. В этом случае именно количество покупок в июне будет нашей целевой переменной
. В то же время количество покупок, скажем, в мае — это будет уже совершенно другая величина, называемая лаговым значением целевой переменной. Для определенности будем обозначать такие лаговые значения отдельным символом, например
.
Представим, что для каждого изучаемого объекта существуют две параллельные вселенные, различающиеся только наличием воздействия на этот объект. Пусть мы каким‑то непостижимым способом можем узнать значения целевой переменной как при , так и при
. Обозначим эти величины как
и
. Их разность называется «treatment effect» (
) и представляет собой реальное отражение эффекта воздействия на объект
.
Кроме того, ровно одна из этих вымышленных вселенных совпадает с реальной. Реальные значения называются factual, а параллельные им — counterfactual. Например, если на объект в реальности воздействовали и он принадлежит множеству
, то его значения
и
будут являться
и
соответственно.
Для каждого отдельного объекта существует свой . В рамках решаемой задачи наш истинный интерес заключается в том, чтобы оценить так называемую величину среднего эффекта от воздействия на множество
, или average treatment effect (
).
Поскольку множество (matter objects), по которому мы усредняем, не всегда совпадает с множеством
всех изучаемых объектов, будем уточнять множество усреднения с помощью нижнего индекса, когда это необходимо. Кроме того, существуют некоторые прижившиеся понятия и обозначения. Для удобства приведем список обозначений:
— множество всех объектов исследования.
— бинарная переменная, индикатор принадлежности объекта к целевой группе (
) или контрольной группе (
).
— целевая метрика (исход).
— фактическое, наблюдаемое значение исхода
для объекта
.
— контрфактическое значение исхода
для объекта
.
— контрольная группа, для которой
.
— целевая группа, для которой
.
— потенциальный исход объекта
в случае не подвергания воздействию.
— потенциальный исход объекта
в случае подвергания воздействию.
— средний причинный эффект (Average Treatment Effect) для всего множества объектов.
— средний причинный эффект на контрольную группу.
— средний причинный эффект на целевую группу.
Если мы знаем counterfactual
Рассмотрим синтетический пример:
import pandas as pd
import hypex
from hypex.utils import gen_oracle_df
df = gen_oracle_df(
factual_only=False,
random_state=145
).loc[:, ['Treatment', 'Target_untreated', 'Target_treated']]
df
df | Treatment | Target_untreated | Target_treated | |
0 | 0 | 600 | 650 | |
1 | 0 | 500 | 550 | |
2 | 1 | 500 | 550 | |
3 | 0 | 600 | 650 | |
4 | 1 | 500 | 650 | |
5 | 1 | 700 | 850 | |
6 | 1 | 300 | 450 | |
7 | 0 | 600 | 750 |
Y_0 = df['Target_untreated']
Y_1 = df['Target_treated']
Y_factual = Y_0 * (1 - df['Treatment']) + Y_1 * df['Treatment']
Y_counterfactual = Y_0 * df['Treatment'] + Y_1 * (1 - df['Treatment'])
TE = Y_1 - Y_0
TE[df['Treatment'] == 0].mean(), TE[df['Treatment'] == 1].mean(), TE.mean()
Как мы можем здесь увидеть,
Нам повезло: имея доступ к counterfactual-значениям, мы легко и точно определили . Однако в реальности мы не можем измерить величины из параллельных вселенных. Поэтому были разработаны методы аппроксимации
на основе доступных данных. Рассмотрим самый наивный из этих методов.
Simple mean difference
Рассмотрим классический пример, иллюстрирующий, что иногда очевидные выводы оказываются ошибочными. Возьмём два госпиталя: один действовал уже много лет, когда был построен второй. Новый госпиталь был оснащён передовыми технологиями и привлёк лучших специалистов. Однако в процессе времени выяснилось, что средний уровень смертности во втором госпитале значительно превысил показатели первого.
from hypex.utils import gen_special_medicine_df
df = gen_special_medicine_df(
data_size=1000,
dependent_division=True,
random_state=None,
)
df.head(8)
age | disease_degree | experimental_treatment | residual_lifetime |
41 | 1 | 0 | 11.78 |
40 | 1 | 0 | 24.07 |
35 | 2 | 1 | 13.38 |
38 | 1 | 0 | 13.26 |
44 | 3 | 0 | 0.22 |
42 | 3 | 1 | 3.88 |
37 | 2 | 0 | 2.45 |
47 | 2 | 0 | 1.73 |
Output: -0,73
Мы получили совершенно контринтуитивный результат, даже по знаку противоположный естественным ожиданиям. Причиной этого стало то, что новый медицинский центр привлекал преимущественно пациентов с более тяжёлыми формами заболевания. Это статистическое смещение (bias) в распределении пациентов искажало общую картину. Из‑за чего нельзя было делать выводы на основании прямого сравнения смертностей в медицинских центрах. Давайте попробуем устранить эти различия в распределениях, сделав данные однородными по тяжести заболеваний, и повторим наш эксперимент.
df = gen_special_medicine_df(
data_size=1000,
dependent_division=False,
random_state=None,
)
df.head(8)
disease_degree | experimental_treatment | residual_lifetime |
3 | 1 | 10.25 |
1 | 1 | 0.80 |
2 | 1 | 20.32 |
3 | 0 | 4.14 |
1 | 1 | 5.92 |
1 | 0 | 4.78 |
1 | 0 | 11.42 |
2 | 1 | 2.06 |
(
df.loc[df['experimental_treatment']==1, 'residual_lifetime'].mean() -
df.loc[df['experimental_treatment']==0, 'residual_lifetime'].mean()
)
Output: 2.27
Видим, что значение стало более правдоподобным. Попробуем разобраться.
Распишем для произвольного множества значение, полученное при помощи simple difference method (
). Для краткости обозначим за
и
подмножества множества
, обусловленные значениями
.
где:
— смещение по исходу .
Следовательно,
где выражение, обозначенное как можно интуитивно интерпретировать следующим способом. Если бы все изучаемые объекты находились во вселенной без воздействия на них, то эта величина описывала бы среднюю разницу
. Иными словами, это показатель различия групп
и
, которая не зависит от treatment.
Аналогично определяется
и показывается
Кроме того, из определения и, вообще говоря, для любой пары непересекающихся множеств (
) нетрудно заметить, что выполняется тождество
Совмещая это и предыдущее выражение, получаем
Скажем простыми словами. — наш главный недруг. На этой теории построена большая часть методов, которые будут описаны в нашем курсе. Когда разделенные группы между собой достаточно похожи, то
близок к нулю. В таком случае метод
вернёт результат, довольно хорошо приближающий
.
В следующей статье мы более детально рассмотрим класс методов, в которых используется этот подход.
Эпилог
Меня зовут Иван Юрашку. На момент написания статьи я работаю Data Scientist в Сбере. У нас небольшая команда, занимающаяся тестированием гипотез и проведением пилотов, коих многое много. Для универсализации, удобства, масштабирования и ускорения этих процессов был создан HypEx — Python-библиотека, содержащая набор CI-алгоритмов. Со временем это выросло в полноценный опенсорсный проект, став важным инструментом для оптимизации рабочих процессов. Изначально библиотека использовалась преимущественно для A/B‑тестирования, но со временем её возможности значительно расширились.
Данный цикл статей я вижу, как погружение на уровень осознанного восприятия не только содержащихся в ней методов, но и в целом картины мира проведения экспериментов с данными.
Каждый из команды воодушевлён идеей и с легкостью проконсультирует по вопросам CI, который сейчас набирает все большую популярность.
Что же, встречай нас, слава!