Course
Бывали ли у вас ситуации, когда модель машинного обучения умеет предсказывать, кто купит, но не может объяснить, почему они купили?
Традиционное машинное обучение находит закономерности и предсказывает результаты. Оно подскажет, что клиент с высокой вероятностью уйдёт или что продажи снизятся в следующем квартале. Но если спросить, вызвала ли ваша последняя маркетинговая кампания реальный рост продаж или действительно ли лечение улучшило исходы пациентов, оно не знает, что делать. Предсказание и причинность — это разные вещи.
Причинно-следственное машинное обучение сочетает ML с методами причинно-следственного вывода. Вместо вопроса «что произойдёт?» оно задаёт вопрос «что произойдёт, если мы вмешаемся?» — а именно этот вопрос стоит за каждым бизнес-решением или медицинским лечением.
В этой статье мы разберём ключевые концепции причинного ML, методы оценки причинно-следственных связей и то, как применять их на Python.
Если вы новичок в машинном обучении, запишитесь на наш курс Основы машинного обучения на Python.
Что такое причинно-следственное машинное обучение?
Стандартные ML-модели учатся на данных и используют закономерности для предсказаний. Они хорошо отвечают на вопрос «что произойдёт?», но не говорят, что стало причиной этого.
Причинно-следственное ML задаёт иной вопрос. Оно комбинирует ML с техниками причинно-следственного вывода, чтобы оценивать причинно-следственные связи по данным. Вместо предсказания исхода оно оценивает, что изменится, если вы предпримете конкретное действие.
Это действие называется вмешательством и представляет собой преднамеренное изменение для оценки его эффекта. Привела ли скидка к реальному росту покупок или эти клиенты всё равно бы купили? Улучшило ли новое лекарство выздоровление или пациенты поправились бы сами?
На эти вопросы предсказания ответить не могут, а причинное ML — может.
Причинно-следственное ML vs традиционное ML
Традиционное ML изучает корреляции. Оно находит, что клиенты, получающие письма со скидками, чаще покупают, и использует этот паттерн для предсказания будущих покупок. Но корреляция не говорит, вызвало ли письмо покупку. Возможно, клиенты и так собирались купить.
Причинное ML оценивает причинный эффект письма на покупки. Оно спрашивает, что было бы, если бы вы его не отправили. Разница между «эти вещи часто встречаются вместе» и «эта вещь вызвала ту вещь» — вот что отличает традиционное и причинное ML.
Вот простой способ об этом думать:
- Традиционное ML спрашивает: «Какие пациенты с наибольшей вероятностью восстановятся?»
- Причинное ML спрашивает: «Какие пациенты восстановятся благодаря лечению?»
Первое помогает предсказывать. Второе помогает принимать решения. Полезны оба подхода.
Почему важно причинно-следственное машинное обучение
Большинство бизнес- и управленческих решений по своей природе причинные. Вы спрашиваете не «что будет?», а «что нам делать?»
Вот несколько конкретных примеров:
- Больнице мало знать, какие пациенты высокорисковые. Ей важно понять, какое лечение снизит этот риск
- Маркетинговой команде не нужно просто предсказать выручку следующего квартала. Ей важно понять, поможет ли удвоение бюджета на рекламу реально достичь цели
- Правительству мало прогнозировать безработицу. Оно хочет знать, снизит ли её новая политика.
Стандартные методы ML не отвечают на эти вопросы, потому что воспринимают корреляцию как признак. Две переменные могут меняться вместе из‑за общей причины, а связь может быть и случайной. Причинное ML заставляет задуматься, почему вещи связаны — и приведёт ли изменение одной к реальному изменению другой.
Ключевые концепции в причинном ML
Прежде чем оценивать причинно-следственные эффекты, нужно понять пару вещей, на которых держится любой причинный анализ.
Лечение и исход
У любого причинного вопроса две части: лечение и исход.
Лечение — это действие или вмешательство, которое вы изучаете. Это может быть лекарство, назначенное пациентам, или скидка, предложенная клиентам. Исход — то, что вы измеряете: время восстановления, частота покупок, производительность и т. п.
Цель причинного ML — оценить, как лечение меняет исход. Речь не о корреляции между двумя величинами, а о том, вызывает ли одна действительно другую.
Контрфакты
Вы можете наблюдать, что произошло после приёма лекарства пациентом, но не можете наблюдать, что было бы, если бы он его не принимал. Этот ненаблюдаемый сценарий называется контрфактом.
В другой области: клиент получил скидку 20% и совершил покупку. Контрфактный вопрос: купил бы он без скидки? Вы никогда не узнаете наверняка, потому что нельзя отмотать время и проиграть обе версии с одним и тем же человеком.
Причинное ML оценивает такие контрфакты с помощью статистических методов и предположений. Качество оценки зависит от того, насколько хорошо вы аппроксимируете то, что нельзя напрямую наблюдать.
Смешивающие факторы (конфаундеры)
Конфаундер — это переменная, влияющая и на лечение, и на исход, создавая ложное впечатление причинности.
Например, вы изучаете, снижает ли спорт риск сердечных заболеваний. Люди, кто больше тренируется, чаще и питаются здоровее. Диета влияет и на вероятность занятий (лечение), и на сердечные заболевания (исход). Если игнорировать диету, вы переоцените важность одного лишь спорта.
Конфаундеры — главный риск причинного анализа. Их выявление и учёт делают оценку надёжной — на это стоит потратить время.
Причинные графы и DAG (ориентированные ациклические графы)
Если вы задаётесь вопросом, как определить, какие переменные — конфаундеры, а какие нет, ответ таков: нужно нарисовать граф.
Ориентированный ациклический граф (DAG) — это диаграмма, отображающая причинные связи между переменными. Каждый узел — переменная, а каждая стрелка указывает от причины к следствию. «Ориентированный» означает, что стрелки имеют направление. «Ациклический» — что нет циклов: переменная не может быть причиной самой себя, напрямую или через цепочку.
Возьмём пример со спортом. Простой DAG будет иметь стрелки Диета → Спорт и Диета → Болезни сердца, а также стрелку Спорт → Болезни сердца. Граф наглядно показывает, что Диета — конфаундер, потому что указывает и на лечение, и на исход.

