Введение.

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

Обычно формула линейной регрессии выглядит следующим образом:

*  y = mx + b*

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

ПОКАЗАТЕЛИ ОЦЕНКИ

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

среди наиболее часто используемых:

а. Среднеквадратическая ошибка (MSE) — показатель, используемый для оценки производительности модели машинного обучения. Он рассчитывается как среднее квадратов разностей между предсказаниями модели и истинными значениями. MSE — это мера разницы между предсказаниями модели и истинными значениями.

MSE рассчитывается следующим образом:

СКО = (1/n) * Σ(y_i — ŷ_i)²

где y_i — истинное значение, ŷ_i — прогнозируемое значение, а n — количество наблюдений.

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

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

б. Среднеквадратическая ошибка (RMSE) – это показатель, используемый для оценки производительности модели машинного обучения. Он рассчитывается как квадратный корень из среднеквадратичной ошибки (MSE), которая представляет собой среднее значение квадратов разностей между предсказаниями модели и истинными значениями. RMSE — это мера разницы между предсказаниями модели и истинными значениями.

RMSE рассчитывается следующим образом:

RMSE = sqrt((1/n) * Σ(y_i — ŷ_i)²)

где y_i — истинное значение, ŷ_i — прогнозируемое значение, а n — количество наблюдений.

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

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

в. Средняя абсолютная ошибка (MAE) – это показатель, используемый для оценки производительности модели машинного обучения. Он рассчитывается как среднее абсолютных различий между предсказаниями модели и истинными значениями. MAE — это мера разницы между предсказаниями модели и истинными значениями.

МАЭ рассчитывается следующим образом:

MAE = (1/n) * Σ|y_i — ŷ_i|

где y_i — истинное значение, ŷ_i — прогнозируемое значение, а n — количество наблюдений.

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

Важно отметить, что MAE не чувствителен к масштабу переменных, поэтому нет необходимости масштабировать переменные перед подгонкой модели и расчетом MAE. Кроме того, MAE менее чувствителен к выбросам, чем другие показатели ошибок, такие как MSE и RMSE, поэтому он может быть предпочтительным выбором, когда данные содержат выбросы.

Основная цель исследования – спрогнозировать цены на жилье на основе заданных переменных.

Показатели успеха:

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

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

Тепловая карта для проверки корреляции переменных выполняется с использованием кода ниже:

#checking how sale price correlates with other variables using a correlation map
#Correlation check
fig, ax = plt.subplots(figsize=(20,10))  
sns.heatmap(df.corr(), cmap="YlGnBu", annot=True)

Из приведенной выше тепловой карты видно, что цены имеют высокую корреляцию с:

  • sqft_living
  • sqft_above

У нас также есть высокая корреляция между следующими переменными:

  1. sqft_above и sqft_living
  2. sqft_living и спальни и ванные комнаты
  3. Спальни и ванные комнаты

Это ожидаемо, так как чем больше комнат/ванных, тем большую площадь будет занимать дом.

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

Моделирование

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

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

Теперь запачкаем руки на части моделирования.

Импорт библиотек и разделение данных для обучения и тестирования.

# from sklearn.model_selection import KFold
import scipy as sp
from sklearn.model_selection import GridSearchCV
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import statsmodels.formula.api as smf
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
# from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet


#separating features and target for use in modelling

X = df.drop(['price'], axis=1)

y = df['price']

# Splitting dataset to train and test sets 80% train and 20% test
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2, random_state=0)

Масштабирование функций

Это процесс нормализации набора признаков в наборе данных.

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

Чтобы модель могла интерпретировать эти функции, они должны быть помещены в один и тот же масштаб 3 разных масштабатора в библиотеке Scikit-learn для масштабирования функций, а именно:

  • МинМаксСкалер
  • Стандартный масштабатор
  • RobustScaler

пока сосредоточимся на нормализации и стандартизации.

1. Нормализация также называется масштабированием Min-Max

Это метод масштабирования, при котором значения в столбце сдвигаются таким образом, что они ограничиваются фиксированным диапазоном от 0 до 1.

Цель: сделать данные однородными по всем записям и полям. Это помогает создать связь между входными данными, что, в свою очередь, помогает очищать и улучшать качество данных.

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

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

MinMaxScaler — это функция нормализации.

X_new = (X - X_min) / (X_max - X_min)

2. Стандартизация также называется нормализацией Z-оценки

Это метод масштабирования, при котором значения в столбце масштабируются таким образом, чтобы они демонстрировали свойства стандартного распределения Гаусса, то есть среднее значение = 0 и дисперсия = 1. Стандартизированные данные обычно предпочтительнее, когда данные используются для многомерного анализа. Данные имеют гауссово распределение. Нет, это не всегда верно, но считается более эффективным применительно к распределению Гаусса.

