Мотивация

Чтобы спрогнозировать цены на жилье в округе Кинг, я выбрал набор данных о ценах на жилье, полученный от Kaggle. Этот набор данных содержит цены продажи домов для округа Кинг, включая Сиэтл. Он включает в себя дома, проданные в период с мая 2014 г. по май 2015 г. Он обладает многими характеристиками обучения, и набор данных можно скачать здесь.

Вступление

Общая идея регрессии состоит в том, чтобы исследовать две вещи: (1) хорошо ли справляется набор переменных-предикторов при прогнозировании исходной (зависимой) переменной? (2) Какие переменные, в частности, являются значимыми предикторами переменной результата и каким образом они - на что указывает величина и знак бета-оценок - влияют на переменную результата? Эти оценки регрессии используются для объяснения взаимосвязи между одной зависимой переменной и одной или несколькими независимыми переменными.

Выполненные регрессии

Простая линейная регрессия

  1. "Спальни" vs "цена"
  2. "Оценка" и "цена"

Множественная регрессия

  1. "Спальни", "уровень", "sqft_living", "sqft_above"
  2. «Спальни», «ванные комнаты», «sqft_living», «sqft_lot», «этажи», «береговая линия», «вид», «уровень», «sqft_above», «sqft_basement», «lat», «sqft_living15»

Полиномиальная регрессия

  1. степень = 2
  2. степень = 3

Описание

В этом наборе данных представлена ​​продажная цена домов в округе Кинг, Сиэтл. Он включает дома, проданные в период с мая 2014 года по май 2015 года. Прежде чем что-либо делать, мы должны сначала узнать о наборе данных, что он содержит, каковы его особенности и какова структура данных.

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

Предварительная обработка данных

импортировать необходимые библиотеки.

#importing numpy and pandas, seaborn

import numpy as np #linear algebra
import pandas as pd #datapreprocessing, CSV file I/O
import seaborn as sns #for plotting graphs
import matplotlib.pyplot as plt

Прочтите файл CSV.

df = pd.read_csv("../input/housesalesprediction/kc_house_data.csv")

Функция Pandas dataframe.info () используется для получения краткого обзора фрейма данных. Это очень удобно при исследовательском анализе данных. Чтобы получить быстрый обзор набора данных, мы используем функцию dataframe.info ().

df.info()

Метод Pandas head () используется для возврата первых n (по умолчанию 5) строк фрейма данных или серии.

df.head()

Функция формы Pandas используется для возврата размера, формы и размеров фреймов данных и серий.

#finding no of rows and columns
df.shape

Вызов sum () фрейма данных, возвращаемого isnull (), даст ряд, содержащий данные о количестве NaN в каждом столбце.

df.isnull().sum()

Нахождение количества спален.

df['bedrooms'].value_counts()

Нахождение счета набережной.

Нахождение счетчика оценок.

df['grade'].value_counts()

Нахождение количества условий.

df['condition'].value_counts()

Строится график для спален.

sns.countplot(df.bedrooms,order=df['bedrooms'].value_counts().index)

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

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

fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
plt.title("house prices by sqft_above")
plt.xlabel('sqft_above')
plt.ylabel('house prices')
plt.legend()
sns.barplot(x='sqft_above',y='price',data=df)

Гистограмма построена для квадратного метра жизни.

plt.hist('sqft_living',data=df,bins=5)

График распределения строится для sqft living, чтобы увидеть, искажены ли данные или нет

fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
sns.distplot(df['sqft_living'],hist=True,kde=True,rug=False,label='sqft_living',norm_hist=True)

График распределения построен для sqft выше, чтобы увидеть, искажены ли данные или нет.

fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
sns.distplot(df['sqft_above'],hist=True,kde=True,rug=False,label='sqft_above',norm_hist=True)

Определение среднего, режима и медианы кв. Футов жизни.

print('Mean',round(df['sqft_living'].mean(),2))
print('Median',df['sqft_living'].median())
print('Mode',df['sqft_living'].mode()[0])

С помощью графиков мы видим, что sqft living = 1300 имеет больше значений.

len(df[df['sqft_living']==1300])

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

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

def correlation_heatmap(df1):
    _,ax=plt.subplots(figsize=(15,10))
    colormap=sns.diverging_palette(220,10,as_cmap=True)
    sns.heatmap(df.corr(),annot=True,cmap=colormap)
    
correlation_heatmap(df)

Теперь, когда у нас есть достаточно информации о данных, мы начинаем линейную регрессию.

Простая линейная регрессия

