Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для загрузки полного кода примера. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Неспособность машинного обучения к выводу причинно-следственных эффектов

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

Чтобы проиллюстрировать это, мы смоделируем ситуацию, в которой пытаемся ответить на один из важнейших вопросов экономики образования: каков причинный эффект получения высшего образования на почасовую заработную плату? Хотя ответ на этот вопрос имеет решающее значение для политиков, смещения, вызванные пропущенными переменными (OVB) препятствуют нам в идентификации этого причинного эффекта.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

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

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

import numpy as np
import pandas as pd

n_samples = 10_000
rng = np.random.RandomState(32)

experiences = rng.normal(20, 10, size=n_samples).astype(int)
experiences[experiences < 0] = 0
abilities = rng.normal(0, 0.15, size=n_samples)
parent_hourly_wages = 50 * rng.beta(2, 8, size=n_samples)
parent_hourly_wages[parent_hourly_wages < 0] = 0
college_degrees = (
    9 * abilities + 0.02 * parent_hourly_wages + rng.randn(n_samples) > 0.7
).astype(int)

true_coef = pd.Series(
    {
        "college degree": 2.0,
        "ability": 5.0,
        "experience": 0.2,
        "parent hourly wage": 1.0,
    }
)
hourly_wages = (
    true_coef["experience"] * experiences
    + true_coef["parent hourly wage"] * parent_hourly_wages
    + true_coef["college degree"] * college_degrees
    + true_coef["ability"] * abilities
    + rng.normal(0, 1, size=n_samples)
)

hourly_wages[hourly_wages < 0] = 0

Описание смоделированных данных

На следующем графике показано распределение каждой переменной и парные диаграммы рассеяния. Ключевой момент нашей истории про OVB — это положительная связь между способностью и высшим образованием.

import seaborn as sns

df = pd.DataFrame(
    {
        "college degree": college_degrees,
        "ability": abilities,
        "hourly wage": hourly_wages,
        "experience": experiences,
        "parent hourly wage": parent_hourly_wages,
    }
)

grid = sns.pairplot(df, diag_kind="kde", corner=True)
plot causal interpretation

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

from sklearn.model_selection import train_test_split

target_name = "hourly wage"
X, y = df.drop(columns=target_name), df[target_name]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Прогнозирование дохода с полностью наблюдаемыми переменными

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

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

features_names = ["experience", "parent hourly wage", "college degree", "ability"]

regressor_with_ability = LinearRegression()
regressor_with_ability.fit(X_train[features_names], y_train)
y_pred_with_ability = regressor_with_ability.predict(X_test[features_names])
R2_with_ability = r2_score(y_test, y_pred_with_ability)

print(f"R2 score with ability: {R2_with_ability:.3f}")
R2 score with ability: 0.975

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

import matplotlib.pyplot as plt

model_coef = pd.Series(regressor_with_ability.coef_, index=features_names)
coef = pd.concat(
    [true_coef[features_names], model_coef],
    keys=["Coefficients of true generative model", "Model coefficients"],
    axis=1,
)
ax = coef.plot.barh()
ax.set_xlabel("Coefficient values")
ax.set_title("Coefficients of the linear regression including the ability features")
_ = plt.tight_layout()
Coefficients of the linear regression including the ability features

Прогнозирование дохода при частичной наблюдаемости

На практике интеллектуальные способности не наблюдаются или оцениваются только по косвенным показателям, которые косвенно измеряют образование (например, с помощью тестов IQ). Но пропуск признака «способность» из линейной модели увеличивает оценку за счет положительного смещения, вызванного пропущенной переменной.

features_names = ["experience", "parent hourly wage", "college degree"]

regressor_without_ability = LinearRegression()
regressor_without_ability.fit(X_train[features_names], y_train)
y_pred_without_ability = regressor_without_ability.predict(X_test[features_names])
R2_without_ability = r2_score(y_test, y_pred_without_ability)

print(f"R2 score without ability: {R2_without_ability:.3f}")
R2 score without ability: 0.968

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

model_coef = pd.Series(regressor_without_ability.coef_, index=features_names)
coef = pd.concat(
    [true_coef[features_names], model_coef],
    keys=["Coefficients of true generative model", "Model coefficients"],
    axis=1,
)
ax = coef.plot.barh()
ax.set_xlabel("Coefficient values")
_ = ax.set_title("Coefficients of the linear regression excluding the ability feature")
plt.tight_layout()
plt.show()
Coefficients of the linear regression excluding the ability feature

Для компенсации пропущенной переменной модель увеличивает коэффициент признака «высшее образование». Поэтому интерпретация этого значения коэффициента как причинного эффекта истинной генеративной модели является неправильной.

Выводы

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

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

Общее время выполнения сценария: (0 минут 2,897 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_causal_interpretation.ipynb

Download Python source code: plot_causal_interpretation.py

Download zipped: plot_causal_interpretation.zip

Связанные примеры

Распространенные ошибки при интерпретации коэффициентов линейных моделей

Неотрицательные наименьшие квадраты

Коэффициенты регрессии Ridge в зависимости от L2-регуляризации

Влияние регуляризации модели на ошибку обучения и проверки

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/inspection/plot_causal_interpretation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API