Смещение затухания/разбавление регрессии смещает ваши коэффициенты в сторону 0

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

О сериале

Предположим, вы специалист по данным, работающий в компании, занимающейся недвижимостью (агентство, девелопер и т. д.), и кто-то спрашивает вас:

«Насколько увеличиваются цены на жилье на каждый дополнительный квадратный метр?»

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

Смещение затухания/регрессионное разбавление

Смещение затухания, также называемое разбавлением регрессии, представляет собой смещение коэффициентов модели, вызванное ошибкой измерения или шумом в ваших независимых (X) переменных. Коэффициенты вашей модели смещаются в сторону 0.

Например, предположим, что у вас есть регрессионная модель, которая показывает, что каждый дополнительный квадратный метр площади увеличивает цену на 2000 долларов. Если ваша функция площади имеет много ошибок измерения или шума, истинное влияние площади еще больше… возможно, цена на самом деле увеличивается на 2500 долларов.

Это также работает наоборот. Если ваша модель показывает отрицательный коэффициент, например, -2000, истинный коэффициент будет еще меньше… скажем, -2500. Коэффициенты смещены в сторону 0.

Обратите внимание, что это смещение не возникает, если ваша зависимая (y) переменная имеет шум или ошибки измерения... на нее влияют только шум или ошибки в ваших переменных X.

Почему возникает эта предвзятость?

Предположим, что цена увеличивается на 2000 долл. США за каждый фактический прирост площади на 1 кв. м (квадратный метр).

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

Колебания в этой сообщенной колонке «площадь» частично связаны с а) фактическими колебаниями площади И б) шумом.

а) должен иметь коэффициент 2000, поскольку каждый 1 кв. м увеличения фактической площади увеличивает цену на 2000 долларов, тогда как б) должен иметь коэффициент 0, поскольку шум или ошибки измерения не влияют на цены на жилье. Коэффициент для этого сообщаемого столбца «площадь» находится где-то между 0 и 2000, что является коэффициентами а) и б) соответственно.

Мы будем избегать подробной формулировки, которую можно найти в Интернете, и перейдем к примеру на питоне…

Подготовка данных

1- Мы живем в городе с 2000 домов.

2- В городе есть 2 района, один премиум/дорогой район и другой не премиум/обычный район.

3- Дома в премиальном районе в среднем меньше (в среднем 200 кв.м). Дома в обычном районе в среднем 500 кв.м. Размеры домов в данных взяты из нормального распределения.

4- Истинная стоимость дома = 3000 долларов США x площадь (в кв. м) для домов в элитном районе. Истинная стоимость = 1000 долларов США x площадь в непремиальном районе.

5- Дом продается на рынке по цене = истинной стоимости +/- 20%. Отклонение +/- 20% - это просто шум.

Давайте создадим набор данных с 2000 домами на основе приведенных выше предположений…

import numpy as np
import scipy.stats as ss
np.random.seed(seed=0)
areas_premium = ss.norm(200, 50).rvs(1000)
areas_non_premium = ss.norm(500, 50).rvs(1000)

Создание фрейма данных с областями и столбцом «премиум» сверху…

Столбец «Премиум» — это фиктивная/бинарная переменная, указывающая, находится ли дом в районе премиум-класса.

df_premium, df_non_premium = pd.DataFrame(), pd.DataFrame()
df_premium['area'] = areas_premium
df_premium['premium'] = 1
df_non_premium['area'] = areas_non_premium
df_non_premium['premium'] = 0
df = pd.concat([df_premium, df_non_premium])
df

Теперь давайте представим, как выглядит распределение областей…

import matplotlib.pyplot as plt
import seaborn as sns
sns.displot(df, x='area', hue='premium', height=5, aspect=16/9)
plt.title('Distribution of areas (sqmt) for premium vs non-premium houses')
plt.show()

Мы видим, что дома премиум-класса обычно меньше.

Теперь, поскольку истинная стоимость дома = 3000 долларов x площадь для домов премиум-класса или 1000 долларов x площадь для домов не премиум-класса, мы можем переписать формулу для истинной стоимости следующим образом:

истинное значение = (1000 долларов США x площадь) + (2000 долларов США x площадь x надбавка)

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

Помните, дом продается по истинной стоимости +/- 20% (случайно).

Наконец, мы добавляем «true_value» и «sell_price» в наш фрейм данных и визуализируем распределение цен продажи…

df['true_value'] = (df['area'] * (1000 + (2000 * df['premium'])))
# Add selling price = true value x noise
# Noise is a random value between 80% and 120%
np.random.seed(seed=0)
df['sell_price'] = df['true_value'] * (
    np.random.randint(low=80, high=121, size=2000) / 100)
