Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Распространённые ошибки при интерпретации коэффициентов линейных моделей
В линейных моделях целевое значение моделируется как линейная комбинация признаков (описание набора линейных моделей, доступных в scikit-learn, см. в разделе руководства пользователя Линейные модели). Коэффициенты в моделях множественной линейной регрессии отражают взаимосвязь между заданным признаком \(X_i\) и целевой переменной \(y\) при условии, что все остальные признаки остаются неизменными (условная зависимость). Это отличается от построения графика зависимости \(X_i\) от \(y\) и подбора линейной зависимости: в этом случае при оценке учитываются все возможные значения остальных признаков (маргинальная зависимость).
В этом примере приводятся некоторые рекомендации по интерпретации коэффициентов линейных моделей и рассматриваются проблемы, возникающие, когда линейная модель не подходит для описания набора данных или когда признаки коррелируют.
Примечание
Помните, что признаки \(X\) и результат \(y\) в общем случае являются результатом процесса генерации данных, который нам неизвестен. Модели машинного обучения обучаются приближать ненаблюдаемую математическую функцию, связывающую \(X\) и \(y\), на основе выборочных данных. Поэтому любая интерпретация модели не обязательно будет применима к истинному процессу генерации данных. Особенно это актуально, если модель имеет низкое качество или выборочные данные не представляют генеральную совокупность.
Мы будем использовать данные из «Current Population Survey» за 1985 год, чтобы предсказывать заработную плату на основе различных признаков, таких как опыт работы, возраст и образование.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
import matplotlib.pyplot as plt import numpy as np import pandas as pd import scipy as sp import seaborn as sns
Набор данных: заработная плата
Мы получаем данные с сайта OpenML. Обратите внимание: если установить параметр as_frame в True, данные будут возвращены в виде фрейма данных pandas.
from sklearn.datasets import fetch_openml survey = fetch_openml(data_id=534, as_frame=True)
Затем определим признаки X и целевую переменную y: столбец WAGE — это наша целевая переменная (то есть переменная, значение которой мы хотим предсказать).
X = survey.data[survey.feature_names] X.describe(include="all")
Обратите внимание, что набор данных содержит категориальные и числовые переменные. Это нужно будет учесть при дальнейшей предварительной обработке набора данных.
X.head()
Целевая переменная для предсказания — заработная плата. Она представлена числом с плавающей точкой и измеряется в долларах за час.
y = survey.target.values.ravel() survey.target.head()
0 5.10 1 4.95 2 6.67 3 4.00 4 7.50 Name: WAGE, dtype: float64
Разделим выборку на обучающий и тестовый наборы. В дальнейшем исследовательском анализе будет использоваться только обучающий набор. Так мы имитируем реальную ситуацию, в которой предсказания строятся для неизвестных целевых значений, и исключаем влияние сведений о тестовых данных на наш анализ и решения.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
Сначала получим общее представление о данных, рассмотрев распределения переменных и попарные взаимосвязи между ними. Будут использоваться только числовые переменные. На следующем графике каждая точка соответствует одному наблюдению.
train_dataset = X_train.copy() train_dataset.insert(0, "WAGE", y_train) _ = sns.pairplot(train_dataset, kind="reg", diag_kind="kde")

