Мотивация

За да предвидя цените на жилищата в окръг Кинг, избрах набора от данни за цените на жилищата, получен от Kaggle. Този набор от данни съдържа продажни цени на жилища за окръг Кинг, който включва Сиатъл. Той включва жилища, продадени между май 2014 г. и май 2015 г. Той има много характеристики на обучение и наборът от данни може да бъде изтеглен от тук.

Въведение

Цялостната идея на регресията е да се изследват две неща: (1) дали набор от предикторни променливи върши добра работа при прогнозиране на резултатна (зависима) променлива? (2) Кои променливи по-конкретно са значими предиктори на променливата на резултата и по какъв начин те – посочени от величината и знака на бета оценките – влияят върху променливата на резултата? Тези регресионни оценки се използват за обяснение на връзката между една зависима променлива и една или повече независими променливи.

Извършени регресии

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

  1. „спални“ срещу „цена“
  2. „клас“ срещу „цена“

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

  1. ‘bedrooms’,’grade’, ‘sqft_living’, ‘sqft_above’
  2. ‘спални’,’бани’, ‘sqft_living’, ‘sqft_lot’, ‘floors’, ‘waterfront’, ‘view’, ‘grade’, ‘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")

Функцията Pandasdataframe.info() се използва за получаване на кратко резюме на рамката с данни. Той е много полезен, когато правите проучвателен анализ на данните. За да получите бърз преглед на набора от данни, ние използваме функцията dataframe.info().

df.info()

Методът Pandas head() се използва за връщане на горните n (5 по подразбиране) реда на рамка с данни или серия.

df.head()

Функцията Pandas shape се използва за връщане на размер, форма и размери на рамки с данни и серии.

#finding no of rows and columns
df.shape

Извикването на sum() на DataFrame, върнато от 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)

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

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

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)

Изчертава се хистограма за живеене в sqft.

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

Начертава се distplot за 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)

По-горе се изчертава distplot за 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)

Намиране на средна стойност, режим и медиана на sqft живот.

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 (Scientific 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“. Те се считат за една функция, а именно характеристики1. Сега данните се вписват в модела и test_data нахарактеристики1се използват за прогнозиране. Средната квадратна грешка се изчислява за 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', 'floors', 'waterfront', 'view', 'grade', 'sqft_above', 'sqft_basement', 'lat', 'sqft_living15'. Те се считат за една функция, а именно features2. Сега данните се вписват в модела и 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 е най-доброто решение.

За бележник вижте тук. Ще се радвам да получа отзиви или въпроси относно някое от горните.