# Visualize distributions of selling price
sns.displot(df, x='sell_price', hue='premium', height=5, aspect=16/9)
plt.title('Distribution of selling price for premium vs non-premium houses')
plt.show()

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

Проверка коэффициентов линейной регрессии

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

Мы будем использовать библиотеку statsmodel, которая дает хороший результат для моделей линейной регрессии, но результаты также можно воспроизвести с помощью реализации LinearRegression от sklearn. Смещение затухания влияет на другие модели машинного обучения, будь то линейные или нелинейные. Линейные модели, такие как регрессор стохастического градиентного спуска (SGDRegressor), будут демонстрировать почти идентичные эффекты по сравнению с регрессией OLS, тогда как влияние смещения затухания более тонко для нелинейных и древовидных моделей, для которых обычно требуются другие библиотеки интерпретации, такие как SHAP. или ЛАЙМ.

Запустите линейную регрессию OLS, используя statsmodel с «true_value» в качестве нашей зависимой (y) переменной и «area_x_premium» в качестве наших независимых (X) переменных…

df['area_x_premium'] = df['area'] * df['premium']
# Statsmodel implementation
import statsmodel.api as sm
y = df['true_value']
X = df[['area', 'area_x_premium']]
model = sm.OLS(y, X)
results = model.fit().summary()
results

Обратите внимание, что коэффициенты правильно оценены в соответствии с нашими ожиданиями (1000 и 2000). R2 составляет 100%, что означает, что «истинное значение» можно предсказать со 100% точностью, используя наши 2 переменные «площадь» и «область_x_премия».

Мы получаем те же коэффициенты, используя реализацию линейной регрессии sklearn, и почти такие же коэффициенты, используя SGDRegressor.

model = LinearRegression()
model.fit(X, y)
model.coef_

model = SGDRegressor(alpha=0, random_state=0, eta0=1e-5)
model.fit(X, y)
model.coef_

Теперь давайте проверим, как будут выглядеть результаты регрессии (используя statsmodel), если мы установим sell_price в качестве нашей переменной y вместо true_value…

y = df['sell_price']
model = sm.OLS(y, X)
results = model.fit().summary()
results

Теперь точность модели снижается до 98,6%, потому что в Sel_Price есть некоторый шум, из-за которого дом может быть продан на 20% больше или меньше его истинной стоимости.

Расчетные коэффициенты ~1000 и ~1995 очень близки к ожидаемым нами 1000 и 2000. P-значения равны 0, показывая значимость коэффициентов. Наконец, мы можем увидеть ожидаемый диапазон для этих коэффициентов (992–1009) и (1973–2016), так что наши ожидаемые коэффициенты 1000 и 2000 попадают в эти диапазоны.

Если в нашей переменной y (sell_price) имеется много ошибок/шумов измерения, коэффициенты все равно должны быть несмещенными и близкими к 1000 и 2000, но дополнительный шум снизит прогностическую способность нашей модели, поэтому R2 снизится, а диапазон для 2 коэффициентов будет шире.

Давайте попробуем сделать это…

# Increase noise on target variable to +/- 50% of true value
np.random.seed(seed=0)
df['sell_price_extreme_noise'] = df['true_value'] * (
    np.random.randint(low=50, high=151, size=2000) / 100)
y = df['sell_price_extreme_noise']
model = sm.OLS(y, X)
results = model.fit().summary()
results

R2 снизился до 92,1%, но наши коэффициенты по-прежнему близки к 1000 и 2000. Диапазон коэффициентов, как и ожидалось, шире. Например, для 1-й независимой переменной (площадь) новый диапазон составляет 982–1023 по сравнению с 992–1009 из предыдущего запуска.

Теперь предположим, что ошибка измерения находится в наших независимых переменных, так что наш столбец площади в наборе данных отличается на +/- 50% от фактической площади. Вот где наша предвзятость срабатывает…

# We'll make area noisy such that it has +/- 50% error
np.random.seed(seed=0)
df['area_noise'] = df['area'] * (
    np.random.randint(low=50, high=151, size=2000) / 100)
df['area_x_premium_noise'] = df['area_noise'] * df['premium']
y = df['sell_price']
X = df[['area_noise', 'area_x_premium_noise']]
model = sm.OLS(y, X)
results = model.fit().summary()
results

R2 снизился до 90,7%, но самое главное, наши коэффициенты теперь недооценивают влияние площади! Теперь мы видим коэффициенты ~917 и ~1835. Кроме того, истинные ожидаемые коэффициенты (1000 и 2000) выходят за указанные диапазоны (897–937 и 1781–1889). Это смещение затухания.

Заключительные замечания

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

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

Проблема заключается в интерпретации коэффициентов. Когда нас спрашивают

«Насколько увеличиваются цены на жилье на каждый дополнительный квадратный метр?»

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

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