При более внимательном изучении распределения WAGE видно, что у него длинный хвост. Поэтому следует взять логарифм этой переменной, чтобы получить приблизительно нормальное распределение (линейные модели, такие как ridge и lasso, лучше всего работают при нормальном распределении ошибок).
WAGE увеличивается с ростом EDUCATION. Обратите внимание, что представленная здесь зависимость между WAGE и EDUCATION является маргинальной, то есть описывает поведение конкретной переменной без фиксации остальных.
Кроме того, EXPERIENCE и AGE имеют сильную линейную корреляцию.
Конвейер машинного обучения
Чтобы создать конвейер машинного обучения, сначала вручную проверим типы данных, с которыми мы имеем дело:
survey.data.info()
<class 'pandas.DataFrame'> RangeIndex: 534 entries, 0 to 533 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 EDUCATION 534 non-null int64 1 SOUTH 534 non-null category 2 SEX 534 non-null category 3 EXPERIENCE 534 non-null int64 4 UNION 534 non-null category 5 AGE 534 non-null int64 6 RACE 534 non-null category 7 OCCUPATION 534 non-null category 8 SECTOR 534 non-null category 9 MARR 534 non-null category dtypes: category(7), int64(3) memory usage: 17.3 KB
Как было показано выше, набор данных содержит столбцы с разными типами данных, и для каждого типа требуется отдельная предварительная обработка. В частности, категориальные переменные нельзя включать в линейную модель, если предварительно не представить их в виде целых чисел. Кроме того, чтобы категориальные признаки не воспринимались как упорядоченные значения, необходимо выполнить их прямое унитарное кодирование (one-hot encoding). Наш предварительный обработчик будет:
- выполнять прямое унитарное кодирование (то есть создавать столбец для каждой категории) категориальных столбцов, кроме бинарных категориальных переменных;
- на первом этапе (позже мы рассмотрим, как нормализация числовых значений повлияет на обсуждение) оставлять числовые значения без изменений.
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoder
categorical_columns = ["RACE", "OCCUPATION", "SECTOR", "MARR", "UNION", "SEX", "SOUTH"]
numerical_columns = ["EDUCATION", "EXPERIENCE", "AGE"]
preprocessor = make_column_transformer(
(OneHotEncoder(drop="if_binary"), categorical_columns),
remainder="passthrough",
verbose_feature_names_out=False, # avoid to prepend the preprocessor names
)
Для моделирования логарифма WAGE мы используем регрессор Ridge с очень слабой регуляризацией.
from sklearn.compose import TransformedTargetRegressor
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
model = make_pipeline(
preprocessor,
TransformedTargetRegressor(
regressor=Ridge(alpha=1e-10), func=np.log10, inverse_func=sp.special.exp10
),
)
Обработка набора данных
Сначала обучим модель.
model.fit(X_train, y_train)
Затем мы проверим качество полученной модели: построим график её прогнозов в сравнении с фактическими значениями на тестовой выборке и вычислим медианную абсолютную ошибку.
from sklearn.metrics import PredictionErrorDisplay, median_absolute_error
mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
"MedAE on training set": f"{mae_train:.2f} $/hour",
"MedAE on testing set": f"{mae_test:.2f} $/hour",
}
_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, small regularization")
for name, score in scores.items():
ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()

Обученная модель далека от хорошей модели, способной давать точные прогнозы: это очевидно на графике выше, где хорошие прогнозы должны располагаться на чёрной пунктирной линии.
В следующем разделе мы интерпретируем коэффициенты модели. При этом следует помнить, что любые выводы относятся к построенной нами модели, а не к истинному (реальному) процессу генерации данных.
Интерпретация коэффициентов: масштаб имеет значение
Для начала рассмотрим значения коэффициентов обученного регрессора.
feature_names = model[:-1].get_feature_names_out()
coefs = pd.DataFrame(
model[-1].regressor_.coef_,
columns=["Coefficients"],
index=feature_names,
)
coefs
Коэффициент AGE выражен в «долларах в час на год жизни», а коэффициент EDUCATION — в «долларах в час на год обучения». Такое представление коэффициентов помогает понять практические прогнозы модели: увеличение AGE на \(1\) год означает снижение почасовой оплаты на \(0.030867\) доллара, тогда как увеличение EDUCATION на \(1\) год означает увеличение почасовой оплаты на \(0.054699\) доллара. С другой стороны, категориальные переменные (например, UNION или SEX) — безразмерные величины, принимающие значение 0 или 1. Их коэффициенты выражены в долларах в час. Поэтому мы не можем сравнивать величины разных коэффициентов: из-за различий в единицах измерения у признаков разные естественные масштабы и диапазоны значений. Это особенно наглядно при построении графика коэффициентов.
coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, small regularization")
plt.axvline(x=0, color=".5")
plt.xlabel("Raw coefficient values")
plt.subplots_adjust(left=0.3)

Действительно, исходя из графика выше, важнейшим фактором, определяющим WAGE, кажется UNION, хотя интуиция подсказывает, что такие переменные, как EXPERIENCE, должны оказывать большее влияние.
Оценивать важность признаков по графику коэффициентов может быть обманчиво: одни признаки меняются в небольшом диапазоне, а другие, например AGE, варьируются гораздо сильнее — на протяжении нескольких десятилетий.
Это видно при сравнении стандартных отклонений разных признаков.
X_train_preprocessed = pd.DataFrame(
model[:-1].transform(X_train), columns=feature_names
)
X_train_preprocessed.std(axis=0).plot.barh(figsize=(9, 7))
plt.title("Feature ranges")
plt.xlabel("Std. dev. of feature values")
plt.subplots_adjust(left=0.3)

