Причинный вывод

Необходимость причинного вывода

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

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

Каково влияние одной характеристики (называемой лечением) на другую характеристику (называемую реакцией или результатом)?

Причинный вывод ни в коем случае не является новым методом — он известен как минимум 50 лет и уже давно используется в социальных науках, экономике и политических науках. В медицине конкретный вопрос может звучать так:

Как влияет введение таблетки на вероятность выживания пациентов?

Здесь лечение является бинарным (дать таблетку? да/нет), а ответ непрерывен между 0 и 1 (вероятность), например.

Наивный взгляд на проблему

В качестве абстрактного, но простого примера представьте, что у нас есть набор данных с одной функцией x и целью y. Мы хотим изучить влияние x на y.

Для этого предположим, что мы подогнали к данным линейную модель ŷ = 2x + 1, которая имеет достойную производительность. Как теперь влияет x на y? Что ж, из-за простой формы линейной модели мы можем описать эффект следующим образом: увеличение x на 1 увеличивает y на 2. >. Следующий вопрос!

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

Много функций, много ответов

Я создал небольшой набор данных, чтобы показать вам, что ответ не всегда так ясен. Просто следуйте в Python:

import pandas as pd

data = pd.read_csv(
  'https://raw.githubusercontent.com/Garve/datasets/5734e7783ed5c39b03348fe7484af19d9936ed9f/causal.csv'
)

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

  • Чувство долга
  • Количество сверхурочных (лечение)
  • Счастье и
  • Доход (ответ).

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

Теперь мы запустим простую линейную регрессию с Сверхурочные в качестве входной функции и Доход в качестве цели. Это кажется самым прямым, что нужно сделать, пытаясь ответить на вопрос.

from sklearn.linear_model import LinearRegression

X = data[['Overtime']]
y = data['Income']

print(LinearRegression().fit(X, y).coef_)

# Output:
# [2.7987431]

Круто, значит, увеличение сверхурочных на 1 увеличивает доход примерно в 2,8 раза, верно? Ну, может быть, давайте сначала проверим, захватывает ли модель данные.

from sklearn.model_selection import cross_val_score

print(cross_val_score(LinearRegression(), X, y).mean())

# Output:
# 0.9566128136325356

Среднее r² 5-кратной перекрестной проверки (стандартный метод scikit-learn на момент написания этой статьи) составляет около 0,95, что очень прилично, поэтому мы можем доверять всему, что говорит нам модель.

Но у нас есть больше возможностей в наших карманах, верно? Чем больше информации, тем лучше, так что давайте использовать их. Теперь мы будем использовать обработку Сверхурочные, а также дополнительный регрессор Чувство долга.

X = data[['Overtime', 'Sense of duty']]
y = data['Income']

print(LinearRegression().fit(X, y).coef_)

# Output: 
# [1.99819195 0.98356566]

Используя эти две функции, история немного меняется. Теперь увеличение сверхурочной работы на 1 означает увеличение дохода на всего лишь примерно на 2 вместо 2,8, как было раньше! 5-кратное среднее r² также немного лучше, чем раньше, около 0,976.

А если мы используем последнюю функцию — Счастье — также?

X = data[['Overtime', 'Sense of duty', 'Happiness']]
y = data['Income']

print(LinearRegression().fit(X, y).coef_)

# Output: 
# [2.92794148 0.52911897 0.46879848]

Наклон Overtime снова меняется, на этот раз примерно до 2,9. Среднее 5-кратное значение r² здесь составляет около 0,987, что является самым высоким значением.

Итак, каким был бы ваш окончательный ответ на простой вопрос «Как сверхурочная работа влияет на доход?» быть?

Является ли истинным уклоном…

  1. …около 2,8, потому что использование только Сверхурочной работы в качестве предиктора дает самый прямой ответ на вопрос?
  2. …около 2,9, потому что мы используем все доступные функции, а пятикратное среднее значение r² здесь самое высокое?
  3. …около 2, потому что… это единственное четное простое число? 😅
  4. … что-то совершенно другое?

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

Урегулирование спора

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

10/10 за его серию видео и сценарий, посмотрел бы еще раз! 👍— Роберт

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

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

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

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

В словах:

  • Чувство долга влияет на Сверхурочные и Доход.
  • Сверхурочные влияют на доход и счастье.
  • Доход влияет на счастье.

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

import numpy as np
import pandas as pd

np.random.seed(0)

duty = np.random.randn(1000) + 4
overtime = duty + 3.5 + 0.5*np.random.randn(1000)
income = duty + 2*overtime + 10 + 0.5*np.random.randn(1000)
happiness = income - 4*overtime + 6 + 0.5*np.random.randn(1000)

data = pd.DataFrame({
    'Sense of duty': duty,
    'Overtime': overtime,
    'Happiness': happiness,
    'Income': income
})

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

В качестве другого примера, из строки

overtime = duty + 3.5 + 0.5*np.random.randn(1000)

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

Конфаундеры и коллайдеры

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

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

делать-исчисление

Используя так называемое ду-исчисление, изобретенное Judea Pearl, мы можем доказать те утверждения, которые я вам только что бросил, о конфаундерах, коллайдерах и многом другом. Стандартным ресурсом по этой теме является книга Джудеи Перл Книга почему.

Заключение

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

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

Надеюсь, что сегодня вы узнали что-то новое, интересное и полезное. Спасибо за прочтение!

И последнее, если вы

  1. поддержите меня в написании дополнительных статей о машинном обучении и
  2. в любом случае планируйте получить подписку на Medium,

почему бы не сделать это по этой ссылке? Это бы мне очень помогло! 😊

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

Большое спасибо, если вы поддержите меня!

Если у вас есть вопросы, пишите мне в LinkedIn!