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 = (20, 20)) plt.show() | cs |
dummy변수 생성
1 2 3 4 5 6 7 8 9 10 | data_log["view_class"] = np.where(data_log["view"] >=1, 1,0) data_log["basement_class"] = np.where(data_log["sqft_basement"] >=1, 1,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 | X = data_log_dummy.drop(["id","price","date","sqft_basement","yr_built", "zipcode","long","date_year", "date_month","per_price","is_renovated"],axis=1) # feature y = 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 // 계산에 사용할 작업 수
- Parameters
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 // 이전 호출의 솔루션을 재사용하여 앙상블에 더 많은 견적을 추가할지 여부
- Parameters
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를 지정
- Parameters
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를 지정
- Parameters
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]: 난수 발생
- Parameters
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]: 최대 반복 횟수
- Parameters
모델별 성능 비교(튜닝 파라미터 = 기본값)
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.0001, 0.001, 0.01, 0.1, 1, 10]} fig, axes = plt.subplots(1, 1, figsize=(15, 10)) 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(6, 6) # 교차 검증 평균 점수의 히트맵 그래프 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 | C = np.arange(100, 500, 20) 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 | C = np.arange(350, 380, 1) 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 |



































댓글
댓글 쓰기