StandardScaler — это функция стандартизации.

X_new = (X - mean) / std

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

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

#scaled features

sc = StandardScaler()
X_train_sc = sc.fit_transform(X_train)
X_test_sc = sc.transform(X_test)

Базовая модель

Начнем с создания базовой модели, в которой не настроены гиперпараметры. придет к этому позже

#using scaled features 

#fitting linear model
regression = LinearRegression()
regression.fit(X_train_sc,y_train)

#predicting on unseen data
y_pred = regression.predict(X_test_sc)

#evaluating model
mse = metrics.mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test,y_pred))

rmses.append((f'Baseline linear model RMSE: {rmse}'))


print('Mean Squared Error:', mse)
print('Root Mean Squared Error:', rmse)
['Baseline linear model RMSE: 268523.73846318235']

Настройка гиперпараметров в линейной регрессии

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

Для нашего случая мы сначала построили базовую модель, затем настроим различные параметры и посмотрим, улучшится ли наша модель.

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

а. проверка на гомоскедастичность

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

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

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

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

# Creating the residuals by substracting the test value from the predicted 
# value for each row in the test dataset

residuals = np.subtract(y_pred, y_test)


#plotting residuals
plt.scatter(y_pred, residuals, color='black')
plt.ylabel('residual')
plt.xlabel('fitted values')
plt.axhline(y= residuals.mean(), color='red', linewidth=1)
plt.title('Residuals against fitted values')
plt.show()

Данные показывают гетероскедастичность. Будет протестирован с использованием теста Барлетта для подтверждения.

#assessing heteroscedasticity using Barlett's test

test_result, p_value = sp.stats.bartlett(y_pred, residuals)


# If the pvalue is less than the significance level of 0.05, then the null
# hypothesis is rejected - the variance is different for at least one pair of datapoints

# Otherwise the null hypothesis that 
# the variance is homogeneous across the data

#using significance level of 0.05:
if (p_value < 0.05 ):
  print('the variances are not homogenous')
else:
  print('the variances are homogeneous across the data')
the variances are not homogenous

Мы уже знаем, что наши данные не имеют нормального распределения. мы можем подтвердить это с помощью теста Шапиро.

# importing the shapiro function
from scipy.stats import shapiro 


# testing for normality. extracting statistic and p value
stat, p = shapiro(residuals)


# interpreting
alpha = 0.05
if p > alpha:
 print('Sample appears to have a normal distribution')
else:
 print('Sample does not appear to have a normal distribution')
Sample does not appear to have a normal distribution

б. Проверка мультиколлинеарности

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

Еще одно допущение линейной регрессии — это небольшая мультиколлинеарность или ее отсутствие, поэтому важно проверить наличие этого явления.

#checking for multicollinearity 
#creating function that will calculate the VIF for each feature
def vif(df, features):
  vif, tolerance = {}, {}
  for feature in features:
    #extract other features other than the one chosen as y into a list
    X = [f for f in features if f!=feature]
    X, y = df[X], df[feature]
    #extract r2
    r2 = LinearRegression().fit(X, y).score(X, y)
    #calculate tolerance
    tolerance[feature] = 1-r2
    #calculate VIF
    vif[feature] = 1/tolerance[feature]
  return pd.DataFrame({'VIF': vif, 'Tolerance': tolerance})
#checking multicollinearity
vif(df, df.drop('price', axis=1).columns)

Особенности с коэффициентом инфляции дисперсии › 5 включают:

  • sqft_above
  • sqft_basement

Регуляризация (гребень, лассо и эластичная сеть) может помочь справиться с мультиколлинеарностью.

Регрессия Лассо, также известная как регуляризация L1, представляет собой тип линейной регрессии, который добавляет штрафной член к функции потерь, пропорциональный абсолютному значению параметров модели. Срок штрафа контролируется гиперпараметром, называемым силой регуляризации или коэффициентом регуляризации, который определяет величину сжатия, применяемую к параметрам модели.

Регрессия Лассо имеет несколько свойств, которые делают ее привлекательной для определенных типов задач:

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

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

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

#finding best hyperparameter (penalty) value for lasso
parameters = {'alpha': np.concatenate(([0.001,0.01], np.arange(0.1,2,0.1), np.arange(2, 5, 0.5), np.arange(5, 20, 1)))}
lasso = Lasso()
#finding alpha value
search = GridSearchCV(estimator=lasso,param_grid=parameters,scoring='neg_mean_squared_error')
search.fit(X_train_sc,y_train)
print(search.best_params_)


{'alpha': 14.0}

#using scaled features 

#fitting lasso model 
lasso = Lasso(alpha=14.0)
lasso.fit(X_train_sc,y_train)