Пример простого DAG
DAG также подсказывают, какие переменные контролировать, а какие оставить. Если контролировать не ту переменную, можно внести смещение вместо того, чтобы его убрать. Думайте о DAG как о дорожной карте всего причинного анализа.
Лучшая часть?
Чтобы построить DAG, математика не нужна. Нужны предметные знания. Граф кодирует ваши предположения о том, как устроен мир, и качество оценок зависит от того, насколько эти предположения верны.
Методы в причинном ML
Причинное ML много заимствует из статистики и эконометрики, но масштабирует идеи средствами ML. Рассмотрим четыре самых распространённых подхода.
Методы скорингов склонности (propensity score)
В идеале вы бы проводили рандомизированный эксперимент для измерения эффекта лечения. Но на практике назначение лечения редко случайно. Получившие лечение часто отличаются от тех, кто не получил, — эти различия вносят смещение.
Методы propensity score оценивают вероятность получения лечения каждым индивидом на основе наблюдаемых характеристик. Эта вероятность и есть propensity score.
Когда у вас есть такие оценки, есть два основных способа их использовать:
- Сопоставление (matching) подбирает пары: получивших лечение и не получивших с близкими значениями propensity score. Если у клиента со скидкой score 0.7, вы находите похожего клиента без скидки со score около 0.7. Разница исходов в парах аппроксимирует причинный эффект
- Взвешивание (weighting) корректирует вклад каждого индивида в анализе на основе его propensity score. Вместо пар вы перевзвешиваете всю выборку так, чтобы группы с лечением и без были сопоставимы. Это называется взвешиванием по обратной вероятности (IPW).
Оба метода пытаются смоделировать рандомизированный эксперимент по наблюдательным данным.
Инструментальные переменные
Иногда конфаундеры, которые нужно контролировать, отсутствуют в данных. Их нельзя измерить, и propensity score не поможет. Здесь применимы инструментальные переменные (IV).
Инструмент — это переменная, влияющая на лечение, но не имеющая прямого влияния на исход. Она воздействует на исход только через лечение.
Классический пример — изучение влияния образования на доходы. Мотивация влияет и на объём полученного образования, и на заработок — но её нельзя напрямую измерить. Расстояние до ближайшего колледжа может быть инструментом: оно влияет на решение поступать, но не влияет напрямую на будущую зарплату.
На практике найти хороший инструмент сложно. Метод великолепен, когда инструмент есть, но слабый или некорректный инструмент даст вводящие в заблуждение результаты.
Причинные леса
Причинные леса расширяют алгоритм случайного леса для оценки эффектов лечения вместо предсказаний. Обычный лес предсказывает исход, а причинный — оценивает, насколько лечение меняет этот исход для разных подгрупп.
Это полезно, когда эффект лечения различается у разных людей. Лекарство может работать лучше у молодых пациентов и хуже — у пожилых. Аналогично, скидка может повысить покупки у чувствительных к цене клиентов и не повлиять на лояльных. Причинные леса выявляют такие различия, разбиениями по признакам, где вариативность эффектов максимальна.
На выходе — персонализированная оценка эффекта лечения для каждого индивида в выборке.
Двойное машинное обучение
Double Machine Learning (DML) сочетает ML-модели и статистический вывод, чтобы объединить сильные стороны обоих подходов.
Вы используете одну ML-модель для предсказания исхода и другую — для предсказания назначения лечения. Затем смотрите на остатки (то, что модели не объяснили), и связь между ними даёт причинный эффект.
Если вы задаётесь вопросом, зачем все эти шаги, ответ таков. ML-модели отлично ловят паттерны, но вносят смещение при причинной оценке. DML убирает это смещение техникой перекрёстного подбора (cross-fitting), когда обучение и предсказание выполняются на разных разбиениях данных, чтобы избежать переобучения.
Оценка эффектов лечения
Выбрав метод, нужно уметь суммировать результаты. Здесь помогают метрики эффектов лечения.
Средний эффект лечения (ATE) измеряет средний причинный эффект лечения по всей популяции. Если ATE для кампании со скидкой равен $5, это означает, что в среднем скидка увеличила траты на $5 на клиента.
ATE даёт общую картину, но скрывает индивидуальные различия. Среднее $5 может означать, что все потратили на $5 больше, а может — что половина клиентов потратила на $10 больше, а у другой половины изменений нет.
Условный средний эффект лечения (CATE) оценивает эффект лечения для конкретных подгрупп по их характеристикам. Вместо одного числа для всех CATE, например, говорит, что скидка увеличила траты на $8 для новых клиентов и лишь на $2 — для постоянных.
CATE делает причинное ML практически применимым. ATE показывает, работает ли вмешательство. CATE — для кого оно работает, и это то, что нужно для решений на основе данных.
Применения причинного ML
Причинное ML нужно везде, где вы переходите от «что произошло?» к «что нам делать?». Вот несколько примеров.
Здравоохранение
Больнице нужно понять, какое лечение лучше для конкретного профиля пациента. Стандартный ML предскажет, кто в группе риска, а причинное ML оценит, даст ли Лечение A или Лечение B лучший исход именно для этого пациента. Это позволяет принимать персонализированные решения, основываясь на оценённых эффектах, а не на средних по популяции.
Маркетинг
Команда провела промокампанию и видит всплеск продаж. Вопрос: вызвала ли кампания этот всплеск или он связан с сезонным спросом? Причинное ML изолирует реальный эффект кампании, учитывая конфаундеры — время, демографию клиентов и историю покупок.
Экономика
Государствам и институтам нужно оценивать, достигают ли политики желаемых результатов. Снизила ли программа обучения безработицу? Увеличили ли налоговые льготы инвестиции? Причинное ML даёт каркас для оценки политики, когда рандомизированные эксперименты непрактичны или невозможны.
Продуктовая аналитика
Команда добавила новую функцию — вовлечённость выросла. Причинное ML помогает понять, вызвала ли функция рост или это совпало с другими изменениями — например, с маркетинговым толчком или сбоем у конкурента. Понимание реального эффекта функции отличает решения на данных от догадок.
Общая мысль: решения зависят от понимания, почему что-то произошло, а не только факта, что это произошло.
Причинное ML на Python
Есть три библиотеки, которые покрывают большинство кейсов причинного ML в Python. Рассмотрим, что делает каждая, и типичный рабочий процесс.
Набор данных
Прежде чем перейти к коду, вот полный фрагмент с импортами и созданием набора данных. Установить недостающие зависимости можно с помощью pip или uv.
import numpy as np
import pandas as pd
from dowhy import CausalModel
from econml.dml import DML
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.linear_model import LinearRegression
from causalml.inference.meta import LRSRegressor
np.random.seed(42)
# Generate synthetic data
n = 1000
customer_age = np.random.normal(35, 10, n)
prior_purchases = np.random.poisson(5, n)
# Treatment: whether the customer received a discount email
# Older customers with more purchases were more likely to get one
propensity = 1 / (1 + np.exp(-(0.03 * customer_age + 0.1 * prior_purchases - 2)))
discount = np.random.binomial(1, propensity)
# Outcome: purchase amount in dollars
# True causal effect of the discount is $5
purchase_amount = (
50
+ 5 * discount
+ 0.5 * customer_age
+ 2 * prior_purchases
+ np.random.normal(0, 10, n)
)
df = pd.DataFrame({
"customer_age": customer_age,
"prior_purchases": prior_purchases,
"discount": discount,
"purchase_amount": purchase_amount
})
features = df[["customer_age", "prior_purchases"]].values
treatment = df["discount"].values
outcome = df["purchase_amount"].values
Набор данных описывает 1000 клиентов интернет-магазина, а цель — оценить причинный эффект письма со скидкой в долларах. Истинный причинный эффект скидки равен $5, но, как видно из вывода, наивное сравнение завышает истинный эффект, потому что клиенты со скидкой уже имели больше предыдущих покупок:
naive_ate = (
df[df["discount"] == 1]["purchase_amount"].mean()
- df[df["discount"] == 0]["purchase_amount"].mean()
)
print("Naive Comparison")
print(f"Difference in means: ${naive_ate:.2f}")