Для линейной регрессии мы используем linear_model из функции sklearn.

Scikit-learn предоставляет ряд контролируемых и неконтролируемых алгоритмов обучения через единый интерфейс на Python. Библиотека построена на SciPy (научный Python), который необходимо установить, прежде чем вы сможете использовать scikit-learn. Расширения или модули для ухода за SciPy условно называются SciKits. Таким образом, модуль предоставляет алгоритмы обучения и называется scikit-learn.

Мы импортируем train_test_split. Это разделяет данные на требуемое соотношение (например: 80–20), из которых определенное соотношение учитывается для обучения данных, а остальное - для тестирования. данные. Данные обучаются предсказанию линии, а затем тестовые данные используются, чтобы увидеть, подходит ли линия идеально или нет.

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

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

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

from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import PolynomialFeatures
from sklearn import metrics
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline

Здесь мы разделяем данные на соотношение 80:20, из которых train_size составляет 80%, test_size - 20%. train_test_split разбивает массивы или матрицы на случайные обучающие и тестовые подмножества. Это означает, что каждый раз, когда вы запускаете его без указания random_state, вы получите другой результат, это ожидаемое поведение. Чтобы получить те же подмножества поездов и тестов, мы объявляем случайное состояние. Здесь x - «sqft_living», а y - «цена». Мы меняем форму x_train и y_train, и данные подогнаны. X_test и y_test используются для прогнозирования точности модели. Здесь сначала мы вычисляем среднюю квадратичную ошибку y_test. Найдены средние квадратические ошибки для обучения и тестирования. Найдены точка пересечения и коэффициент линии.

train_data,test_data=train_test_split(df,train_size=0.8,random_state=3)
reg=linear_model.LinearRegression()
x_train=np.array(train_data['sqft_living']).reshape(-1,1)
y_train=np.array(train_data['price']).reshape(-1,1)
reg.fit(x_train,y_train)

x_test=np.array(test_data['sqft_living']).reshape(-1,1)
y_test=np.array(test_data['price']).reshape(-1,1)
pred=reg.predict(x_test)
print('linear model')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('Sqaured mean error', round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(x_train,y_train),3))
print('R sqaured testing',round(reg.score(x_test,y_test),3) )
print('intercept',reg.intercept_)
print('coefficient',reg.coef_)

Тестирование R-квадрата: 0,496

Диаграмма рассеяния построена для x_test, y_test. Данные распределены по графику. Теперь построена линия, полученная сверху, чтобы увидеть, как она соответствует данным.

_, ax = plt.subplots(figsize= (12, 10))
plt.scatter(x_test, y_test, color= 'darkgreen', label = 'data')
plt.plot(x_test, reg.predict(x_test), color='red', label= ' Predicted Regression line')
plt.xlabel('Living Space (sqft)')
plt.ylabel('price')
plt.legend()
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['right'].set_visible(False)

Здесь мы разделяем данные в соотношении 80:20, из которых train_size составляет 80%, а test_size - 20%. Здесь x - «оценка», а y - «цена». Мы меняем форму x_train и y_train, и данные подогнаны. X_test и y_test используются для прогнозирования точности модели. Здесь сначала мы вычисляем среднюю квадратичную ошибку y_test. Найдены средние квадратические ошибки для обучения и тестирования. Найдены точка пересечения и коэффициент линии.

train_data,test_data=train_test_split(df,train_size=0.8,random_state=3)
reg=linear_model.LinearRegression()
x_train=np.array(train_data['grade']).reshape(-1,1)
y_train=np.array(train_data['price']).reshape(-1,1)
reg.fit(x_train,y_train)

x_test=np.array(test_data['grade']).reshape(-1,1)
y_test=np.array(test_data['price']).reshape(-1,1)
pred=reg.predict(x_test)
print('linear model')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('squared mean error',round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(x_train,y_train),3))
print('R squared testing',round(reg.score(x_test,y_test),3))
print('intercept',reg.intercept_)
print('coeeficient',reg.coef_)

Тестирование R-квадрата: 0,46

Множественная линейная регрессия

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

fig,ax=plt.subplots(2,1,figsize=(15,10))
sns.boxplot(x=train_data['grade'],y=train_data['price'],ax=ax[0])
sns.boxplot(x=train_data['bedrooms'],y=train_data['price'],ax=ax[1])
_ , axes = plt.subplots(1, 1, figsize=(15,10))
sns.boxplot(x=train_data['bathrooms'],y=train_data['price'])

