House Price Prediction(Machine learning)


필요한 변수를 생성 및 보완하여 모델링을 할 때 적용하여 정확도를 높이는 방향으로 진행해 보았습니다. 모델리은 RandomForest, LinearRegression, Ridge, Lasso, ElasticNet, SVR을 이용하여 회귀분석을 진행하였습니다.

 데이터 전처리 및 특성 변환

데이터 전처리 진행 방향

사용한 모듈 정의 -> 변수 생성 -> 스케일 조정 -> 더미 변수 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd 
import numpy as np
import sklearn     
import mglearn  
import seaborn as sns 
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
from sklearn.pipeline import Pipeline
from sklearn.pipeline import make_pipeline
cs

데이터 불러오기

1
data = pd.read_csv("../2019-2nd-ml-month-with-kakr/train.csv")
cs

데이터 타입 및 결측치 확인
1
data.info()
cs





























필요한 부분만 추출 후 변수생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data['date'= data['date'].apply(lambda x: x[0:8]) # 날짜 8자리 추출
data['date_year'= data['date'].apply(lambda x: x[0:4]).astype('int64'# 년도 추출
data['date_month'= data['date'].apply(lambda x: x[4:6]).astype('int64'# 월 추출
 
data['total_rooms'= data['bedrooms'+ data['bathrooms'# 침실의 수(bedrooms) + 화장실의 수(bathrooms)
data['sqft_total_size'= data['sqft_above'+ data['sqft_basement'# 지하실을 제외한 평방 피트(sqft_above) + 지하실의 평방 피트(sqft_basement)
data['per_price'= data["price"/ data['sqft_total_size'# 집의 가격(per_price) / sqft_total_size
 
years = data['date'].map(lambda x: int(x[:4]))
data['house_age'= years - data['yr_renovated'].astype('int'# 재건축 되지 않은 경우 : 거래년도(yyyy) - 건축년도(yr_built) / 재건축 된 경우 : 거래년도(yyyy) - 재건축년도(yr_renovated)
data['yr_renovated'= data['yr_renovated'].apply(lambda x: np.nan if x == 0 else x)
data['yr_renovated'= data['yr_renovated'].fillna(data['yr_built'])
data['is_renovated'= data['yr_renovated'- data['yr_built']
data['is_renovated'= data['is_renovated'].apply(lambda x: 0 if x == 0 else 1# 재건축 되지 않은 경우 : 1 / 재건축 된 경우 : 0
boolvec = data['is_renovated'== 0
data['house_age'][boolvec] = years - data['yr_built']
cs

한쪽으로 치우쳐져있는 데이터에 대해 log를 사용하여 정규분포화

1
2
3
4
5
data_log = data.copy() #데이터 복사
 
skew_columns = ['sqft_living''sqft_above''sqft_basement''lat''sqft_living15''price']
for c in skew_columns:
    data_log[c] = np.log1p(data_log[c].values)
cs

histogram

1
2
data_log.drop("id", axis = 1).hist(bins = 40, figsize = (2020))
plt.show()
cs



























dummy변수 생성

1
2
3
4
5
6
7
8
9
10
data_log["view_class"= np.where(data_log["view">=11,0)
data_log["basement_class"= np.where(data_log["sqft_basement">=11,0)
 
data_log['date_month'= data_log["date_month"].astype('str')
data_log['date_year'= data_log["date_year"].astype('str')
data_log['zipcode'= data_log["zipcode"].astype('str')
 
dummy_data = data_log[["date_month","date_year","zipcode"]]
dummy_col=pd.get_dummies(dummy_data)
dummy_col
cs

















연속형이 아닌 'date_month', 'date_year', 'zipcode' 데이터들에 대해 객체타입을 문자형으로 바꿔주고 get_dummies함수를 사용해 dummy변수들을 생성
제대로된 측정을 위해 명목형 변수('date_month', 'date_year', 'zipcode')를 dummy변수로 만들어, 연속형이 아닌 dummy변수로 사용한다.

데이터에 dummy변수 추가

1
data_log_dummy=pd.concat([data_log, dummy_col],axis=1)
cs

상관관계 heatmap(더미변수 제외)

1
2
3
plt.figure(figsize=(15,15))
sns.heatmap(data = data_log.corr(), annot=True
fmt = '.2f', linewidths=.5, cmap='Blues')
cs



























  • 상관 분석 또는 '상관관계' 또는 '상관'은 확률론과 통계학에서 두 변수간에 어떤 선형적 또는 비선형적 관계를 갖고 있는 지를 분석하는 방법이다. 두변수는 서로 독립적인 관계이거나 상관된 관계일 수 있으며 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 한다. 상관분석에서는 상관관계의 정도를 나타내는 단위로 모상관계수로 ρ를 사용하며 표본 상관 계수로 r 을 사용한다.
  • 결과의 해석
    • r이 -1.0과 -0.7 사이이면, 강한 음적 선형관계,
    • r이 -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계,
    • r이 -0.3과 -0.1 사이이면, 약한 음적 선형관계,
    • r이 -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계,
    • r이 +0.1과 +0.3 사이이면, 약한 양적 선형관계,
    • r이 +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계,
    • r이 +0.7과 +1.0 사이이면, 강한 양적 선형관계

훈련데이터와 테스트 데이터로 나누어 모델 생성

1
2
3
4
5
= data_log_dummy.drop(["id","price","date","sqft_basement","yr_built",
                         "zipcode","long","date_year",
                         "date_month","per_price","is_renovated"],axis=1# feature
= data_log_dummy['price'# target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2020, test_size = 0.4# 6(train) 대 4(test) 비율로 split
cs

스케일링

1
2
3
robuscaler = RobustScaler()
X_train_robu = robuscaler.fit_transform(X_train) # 특성 추출, 선택하여 학습
X_test_robu = robuscaler.transform(X_test) # test 데이터에 대해선 특성 추출, 선택만 진행
cs

  • RobustScaler(): 중앙값을 제거하고 Quantile 범위(기본값은 IQR : Interquartile Range)에 따라 데이터를 스케일링합니다.

모델별 설명

LinearRegression

  • 최소 제곱 선형 회귀 기법
  • 데이터를 놓고 데이터를 가장 잘 설명 할 수 있는 선(line)을 찾는 분석 기법
  • 모든 데이터로부터 나타나는 오차의 평균을 최소화 할 수 있는 최적의 기울기와 절편을 찾는 기법
    • Parameters
      • fit_intercept:bool, default=True // 모델의 절편을 계산할지 여부
      • normalize:bool, default=False // 매개 변수가 fit_interceptFalse로 설정 되면 무시. True인 경우 회귀 X는 평균을 빼고 l2-norm으로 나누어 회귀 전에 정규화
      • n_jobs:int, default=None // 계산에 사용할 작업 수

RandomForest

  • 다수의 결정트리를 이용하여 회귀 결과를 취합해 결론을 얻는 분석 기법
  • 결정트리의 단점인 overfiting을 방지할 수 있고, 최적의 기준 변수를 선택하는 머신러닝 기법
    • Parameters
      • n_estimatorsint, default=100 // tree 갯수 설정
      • max_depth:int, default=None // tree의 최대 깊이
      • n_jobs:int, default=None // 사용할 core 수 설정
      • random_state:int or RandomState, default=None // random seed를 지정
      • warm_start:bool, default=False // 이전 호출의 솔루션을 재사용하여 앙상블에 더 많은 견적을 추가할지 여부

Ridge

  • L2 정규화를 갖는 선형 최소 제곱 기법
  • 가중치를 0에 가깝게 만들어, 과대적합이 되지 않도록 만들고, 모델을 단순하게 만듬
    • Parameters
      • alpha:{float, ndarray of shape (n_targets,)}, default=1.0 // 정규화 강도
      • fit_intercept:bool, default=True // 모델의 절편 맞출지 여부
      • normalize:bool, default=False // 매개 변수가 fit_interceptFalse로 설정 되면 무시. True인 경우 회귀 X는 평균을 빼고 l2-norm으로 나누어 회귀 전에 정규화
      • max_iter:int, default=None // conjugate gradient solver 최대 반복 횟수
      • random_state:int, RandomState instance, default=None // random seed를 지정

Lasso

  • L1 정규화로 훈련 된 선형 모델 기법
  • 특성 선택이 자동으로 이루어지고, 가중치를 0으로 만들어 특성이 제외되는 경우도 생김
    • Parameters
      • alpha:float, default=1.0 // 정규화 강도
      • fit_intercept:bool, default=True // 모델의 절편 계산할지 여부
      • normalize:bool, default=False // 매개 변수가 fit_interceptFalse로 설정 되면 무시. True인 경우 회귀 X는 평균을 빼고 l2-norm으로 나누어 회귀 전에 정규화
      • max_iter:int, default=1000 // 최대 반복 횟수
      • random_stat:int, RandomState instance, default=None // random seed를 지정

ElasticNet

  • 가중치 절대값의 합과 제곱합을 동시에 제약 조건으로 가지는 모형
  • L2 규제와 L1 규제를 결합한 회귀로 Ridge와 Lasso의 하이브리드 모델
    • Parameters
      • alpha:[float, default=1.0]: 규제 조건에 곱하는 상수
      • l1_ratio:[float, default=0.5]: ElasticNet 혼합 파라미터, 0 <= l1_ratio <= 1> -l1_ratio = 0의 경우 L2 규제 -l1_ratio = 1의 경우 L1 규제 -0 < l1_ratio < 1>의 경우 규제는 L1과 L2의 조합
      • fit_intercept:[bool, default=True]: 절편을 추정해야 하는지 여부
      • max_iter:[int, default=1000]: 최대 반복 횟수
      • random_state:[int, RandomState instance, default=None]: 난수 발생

SVR

  • SVM(Support Vector Machine)의 방법 중 회귀(regression)를 위한 모델
  • Support Vector란 두 클래스 사의 경계에 위치한 데이터 포인트들을 지칭
    • Parameters
      • kernel:[default='rbf']: 알고리즘에 사용될 커널 유형을 지정한다. 그 종류로 {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}가 있다
      • degree:[int, default=3]: polynomial kernel 함수의 정도
      • gamma:[{'scale', 'auto'} or float, default='scale']: 가우시안 커널 폭을 제어하는 매개변수
      • C:[float, default=1.0]: 정규화 매개변수
      • epsilon:[float, default=0.1]: train data instance당 얼마나 많은 오류를 허용할지 여부
      • max_iter:[int, default=-1]: 최대 반복 횟수

모델별 성능 비교(튜닝 파라미터 = 기본값)

LinearRegression

정확도

1
2
3
4
5
linear = LinearRegression()
 
linear.fit(X_train_robu,y_train)
print("훈련 세트 정확도 : {:.3f}".format(linear.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(linear.score(X_test_robu,y_test)))
cs





예측값

1
2
pred_linear = linear.predict(X_test_robu)
pred_linear
cs




실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_linear+1))
cs




손실함수값

1
2
linear_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_linear)))
print(linear_rmse)
cs




테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_linear+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs












정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_linear,ax=ax2,bins=50)
ax2.set(title="predict price")
cs












RandomForest

정확도

1
2
3
4
5
forest = RandomForestRegressor(random_state=0)
 
forest.fit(X_train_robu,y_train)
print("훈련 세트 정확도 : {:.3f}".format(forest.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(forest.score(X_test_robu,y_test)))
cs



예측값

1
2
pred_forest = forest.predict(X_test_robu)
pred_forest
cs



실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_forest+1))
cs



손실함수값

1
2
forest_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_forest)))
print(forest_rmse)
cs



테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_forest+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs










정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_forest,ax=ax2,bins=50)
ax2.set(title="predict price")
cs











Ridge

정확도

1
2
3
4
5
ridge = Ridge(random_state=0)
 
ridge.fit(X_train_robu,y_train)
print("훈련 세트 정확도 : {:.3f}".format(ridge.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(ridge.score(X_test_robu,y_test)))
cs




예측값

1
2
pred_ridge = ridge.predict(X_test_robu)
pred_ridge
cs




실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_ridge+1))
cs



손실함수값

1
2
ridge_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_ridge)))
print(ridge_rmse)
cs




테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_ridge+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs










정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_ridge,ax=ax2,bins=50)
ax2.set(title="predict price")
cs










Lasso

정확도

1
2
3
4
5
6
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01, random_state=0)
 
lasso.fit(X_train_robu, y_train)
print("훈련 세트 정확도 : {:.3f}".format(lasso.score(X_train_robu, y_train)))
print("테스트 세트 정확도 : {:.3f}".format(lasso.score(X_test_robu, y_test)))
cs




예측값

1
2
pred_lasso = lasso.predict(X_test_robu)
pred_lasso
cs




실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_lasso+1))
cs



손실함수값

1
2
lasso_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_lasso)))
print(lasso_rmse)
cs




테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_lasso+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs










정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_lasso,ax=ax2,bins=50)
ax2.set(title="predict price")
cs










ElasticNet

정확도

1
2
3
4
5
elastic = ElasticNet(alpha=0.01,random_state=0)
 
elastic.fit(X_train_robu,y_train)
print("훈련 세트 정확도 : {:.3f}".format(elastic.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(elastic.score(X_test_robu,y_test)))
cs



예측값

1
2
pred_elastic = elastic.predict(X_test_robu)
pred_elastic
cs



실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_elastic+1))
cs



손실함수값

1
2
elastic_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_elastic)))
print(elastic_rmse)
cs



테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_elastic+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs












정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_elastic,ax=ax2,bins=50)
ax2.set(title="predict price")
cs











SVR

정확도

1
2
3
4
svr = svm.SVR()
svr.fit(X_train_robu, y_train)
print("훈련 세트 정확도 : {:.3f}".format(svr.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(svr.score(X_test_robu,y_test)))
cs




예측값

1
2
pred_svr = svr.predict(X_test_robu)
pred_svr
cs



실제값의 정확도

1
2
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_svr+1))
cs



손실함수값

1
2
svr_rmse = np.sqrt(mean_squared_error(np.exp(y_test), np.exp(pred_svr)))
print(svr_rmse)
cs



테스트값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_svr+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs









정규분포한 테스트 값과 예측한 실제값 비교

1
2
3
4
5
6
7
import seaborn as sns
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_svr,ax=ax2,bins=50)
ax2.set(title="predict price")
cs










모델별 성능 비교(튜닝 파라미터 = GridSearch사용)

LinearRegression
Pipeline정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression',LinearRegression())])
cs

parameter_grid 정의

1
2
3
param_grid = [{'Regression' : [LinearRegression()],
               'featureGen': [PolynomialFeatures()],
               'featureGen__degree': [1, 2, 3]}]
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
cs







RandomForest

Pipeline정의

1
pipe = Pipeline([('Regression', RandomForestRegressor())])
cs

parameter_grid 정의

1
2
3
param_grid = [{'Regression': [RandomForestRegressor()],
               'Regression__n_estimators': [400, 500, 600],
               'Regression__max_depth': [30, 40, 50]}]
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
cs










Ridge

Pipeline정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression', Ridge())])
cs

parameter_grid 정의

1
2
3
4
param_grid = {'Regression': [Ridge()],
              'Regression__alpha': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100],
              'featureGen': [PolynomialFeatures()],
              'featureGen__degree': [1, 2, 3]}
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid=param_grid, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최상의 교차 검증 정확도: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
print("최적의 매개변수:", grid.best_params_)
cs









Lasso

Pipeline정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression', Lasso())])
cs

parameter_grid 정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression', Lasso())])
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
cs









ElasticNet

Pipeline정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression',ElasticNet())])
cs

parameter_grid 정의

1
2
pipe = Pipeline([('featureGen',PolynomialFeatures()),
                 ('Regression',ElasticNet())])
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
cs










SVR

Pipeline정의

1
pipe = Pipeline([('Regression', SVR())])
cs

parameter_grid 정의

1
2
3
param_grid = [{'Regression': [SVR()],
               'Regression__gamma': [0.001, 0.001, 0.01],
               'Regression__C': [100, 200, 300]}]
cs

GridSearch를 통한 데이터셋 실행

1
2
3
4
5
6
7
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train_robu, y_train)
 
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.3f}".format(grid.best_score_))
print("훈련 세트 점수: {:.3f}".format(grid.score(X_train_robu, y_train)))
print("테스트 세트 점수: {:.3f}".format(grid.score(X_test_robu, y_test)))
cs