#predicting on unseen data
y_pred = lasso.predict(X_test_sc)

#evaluating model
mse = metrics.mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test,y_pred))

rmses.append([f'Tuned lasso model RMSE: {rmse}'])


print('Mean Squared Error:', mse)
print('Root Mean Squared Error:', rmse)
Baseline linear model RMSE: 268523.73846318235

['Tuned lasso model RMSE: 268388.6564902328']

В нашей RMSE для лассо есть небольшое улучшение по сравнению с нашей базовой моделью.

Ридж-регрессия

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

  1. Гребневая регрессия имеет несколько свойств, которые делают ее привлекательной для определенных типов задач:
  2. Стабильность: регрессия хребта может помочь улучшить стабильность и интерпретируемость модели за счет уменьшения дисперсии коэффициентов.
  3. Надежность: гребневая регрессия относительно устойчива к наличию мультиколлинеарности в данных.
  4. Прогностическая сила: гребенчатая регрессия иногда может иметь лучшую прогностическую эффективность, чем регрессия Лассо, особенно когда количество признаков велико и есть коррелированные признаки.

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

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

#ridge regression
#finding best alpha value. 
parameters = {'alpha': np.concatenate(([0.001,0.01], np.arange(0.1,2,0.1), np.arange(2, 5, 0.5), np.arange(5, 20, 1)))}
ridge = Ridge(random_state=0)
#finding alpha value
search = GridSearchCV(estimator=ridge,param_grid=parameters,scoring='neg_mean_squared_error')
search.fit(X_train_sc,y_train)
print(search.best_params_)

{'alpha': 19.0}

#using scaled features 

#fitting ridge model 
ridge = Ridge(alpha=19.0)
ridge.fit(X_train_sc,y_train)

#predicting on unseen data
y_pred = ridge.predict(X_test_sc)

#evaluating model
mse = metrics.mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test,y_pred))

print('Mean Squared Error:', mse)
print('Root Mean Squared Error:', rmse)

rmses.append(f'Tuned ridge model RMSE: {rmse}')

Baseline linear model RMSE: 268523.73846318235

['Tuned lasso model RMSE: 268388.6564902328']

Tuned ridge model RMSE: 268497.21668180317

RMSE в гребневой регрессии на самом деле выше, чем в Лассо. Следовательно, регрессия Лассо — наша лучшая модель на данный момент.

Эластичная чистая регрессия

Эластичная сетевая регрессия — это тип линейной регрессии, который сочетает в себе условия регуляризации L1 и L2 регрессии Лассо и Риджа. Штрафной срок контролируется двумя гиперпараметрами: коэффициентом L1, который определяет вес штрафного термина L1, и силой регуляризации или коэффициентом регуляризации, который определяет общую силу штрафного термина.

  1. Регрессия эластичной сети имеет несколько свойств, которые делают ее привлекательной для определенных типов задач:
  2. Разреженность: как и регрессия Лассо, регрессия эластичной сети может создавать разреженные модели со многими коэффициентами, установленными на ноль.
  3. Надежность: регрессия эластичной сети относительно устойчива к наличию мультиколлинеарности в данных.
  4. Гибкость: регрессия эластичной сети обеспечивает баланс между разреженностью регрессии Лассо и стабильностью регрессии Риджа в зависимости от значений отношения L1 и силы регуляризации.

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

#finding best hyperparameter values - alpha and l1_ratio
elastic=ElasticNet()
parameters = {'alpha': np.concatenate(([0.0001,0.001,0.01], np.arange(0.1,2,0.1), np.arange(2, 5, 0.5), np.arange(5, 20, 1))),
              'l1_ratio':[.2,.4,.6,.8,1]}

search=GridSearchCV(estimator=elastic,param_grid=parameters,scoring='neg_mean_squared_error')

search.fit(X_train_sc,y_train)
print(search.best_params_)

{'alpha': 0.1, 'l1_ratio': 0.6}

#using scaled features 

#fitting model
elastic=ElasticNet(alpha=0.1,l1_ratio=0.6)
elastic.fit(X_train_sc,y_train)

#predicting on unseen data
y_pred = elastic.predict(X_test_sc)

#evaluating model

mse = metrics.mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test,y_pred))

rmses.append(f'Tuned elastic net model RMSE: {rmse}')

print('Mean Squared Error:', mse)
print('Root Mean Squared Error:', rmse)

Baseline linear model RMSE: 268523.73846318235

['Tuned lasso model RMSE: 268388.6564902328']

Tuned ridge model RMSE: 268497.21668180317

Tuned elastic net model RMSE: 269298.86486582964

Эластичная сеть хуже, чем наша базовая модель, что делает Лассо лучшей моделью.

Сравнение коэффициентов

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

Заключение

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