Мы рассматриваем следующие функции: «спальни», «уровень», «sqft_living» и «sqft_above». Они считаются одной функцией, а именно features1. Теперь данные подогнаны к модели, и test_data features1 используются для прогнозирования. Среднеквадратичная ошибка рассчитывается для y_test. Среднеквадратичная ошибка округляется до 2 десятичных знаков. Рассчитывается ошибка квадрата R как для обучения, так и для теста. Пересечение линии рассчитывается вместе с коэффициентом индивидуального признака.

features1=['bedrooms','grade','sqft_living','sqft_above']
reg=linear_model.LinearRegression()
reg.fit(train_data[features1],train_data['price'])
pred=reg.predict(test_data[features1])
print('complex_model 1')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('mean squared error(MSE)', round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(train_data[features1],train_data['price']),3))
print('R squared training', round(reg.score(test_data[features1],test_data['price']),3))
print('Intercept: ', reg.intercept_)
print('Coefficient:', reg.coef_)

Тестирование R-квадрата: 0,555

Мы рассматриваем следующие функции: «спальни», «ванные комнаты», «sqft_living», «sqft_lot», «этажи», «набережная», «вид», «уровень», «sqft_above», «sqft_basement», «lat», sqft_living15. Они считаются одной функцией, а именно функциями2. Теперь данные соответствуют модели, и test_data features2 используются для прогнозирования. Среднеквадратичная ошибка рассчитывается для y_test. Среднеквадратичная ошибка округляется до 2 десятичных знаков. Рассчитывается ошибка квадрата R как для обучения, так и для теста. Пересечение линии рассчитывается вместе с коэффициентом индивидуального признака.

features2 = ['bedrooms','bathrooms','sqft_living','sqft_lot','floors','waterfront','view','grade','sqft_above','sqft_basement','lat','sqft_living15']
reg= linear_model.LinearRegression()
reg.fit(train_data[features1],train_data['price'])
pred = reg.predict(test_data[features1])
print('Complex Model_2')
mean_squared_error = metrics.mean_squared_error(y_test, pred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(reg.score(train_data[features1], train_data['price']), 3))
print('R-squared (testing) ', round(reg.score(test_data[features1], test_data['price']), 3))
print('Intercept: ', reg.intercept_)
print('Coefficient:', reg.coef_)

Тестирование R-квадрата: 0,672

Полиномиальная регрессия

Полиномиальная регрессия - это форма линейной регрессии, в которой взаимосвязь между независимой переменной x и зависимой переменной y моделируется как полином степени n. Полиномиальная регрессия соответствует нелинейной зависимости между значением x и соответствующим условным средним y, обозначенным E (y | x).

Для степени = 2 строится линейная модель. Вычисляется среднеквадратичная ошибка и определяется квадрат r для обучения и тестирования.

polyfeat=PolynomialFeatures(degree=2)
xtrain_poly=polyfeat.fit_transform(train_data[features1])
xtest_poly=polyfeat.fit_transform(test_data[features1])

poly=linear_model.LinearRegression()
poly.fit(xtrain_poly,train_data['price'])
polypred=poly.predict(xtest_poly)

print('Complex Model_3')
mean_squared_error = metrics.mean_squared_error(test_data['price'], polypred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(poly.score(xtrain_poly, train_data['price']), 3))
print('R-squared (testing) ', round(poly.score(xtest_poly, test_data['price']), 3))

Тест R-квадрат: 0,759

Для степени = 3 строится линейная модель. Вычисляется среднеквадратичная ошибка и определяется квадрат r для обучения и тестирования.

polyfeat=PolynomialFeatures(degree=3)
xtrain_poly=polyfeat.fit_transform(train_data[features1])
xtest_poly=polyfeat.fit_transform(test_data[features1])

poly=linear_model.LinearRegression()
poly.fit(xtrain_poly,train_data['price'])
polypred=poly.predict(xtest_poly)

print('complex model_4')
mean_squared_error=metrics.mean_squared_error(test_data['price'],polypred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(poly.score(xtrain_poly, train_data['price']), 3))
print('R-squared (testing) ', round(poly.score(xtest_poly, test_data['price']), 3))

Тестирование R-квадрата: 0,664

Наблюдение

Комплексная модель_3 дает нам оценку R-квадрат (тестирование) 0,759. Из приведенных выше отчетов мы можем сделать вывод, что полиномиальная регрессия для степени = 2 является лучшим решением.

Информацию о записной книжке можно найти здесь. Я был бы рад получить отзывы или вопросы по любому из вышеперечисленного.