base모델 선정

  • GridSearchCV를 통해 6개의 모델 중, SVR이 가장 좋은 값을 출력하여, base 모델로 선정
base모델이란?
  • 데이터의 특징에 맞는 적절한 성능의 분류기
  • base 모델의 성능(score)는 목표 성능이다.
  • 향후 개선 모델은 이 성능 이상을 발휘 해야한다.

heatmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
param_grid = {'C': [100,200,300,350,400,500],
              'gamma': [0.00010.0010.010.1110]}
 
fig, axes = plt.subplots(11, figsize=(1510))
 
grid_search = GridSearchCV(SVR(), param_grid, cv=5, n_jobs=-1)
grid_search.fit(X_train_robu, y_train)
scores = grid_search.cv_results_['mean_test_score'].reshape(66)
 
    # 교차 검증 평균 점수의 히트맵 그래프
scores_image = mglearn.tools.heatmap(
    scores, xlabel='gamma', ylabel='C', xticklabels=param_grid['gamma'],
    yticklabels=param_grid['C'], cmap="viridis", ax=axes)
    
plt.colorbar(scores_image)
cs




















  • 시각적 가독성을 위해 SVR 모델의 C(cost)와 gamma 값별 중요도를 히트맵으로도 그려 확인해 본다.
  • 위의 히트맵을 확인했을 때, SVR 모델에서 gamma가 0.001일때 가장 좋은 값을 출력해준다.
  • C의 큰 상관성을 확인하기 어려워, 자세한 C값을 확인하기 위해 아래와 같이 line그래프를 그려보았다.