Наивное сравнение
DoWhy
DoWhy — это фреймворк от Microsoft для сквозного причинного вывода. Он следует четырёхшаговому процессу: смоделировать проблему как причинный граф, идентифицировать причинный эффект, оценить его и затем проверить, насколько оценка устойчива к различным допущениям.
Особенность DoWhy — фокус на валидации. Получив оценку, он запускает тесты-«опровержения», которые бросают вызов результату. Если оценка проходит эти тесты, ей можно больше доверять. Если нет — значит, нужно пересмотреть предположения.
model = CausalModel(
data=df,
treatment="discount",
outcome="purchase_amount",
common_causes=["customer_age", "prior_purchases"]
)
identified_estimand = model.identify_effect()
estimate = model.estimate_effect(
identified_estimand,
method_name="backdoor.linear_regression"
)
refutation = model.refute_estimate(
identified_estimand,
estimate,
method_name="random_common_cause"
)
print(f"Estimated ATE: ${estimate.value:.2f}")
print(f"After adding a random confounder: ${refutation.new_effect:.2f}")

Вывод DoWhy
В среднем скидка увеличила сумму покупки на $6.60 на клиента. В тесте-«опровержении» в модель добавили случайную переменную, и оценка вовсе не изменилась, что означает: результат не обусловлен ложными корреляциями. Если бы оценка сильно сдвинулась, это был бы сигнал, что причинные допущения неверны.
EconML
EconML, также от Microsoft, фокусируется на оценке гетерогенных эффектов лечения — проще говоря, как эффект варьируется между подгруппами. Он реализует методы вроде Double ML и причинных лесов, о которых мы говорили выше.
EconML использует знакомый API в стиле scikit-learn с методами .fit() и .effect().
dml = DML(
model_y=RandomForestRegressor(n_estimators=100, random_state=42),
model_t=RandomForestClassifier(n_estimators=100, random_state=42),
model_final=LinearRegression(),
discrete_treatment=True
)
dml.fit(Y=outcome, T=treatment, X=features, W=None)
individual_effects = dml.effect(X=features)
df["estimated_effect"] = individual_effects
young = df[df["customer_age"] < 30]
middle = df[(df["customer_age"] >= 30) & (df["customer_age"] < 40)]
older = df[df["customer_age"] >= 40]
print(f"Average treatment effect: ${individual_effects.mean():.2f}")
print(f"Effect on young customers (<30): ${young['estimated_effect'].mean():.2f}")
print(f"Effect on mid-age customers (30-40): ${middle['estimated_effect'].mean():.2f}")
print(f"Effect on older customers (>40): ${older['estimated_effect'].mean():.2f}\\n")

