[ML] Boston 집값 예측

TaeHwi Kang·2022년 12월 21일
0

1. boston 집값 예측

1) 보스톤 집 가격 데이터 가져오기

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np

boston = load_boston()

boston.keys()
# dict_keys(
	['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'
    ])
[each for each in boston.feature_names]

# 특성 확인
- 'CRIM' : 범죄율 
- 'ZN': 25000평방피트를 최과 거주지역 비율
- 'INDUS': 비소매상업지역 면적 비율
- 'CHAS': 찰스강의 경계에 위치한 경우 1, 아니면 0
- 'NOX' : 일산화질소 농도
- 'RM' : 주택당 방 수
- 'AGE' : 1940냔 이전의 건축된 주택의 비율
- 'DIS' : 직업센터의 거리
- 'RAD' : 방사형 고속도로까지의 거리
- 'TAX : 재산세율
- 'PTRATIO' : 학생/교사의 비율
- 'B' : 인구 중 훅인 비율
- 'LSTAT : 인구 중 하위 계층 비율

2) 데이터 pandas로 정리, 확인

  • PRICE 컬럼은 Label
boston_pd = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_pd['PRICE'] = boston.target

(1) Price에 대한 histogram

import plotly_express as px

fig = px.histogram(boston_pd, x= "PRICE")
fig.show()

(2) 각 특성별 상관계수 확인

import matplotlib.pyplot as plt
import seaborn as sns

corr_mat = boston_pd.corr().round(1)
sns.heatmap(data=corr_mat, annot=True, cmap='bwr');

(3) PRICE와 상관계수가 높은 RM 과 LSTAT 관계를 관찰

sns.set_style('darkgrid')
sns.set(rc = {'figure.figsize':(12,6)})
fig, ax = plt.subplots(ncols=2)
sns.regplot(x='RM', y='PRICE', data=boston_pd, ax=ax[0])
sns.regplot(x='LSTAT', y='PRICE', data=boston_pd, ax=ax[1])

3. 선형 회귀

1) 데이터 나누기

from sklearn.model_selection import train_test_split

X= boston_pd.drop('PRICE', axis = 1)
y = boston_pd['PRICE']

X_train, X_test, y_train, y_test = train_test_split(
	X,y, test_size=0.2, random_state=13
    )

2) LinearRegression, 모델평가는 RMS로 진행

from sklearn.linear_model import LinearRegression

reg = LinearRegression()
reg.fit(X_train, y_train)
import numpy as np
from sklearn.metrics import mean_squared_error

pred_tr = reg.predict(X_train)
pred_test = reg.predict(X_test)

rmse_tr = (np.sqrt(mean_squared_error(y_train, pred_tr)))
rmse_test = (np.sqrt(mean_squared_error(y_test, pred_test)))

print('RMS of Train data : ', rmse_tr)
print('RMS of Test data : ', rmse_test)

# RMS of Train data :  4.642806069019824
# RMS of Test data :  4.9313525841467

3) 성능 확인

plt.scatter(y_test, pred_test)
plt.xlabel('Actual House Prices ($1000)')
plt.ylabel('Predicted Price')
plt.title('Real vs Predicted')
plt.plot([0,48], [0,48], 'r')
plt.show()

4) LSTAT를 사용하는것이 맞는 지 의문이 들어 제외하고 테스트 진행

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import numpy as np
from sklearn.metrics import mean_squared_error

X= boston_pd.drop(['PRICE', 'LSTAT'], axis = 1)
y = boston_pd['PRICE']

X_train, X_test, y_train, y_test = train_test_split(
	X,y, test_size=0.2, random_state=13
    )

reg = LinearRegression()
reg.fit(X_train, y_train)

pred_tr = reg.predict(X_train)
pred_test = reg.predict(X_test)

rmse_tr = (np.sqrt(mean_squared_error(y_train, pred_tr)))
rmse_test = (np.sqrt(mean_squared_error(y_test, pred_test)))

print('RMS of Train data : ', rmse_tr)
print('RMS of Test data : ', rmse_test)

# RMS of Train data :  5.165137874244864
# RMS of Test data :  5.295595032597162
  • 성능이 나빠졌다.
  • 계속 고민이 필요해 보인다
plt.scatter(y_test, pred_test)
plt.xlabel('Actual House Prices ($1000)')
plt.ylabel('Predicted Price')
plt.title('Real vs Predicted')
plt.plot([0,48], [0,48], 'r')
plt.show()

profile
스터디 노트

0개의 댓글