score별 C line 그래프 그리기

1
2
3
4
5
6
7
8
9
10
11
= np.arange(10050020)
scores_test = []
for n in C:
    svr.set_params(gamma=0.001)
    svr.set_params(C=n)
    svr.fit(X_train_robu, y_train)
    scores_test.append(svr.score(X_test_robu, y_test))
plt.title("Effect of C")
plt.xlabel("C")
plt.ylabel("score")
plt.plot(C, scores_test)
cs















  • gamma가 0.001 일때, score별 C값의 분포를 line그래프를 통하여 최적의 C값 범위를 찾는다.
  • 가장 높은 score의 C값은 350 ~ 400사이의 값임을 확인해 볼 수 있다.

가장 높은 score

1
max(scores_test)
cs




1
2
3
4
5
6
7
8
9
10
11
12
= np.arange(3503801)
scores_test = []
scores_train = []
for n in C:
    svr.set_params(gamma=0.001)
    svr.set_params(C=n)
    svr.fit(X_train_robu, y_train)
    scores_test.append(svr.score(X_test_robu, y_test))
plt.title("Effect of n_estimators")
plt.xlabel("n_estimator")
plt.ylabel("score")
plt.plot(C, scores_test)
cs















  • C값의 범위를 좀더 세분화 하여 최적의 C값을 찾는다.
  • 'C = 365'가 가장 높은 score를 보여주고 있다.

