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로 정리, 확인
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()