Умножение коэффициентов на стандартное отклонение соответствующего признака приведёт все коэффициенты к одной и той же единице измерения. Как мы увидим далее, это эквивалентно нормализации числовых переменных по их стандартному отклонению, поскольку \(y = \sum{coef_i \times X_i} = \sum{(coef_i \times std_i) \times (X_i / std_i)}\).
Таким образом мы подчёркиваем, что чем выше дисперсия признака, тем больший вес соответствующий коэффициент имеет на выходе при прочих равных условиях.
coefs = pd.DataFrame(
model[-1].regressor_.coef_ * X_train_preprocessed.std(axis=0),
columns=["Coefficient importance"],
index=feature_names,
)
coefs.plot(kind="barh", figsize=(9, 7))
plt.xlabel("Coefficient values corrected by the feature's std. dev.")
plt.title("Ridge model, small regularization")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)

Теперь, когда коэффициенты приведены к общему масштабу, их можно безопасно сравнивать.
Примечание
Почему график выше показывает, что увеличение возраста приводит к снижению заработной платы? Почему исходная диаграмма парных зависимостей показывает обратное? Это различие между маргинальной и условной зависимостью.
График выше показывает зависимости между конкретным признаком и целевой переменной при неизменности всех остальных признаков, то есть условные зависимости. Увеличение AGE приведёт к снижению WAGE при неизменности остальных признаков. Напротив, увеличение EXPERIENCE приведёт к росту WAGE при неизменности остальных признаков. Кроме того, AGE, EXPERIENCE и EDUCATION — три переменные, оказывающие наибольшее влияние на модель.
Интерпретация коэффициентов: осторожность в отношении причинности
Линейные модели — отличный инструмент для измерения статистической связи, но при высказываниях о причинности следует проявлять осторожность: корреляция не всегда означает причинно-следственную связь. Это особенно сложно в социальных науках, поскольку наблюдаемые нами переменные служат лишь косвенными показателями лежащих в основе причинных процессов.
В нашем случае EDUCATION отдельного человека можно считать косвенным показателем его профессиональных способностей — истинной переменной, которая нас интересует, но которую мы не можем наблюдать. Нам, конечно, хотелось бы считать, что более длительное обучение повышает техническую квалификацию, однако вполне возможно и обратное направление причинной связи: люди с высокой технической квалификацией, как правило, дольше учатся.
Работодателю, вероятно, неважно, какой из вариантов верен (или является ли результат сочетанием обоих): если он убеждён, что человек с более высоким уровнем EDUCATION лучше подходит для работы, то будет готов платить ему более высокую WAGE.
Такое смешение эффектов становится проблемой при рассмотрении каких-либо мер вмешательства, например государственных субсидий на получение университетского образования или рекламных материалов, побуждающих людей получать высшее образование. Полезность таких мер может быть переоценена, особенно если степень смешения велика. Наша модель прогнозирует увеличение почасовой оплаты на \(0.054699\) за каждый дополнительный год обучения. Из-за этого смешения фактический причинный эффект может быть меньше.
Проверка изменчивости коэффициентов
Изменчивость коэффициентов можно проверить с помощью перекрёстной проверки: это один из видов возмущения данных (связанный с повторной выборкой).
Если коэффициенты существенно меняются при изменении входного набора данных, их устойчивость не гарантирована, поэтому интерпретировать их, вероятно, следует с осторожностью.
from sklearn.model_selection import RepeatedKFold, cross_validate
cv = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0)
cv_model = cross_validate(
model,
X,
y,
cv=cv,
return_estimator=True,
n_jobs=2,
)
coefs = pd.DataFrame(
[
est[-1].regressor_.coef_ * est[:-1].transform(X.iloc[train_idx]).std(axis=0)
for est, (train_idx, _) in zip(cv_model["estimator"], cv.split(X, y))
],
columns=feature_names,
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=10)
plt.axvline(x=0, color=".5")
plt.xlabel("Coefficient importance")
plt.title("Coefficient importance and its variability")
plt.suptitle("Ridge model, small regularization")
plt.subplots_adjust(left=0.3)