base모델로 최적의 매개변수 설정하여 머신러닝 실행

1
2
3
4
svr = svm.SVR(C=365, gamma=0.001)
svr.fit(X_train_robu, y_train)
print("훈련 세트 정확도 : {:.3f}".format(svr.score(X_train_robu,y_train)))
print("테스트 세트 정확도 : {:.3f}".format(svr.score(X_test_robu,y_test)))
cs




base모델 데이터의 예측값 출력

1
2
pred_svr = svr.predict(X_test_robu)
pred_svr
cs




예측한 price와 실제 price출력 비교(15개)

1
2
3
4
5
pred_df=round(pd.DataFrame(np.expm1(pred_svr)).head(15),-1)
test_df=pd.DataFrame(np.array(np.expm1(y_test))).head(15)
df=pd.concat([pred_df, test_df],axis=1)
df.columns =["예측값","실제값"]
df
cs
























실제 price값과 예측값의 점수 출력

1
2
3
from sklearn.metrics import r2_score
r2_score(np.exp(y_test+1), np.exp(pred_svr+1))
print("실제 price값과 예측값의 점수 : {:.3f}".format(r2_score(np.exp(y_test+1), np.exp(pred_svr+1))))
cs


base모델 데이터에 대한 손실함수값 출력

1
2
svr_rmse = np.sqrt(mean_squared_error(np.expm1(y_test), np.expm1(pred_svr)))
print(svr_rmse)
cs



base모델 테스트 값과 예측한 실제값을 비교

1
2
3
4
5
6
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(np.exp(y_test+1),ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(np.exp(pred_svr+1),ax=ax2,bins=50)
ax2.set(title="predict price")
cs










base모델 정규분포한 테스트 값과 예측한 실제값을 비교

1
2
3
4
5
6
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(16,5)
sns.distplot(y_test,ax=ax1,bins=50)
ax1.set(title="test price")
sns.distplot(pred_svr,ax=ax2,bins=50)
ax2.set(title="predict price")
cs



댓글

이 블로그의 인기 게시물

SQL(9)(performance tuning queries, pivoting data)

데이터 크롤링(3주차)

SQL(8)(writing subqueries, window functions)