Примечание
Перейти к концу для загрузки полного кода примера. или для запуска этого примера в вашем браузере через 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)

В следующем разделе мы обучим предсказательные модели, и поэтому разделим целевой столбец от над другими признаками и разделим данные на обучающий и тестовый наборы.
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()

Прогнозирование дохода при частичной наблюдаемости
На практике интеллектуальные способности не наблюдаются или оцениваются только по косвенным показателям, которые косвенно измеряют образование (например, с помощью тестов 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()

Для компенсации пропущенной переменной модель увеличивает коэффициент признака «высшее образование». Поэтому интерпретация этого значения коэффициента как причинного эффекта истинной генеративной модели является неправильной.
Выводы
Модели машинного обучения не предназначены для оценки причинно-следственных эффектов. Хотя мы продемонстрировали это с помощью линейной модели, смещение, вызванное пропущенной переменной, может повлиять на любой тип модели.
При интерпретации коэффициента или изменения прогнозов, вызванных изменением одного из признаков, важно учитывать потенциально ненаблюдаемые переменные, которые могут быть связаны как с рассматриваемым признаком, так и с целевой переменной. Такие переменные называются смешивающими переменными. Для оценки причинного эффекта при наличии смешивающих переменных исследователи обычно проводят эксперименты, в которых переменная-фактор (например, наличие высшего образования) рандомизирована. Когда эксперимент нерентабелен или неэтичен, исследователи иногда могут использовать другие методы причинного вывода, такие как инструментальные переменные (IV).
Общее время выполнения сценария: (0 минут 2,897 секунды)
Связанные примеры
© 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