Предварительная обработка числовых переменных
Как было сказано выше (см. «Конвейер машинного обучения»), перед обучением модели мы также можем масштабировать числовые значения. Это может быть полезно, когда при использовании ridge-регрессии ко всем переменным применяется одинаковый уровень регуляризации. Предварительная обработка определяется заново, чтобы вычитать среднее и масштабировать переменные до единичной дисперсии.
from sklearn.preprocessing import StandardScaler
preprocessor = make_column_transformer(
(OneHotEncoder(drop="if_binary"), categorical_columns),
(StandardScaler(), numerical_columns),
)
Модель останется без изменений.
model = make_pipeline(
preprocessor,
TransformedTargetRegressor(
regressor=Ridge(alpha=1e-10), func=np.log10, inverse_func=sp.special.exp10
),
)
model.fit(X_train, y_train)
Снова оценим качество полученной модели с помощью медианной абсолютной ошибки.
mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
"MedAE on training set": f"{mae_train:.2f} $/hour",
"MedAE on testing set": f"{mae_test:.2f} $/hour",
}
_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, small regularization")
for name, score in scores.items():
ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()

На этот раз для анализа коэффициентов масштабирование не требуется, поскольку оно было выполнено на этапе предварительной обработки.
coefs = pd.DataFrame(
model[-1].regressor_.coef_,
columns=["Coefficients importance"],
index=feature_names,
)
coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, small regularization, normalized variables")
plt.xlabel("Raw coefficient values")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)

Теперь рассмотрим коэффициенты на нескольких фолдах кросс-валидации.
cv_model = cross_validate(
model,
X,
y,
cv=cv,
return_estimator=True,
n_jobs=2,
)
coefs = pd.DataFrame(
[est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=10)
plt.axvline(x=0, color=".5")
plt.title("Coefficient variability")
plt.subplots_adjust(left=0.3)

Результат довольно похож на случай без нормализации.
Линейные модели с регуляризацией
На практике машинного обучения гребневая регрессия чаще используется с ненулевой регуляризацией.
Выше мы ограничили эту регуляризацию очень малым значением. Регуляризация улучшает обусловленность задачи и уменьшает дисперсию оценок. RidgeCV использует перекрёстную проверку, чтобы определить, какое значение параметра регуляризации (alpha) лучше всего подходит для предсказания.
from sklearn.linear_model import RidgeCV
alphas = np.logspace(-10, 10, 21) # alpha values to be chosen from by cross-validation
model = make_pipeline(
preprocessor,
TransformedTargetRegressor(
regressor=RidgeCV(alphas=alphas),
func=np.log10,
inverse_func=sp.special.exp10,
),
)
model.fit(X_train, y_train)
Сначала проверим, какое значение \(\alpha\) было выбрано.
model[-1].regressor_.alpha_
10.0
Затем проверим качество предсказаний.
mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
"MedAE on training set": f"{mae_train:.2f} $/hour",
"MedAE on testing set": f"{mae_test:.2f} $/hour",
}
_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, optimum regularization")
for name, score in scores.items():
ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()

Способность регуляризованной модели воспроизводить данные схожа со способностью модели без регуляризации.
coefs = pd.DataFrame(
model[-1].regressor_.coef_,
columns=["Coefficients importance"],
index=feature_names,
)
coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, with regularization, normalized variables")
plt.xlabel("Raw coefficient values")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)