Вывод EconML
Скидка увеличила суммы покупок в среднем на $5.90, но эффект был неодинаков. Молодые клиенты отреагировали сильнее ($6.27), а у пожилых рост был наименьшим ($5.50). Если бюджет ограничен, это подсказывает, куда направить кампанию в первую очередь.
CausalML
CausalML, созданная в Uber, предназначена для uplift-моделирования — предсказания, кто сильнее всего отреагирует на лечение. Особенно популярна в маркетинге: цель — таргетировать тех, кто изменит поведение из‑за кампании, а не тех, кто и так бы сконвертировался.
learner = LRSRegressor()
cate_estimates = learner.fit_predict(
X=features,
treatment=treatment,
y=outcome
)
df["uplift"] = cate_estimates.flatten()
# Split into targeting tiers
df["tier"] = pd.cut(df["uplift"], bins=3, labels=["Low", "Medium", "High"])
tier_summary = df.groupby("tier").agg(
avg_uplift=("uplift", "mean"),
avg_age=("customer_age", "mean"),
avg_prior_purchases=("prior_purchases", "mean"),
count=("uplift", "size")
).round(2)
print(tier_summary.to_string())

Вывод CausalML
Значения uplift почти одинаковы у всех клиентов, то есть скидка дала примерно одинаковый эффект — около $6.60 на человека. Это логично для синтетических данных, где мы заложили плоский эффект $5 без вариации по подгруппам. В реальных данных разброс обычно больше — там и полезны уровни таргетинга.
Выбор подходящей библиотеки
У каждой библиотеки своя идеальная область применения. Используйте:
- DoWhy, когда нужен структурированный, основанный на допущениях рабочий процесс с встроенной валидацией
- EconML, когда нужны гетерогенные эффекты лечения и API в стиле scikit-learn
- CausalML, когда вы сосредоточены на uplift-моделировании и решениях по таргетингу
Все три хорошо сочетаются. Типичный паттерн: задать причинный граф в DoWhy, оценить эффекты в EconML и использовать CausalML для интерпретации результатов.
Распространённые ошибки в причинном ML
Причинное ML легко использовать неверно. Вот ошибки, которые чаще всего сбивают с толку.
Подмена корреляции причинностью
Классика. Клиенты, чаще пользующиеся функцией, больше тратят — вы делаете вывод, что функция увеличивает траты. Но, возможно, клиенты с высокими тратами просто более вовлечены во всём. Без причинного каркаса вы угадываете направление связи.
Любой причинный анализ начинается с вопроса: это паттерн или это причина? Если его пропустить, никакое моделирование не поможет.
Игнорирование конфаундеров
Конфаундер влияет и на лечение, и на исход.
Допустим, вы измеряете эффект обучающей программы на эффективность сотрудников. Те, кто записывается на обучение, как правило, более мотивированы. Мотивация влияет и на участие (лечение), и на эффективность (исход). Если её не учесть, вы припишете эффект мотивации программе обучения.
Исправление — скорее структурное, чем статистическое. Нарисуйте DAG, отметьте все переменные, которые могут влиять на обе стороны, и решите, как работать с каждой, прежде чем обучать модель.
Неправильная интерпретация эффектов лечения
ATE = $5 не означает, что каждый клиент получил +$5. Это среднее, а средние многое скрывают. Кто-то мог получить +$15, а кто-то — −$5.
Опасна и обратная крайность. Оценка CATE для подгруппы не означает, что каждый индивидуум в ней отреагирует одинаково. Эффекты лечения — это оценки с неопределённостью, а не гарантии. Всегда проверяйте доверительные интервалы и не принимайте решения по таргетингу только на точечных оценках.
Подмена предметных знаний моделями
Число, которое выдаёт EconML или DoWhy, ровно настолько хорошо, насколько верны предположения. Модель не ответит на такие вопросы:
- Какие переменные — конфаундеры?
- Каков причинный граф?
- Соответствует ли механизм назначения лечения вашим представлениям?
На них отвечает тот, кто понимает предметную область. Причинный лес с готовностью выдаст оценки из плохо заданной модели — просто не сообщит, что они неверны.
Лучшие причинные анализы объединяют способность ML работать со сложными данными с экспертом, который понимает, какие переменные важны и почему.
Выводы
Причинное ML меняет вопрос с «что произойдёт?» на «что это вызвало?»
Этот сдвиг меняет принятие решений. Вы переходите от реакции на паттерны к пониманию механизмов за ними. Некоторые скажут, что это единственный способ принимать по‑настоящему основанные на данных решения.
Но инструменты работают ровно настолько хорошо, насколько верны допущения. Неверный причинный граф или неправильное прочтение эффекта лечения могут привести к выводам, которые кажутся «научными» и основанными на данных, но неверны. Модель не поднимет руку и не предупредит.
Лучшие результаты получаются при сочетании возможностей ML работать со сложными данными с экспертом, который достаточно хорошо понимает проблему, чтобы задавать правильные причинные вопросы. Начните с предметных знаний, а тяжёлую работу поручите модели. Ничего сложного.
С первым пунктом просто — особенно с нашим курсом Supervised Learning with scikit-learn. Запишитесь сегодня, чтобы прокачать навыки ML с обязательной для Python библиотекой.
Частые вопросы о причинно-следственном машинном обучении
Что такое причинно-следственное машинное обучение?
Причинно-следственное машинное обучение сочетает ML с методами причинно-следственного вывода для оценки причинно-следственных связей по данным. Вместо предсказаний на основе паттернов оно отвечает на вопрос, что произойдёт, если вы предпримете конкретное действие. Это делает его полезным для решений, где важно знать, действительно ли вмешательство работает.
Чем причинное ML отличается от традиционного ML?
Традиционный ML изучает корреляции и использует их для предсказаний. Причинный ML идёт дальше и оценивает эффект вмешательства. Стандартная модель может предсказать, какие клиенты уйдут, а причинная — какие останутся благодаря вашему предложению удержания.
Почему причинное машинное обучение важно?
Большинство бизнес-, медицинских и политических решений по своей природе причинные. Вы спрашиваете не что произойдёт, а что вам делать. Причинное ML даёт способ ответить на этот вопрос данными, а не интуицией.
В чём разница между ATE и CATE?
ATE (Average Treatment Effect) измеряет средний причинный эффект лечения по всей популяции. CATE (Conditional Average Treatment Effect) разбивает его по подгруппам, показывая, как эффект варьируется в зависимости от характеристик. CATE нужен, когда вы хотите направлять вмешательства тем, кто получит максимальную выгоду.
Какие библиотеки Python используют для причинного ML?
Три самых популярных — DoWhy, EconML и CausalML. DoWhy предлагает структурированный процесс причинного вывода со встроенными тестами валидации. EconML фокусируется на гетерогенных эффектах лечения и имеет API в стиле scikit-learn. CausalML ориентирован на uplift-моделирование и помогает определить, кто сильнее всего отреагирует на лечение.