Коэффициенты существенно различаются. Коэффициенты AGE и EXPERIENCE оба положительны, но теперь их влияние на предсказание меньше.
Регуляризация уменьшает влияние коррелирующих переменных на модель, поскольку вес распределяется между двумя предсказывающими переменными, и поэтому ни одна из них по отдельности не получает большого веса.
С другой стороны, веса, полученные с регуляризацией, более стабильны (см. раздел руководства пользователя Регрессия и классификация Ridge). Эта повышенная стабильность видна на графике, построенном по возмущённым данным в ходе перекрёстной проверки. Этот график можно сравнить с предыдущим.
cv_model = cross_validate(
model,
X,
y,
cv=cv,
return_estimator=True,
n_jobs=2,
)
coefs = pd.DataFrame(
[est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.xlabel("Age coefficient")
plt.ylabel("Experience coefficient")
plt.grid(True)
plt.xlim(-0.4, 0.5)
plt.ylim(-0.4, 0.5)
plt.scatter(coefs["AGE"], coefs["EXPERIENCE"])
_ = plt.title("Co-variations of coefficients for AGE and EXPERIENCE across folds")

Линейные модели с разреженными коэффициентами
Ещё один способ учитывать коррелирующие переменные в наборе данных — оценивать разреженные коэффициенты. В некотором смысле мы уже сделали это вручную, отбросив столбец AGE при предыдущей оценке Ridge.
Модели Lasso (см. раздел руководства пользователя Lasso) оценивают разреженные коэффициенты. LassoCV применяет перекрёстную проверку, чтобы определить, какое значение параметра регуляризации (alpha) лучше всего подходит для оценки модели.
from sklearn.linear_model import LassoCV
alphas = np.logspace(-10, 10, 21) # alpha values to be chosen from by cross-validation
model = make_pipeline(
preprocessor,
TransformedTargetRegressor(
regressor=LassoCV(alphas=alphas, max_iter=100_000),
func=np.log10,
inverse_func=sp.special.exp10,
),
)
_ = model.fit(X_train, y_train)
Сначала проверим, какое значение \(\alpha\) было выбрано.
model[-1].regressor_.alpha_
np.float64(0.001)
Затем проверим качество предсказаний.
mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
"MedAE on training set": f"{mae_train:.2f} $/hour",
"MedAE on testing set": f"{mae_test:.2f} $/hour",
}
_, ax = plt.subplots(figsize=(6, 6))
display = PredictionErrorDisplay.from_predictions(
y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Lasso model, optimum regularization")
for name, score in scores.items():
ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()

Для нашего набора данных модель, как и прежде, не слишком хорошо предсказывает.
coefs = pd.DataFrame(
model[-1].regressor_.coef_,
columns=["Coefficients importance"],
index=feature_names,
)
coefs.plot(kind="barh", figsize=(9, 7))
plt.title("Lasso model, optimum regularization, normalized variables")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)

Модель Lasso обнаруживает корреляцию между AGE и EXPERIENCE и исключает одну из этих переменных ради качества предсказания.
Важно помнить, что исключённые коэффициенты всё ещё могут быть связаны с результатом сами по себе: модель решила отбросить их, потому что они дают мало дополнительной информации или не дают её вовсе сверх информации от других признаков. Кроме того, такой выбор нестабилен для коррелирующих признаков, поэтому его следует интерпретировать с осторожностью.
Действительно, мы можем проверить изменчивость коэффициентов между фолдами.
cv_model = cross_validate(
model,
X,
y,
cv=cv,
return_estimator=True,
n_jobs=2,
)
coefs = pd.DataFrame(
[est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=100)
plt.axvline(x=0, color=".5")
plt.title("Coefficient variability")
plt.subplots_adjust(left=0.3)

Мы видим, что значения коэффициентов AGE и EXPERIENCE сильно меняются в зависимости от фолда.
Ошибочная причинная интерпретация
Разработчики государственной политики могут захотеть узнать, как образование влияет на заработную плату, чтобы оценить, будет ли экономически целесообразна политика, призванная побудить людей получать больше образования. Хотя модели машинного обучения хорошо измеряют статистические связи, обычно они не способны выявлять причинно-следственные эффекты.
Может возникнуть соблазн посмотреть на коэффициент образования для заработной платы в нашей последней модели (или в любой другой модели) и заключить, что он отражает истинный эффект изменения стандартизированной переменной образования на заработную плату.
К сожалению, существуют, вероятно, ненаблюдаемые смешивающие переменные, которые завышают или занижают этот коэффициент. Смешивающая переменная — это переменная, которая влияет и на EDUCATION, и на WAGE. Одним из примеров такой переменной является способности. Предположительно, люди с более высокими способностями чаще получают образование и одновременно с этим с большей вероятностью зарабатывают больше за час при любом уровне образования. В этом случае способности создают положительное смещение из-за пропущенной переменной (OVB) для коэффициента EDUCATION, тем самым преувеличивая влияние образования на заработную плату.
Пример OVB из-за способностей на симулированных данных см. в разделе Неспособность машинного обучения выявлять причинно-следственные эффекты.
Выводы
- Чтобы определить важность признаков, коэффициенты необходимо привести к одной и той же единице измерения. Масштабирование с использованием стандартного отклонения признака — полезная приближённая оценка.
- Коэффициенты в многомерных линейных моделях отражают зависимость между заданным признаком и целевой переменной при условии, что остальные признаки фиксированы.
- Коррелирующие признаки вызывают нестабильность коэффициентов линейных моделей, и их эффекты трудно надёжно разделить.
- Разные линейные модели по-разному реагируют на корреляцию признаков, поэтому коэффициенты могут существенно различаться.
- Анализ коэффициентов по фолдам цикла перекрёстной проверки позволяет оценить их стабильность.
- Интерпретировать причинно-следственные связи сложно при наличии смешивающих эффектов. Если на связь между двумя переменными также влияет что-то ненаблюдаемое, следует с осторожностью делать выводы о причинности.
Общее время выполнения скрипта: (0 минут 16.545 секунд)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/inspection/plot_linear_model_coefficient_interpretation.html

