# 최종 분석 프로젝트 제작 기간 (19.06.20 ~ 19.06.30) 10일

# 최종 분석 프로젝트 발표 : 19.07.01

# 주제 : KAGGLE 주택 가격 예측

 

@ 표지, 목차

@ 데이터 전처리

데이터 전처리에 앞서 이 분석의 최종 목표는 왼쪽의 다양한 독립변수들로

종속변수인 주택가격을 더 정확하게 예측하는것 입니다

데이터 모델을 만들 TRAIN데이터와 값을 예측하기위한 TEST데이터 파일로 나누어져 있습니다.

TRAIN 데이터는 80개의 독립변수와 1개의 종속변수로 이루어져 있고

TEST는 종속변수가 없어 80개의 독립변수만으로 이루어져 있습니다.

데이터를 전처리하기 전에 TRAIN데이터와 TEST데이터를 합쳐 T_DATA라는 변수로 만들었습니다.

다음은 결측값이 있는 변수들은 나타낸 표와 그래프 입니다.

각 변수 특성에 맞도록 결측값을 대체하기 위해 시간을 많이 소요했던 구간입니다.

먼저 종속변수인 SalePrice 데이터가 왼쪽으로 편향되어 있어 로그변환을 통해 정규화를 시켜 주었습니다.

다음은 lotfrontage와 neighborhood의 변수의 처리과정입니다.

lotfrontage의 뜻은 집에서 근처 지역 및 건물까지의 거리이고, neighborhood의 뜻은 근처 지역 및 건물을 의미합니다.

다시말하면 lotfrontage는 집에서 neighborhood까지의 거리라고 볼 수 있습니다.

저희는 lotfrontage의 결측값을 무엇으로 채워야 할지 고민을 하다.

오른쪽의 상자 그래프 처럼 neighborhood의 각 요소들 별 이상치들이 많은 것을 보고

neighborhood의 중앙값으로 결측값을 대체하는 것이 좋다고 판단했습니다.

다음 변수들에 대해서는 결측치를 0으로 대체하였습니다.

그 이유는 각 요소들의 변수 설명을 보면 석조 베니어가 없는 주택들이 결측치로 되어있습니다.

또한 차고가 없는 주택들도 결측치로 되어있어 결측치는 0이 맞다고 판단하였습니다.

다음은 서열형 변수들의 결측치 처리 과정입니다.

각 변수들의 요소이름을 뽑아서 먼저 팩터형태로 바꾸고 다시 수치형으로 바꾼다음

서열화해서 NA를 제일 작은 값으로 대체를 하였습니다.

변수들 중 Utilities변수는 위와 같이 1개의 데이터만 다른 값으로 나와

영향력이 없을 것이라 판단하여 제거 하였습니다.

그 다음 변수들의 결측값들을 최빈값으로 대체하였습니다.

전기 시스템같은 경우 보통 주택에 전기를 사용하지 않는 주택은 없기 때문에

최빈값으로 대체 하는 것이 맞다고 판단하였습니다.

다음은 범주형 변수들에 대한 더미화를 하였습니다.

더미화는 각 변수의 요소들을 범주형 변수로는 사용할 수 없고

연속형 변수로만 가능한 분석기법을 사용하기 위해서 범주형 변수들을 수치화로 더미화 시켰습니다.

다음은 수치형 변수들에 대한 정규화를 했습니다.

위에 표는 수치형 변수들중 절대값 편향성이 0.75가 넘는 변수들만 뽑았습니다.

이 변수들에 대해 람다 값을 0.15만큼 주어 대부분의 데이터가 정규화되도록 만들었습니다.

물론 몇몇 데이터가 잘 바뀌지 않았지만 여러번 해서 실행을 해봤을때 0.15가 적합하다고 판단하여

처리하게 되었습니다.

이제 다음 과정에서 소개할 모델들을 만들기 위해서

앞서 했던 모든 데이터 전처리 과정을 통해 나온 결과물을 다시 처음 상태였던

train데이터와 test데이터 셋으로 나누었습니다.

train데이터를 통해 모델을 만들고 test의 종속변수를 예측하는 과정을 소개해드리겠습니다.

 

@ 모델 소개

모델 소개에 앞서 만들었던 train 데이터를 또 한번 7:3 비율로 만들었습니다.

그 이유는 앞서 보았듯이 test에 대한 종속변수가 없어 예측력을 측정을 할 수 없었기 때문입니다.

그래서 train데이터의 7의 데이터로 3을 예측할 때

RMSE 평균 제곱근 오차가 최소가 되는 모델들을 찾고자 여러 분석 모델들을 사용해 보았고

총 3개의 모델들을 최종적으로 골라서 앙상블을 진행하였습니다.

첫번째 모델은 LASSO라는 모델로 선형 회귀분석 방법이며

다수의 독립변수가 있는 데이터 분석에 적합하여 선택하게 되었습니다.

직역하자면 회귀분석을 하게 되면 각 변수에 오차가 생기는데

그 오차의 절대값이 최소가 되게 하는 변수 선택법이라고 말할 수 있습니다.

다음 그래프의 X축을 보면 함수 내에서 자체적으로 lambda값을 미세하게 주면서

RMSE가 최소로 나오는 값을 선택하게 됩니다.

컴퓨터는 왼쪽선의 lamda값을 선택하면서 총 220개의 독립변수 중 64개의 변수를 선택하여

회귀분석을 자동으로 진행하였습니다.

위의 lambda.min으로 모델을 만들게 되면 RMSE가 밑에 값과 같이 나오게 됩니다.

중간의 1se라는 람다값은 최소값에 대해서 1 – 편차오류 룰이 적용된 lambda값 입니다.

두 값 모두 각각 넣어봤지만 lamda.min값이 예측력이 더 좋게 나와 사용했습니다.

두번째로 사용한 모델은 그라디안 부스팅 머신 입니다.

그라디안 부스팅 머신은 의사결정나무를 여러 개 만든 뒤 각각 나무에 대한 예측력을 측정하고

약한 모델에는 패널티를 주어 강한 모델을 만드는 분석방법입니다.

다음 그래프는 나무의 개수가 증가하면서 나타나는 RMSE를 나무의 깊이 별로 나타낸 그래프 입니다.

컴퓨터는 자동적으로 튜닝을하여 가장 좋게 나온 튜닝값으로는

나무의 개수는 200개, 나무의 깊이는 5로 측정되어 진행하였습니다.

이때 나오는 RMSE는 0.1289491 값이 나왔습니다

세번째 모델은 xgb로 두번째 모델이었던 그라디안 부스팅의 상위 버전 입니다.

그라디안 부스팅과 비슷한 면이 있지만 더 빠르고 좀 더 예측력 좋은 모델입니다.

다음 그래프는 반복횟수가 증가하면서 나타나는 rmse를 학습률 별로 나눈 그래프 입니다.

학습률은 높을 수록 과소적합 위험이 있고 낮을 수록 과대적합 위험이 있습니다.

일정한 범위 내에서 튜닝값을 돌려보니 학습률은 0.01이 가장 적당하다고 측정되어 사용 하였습니다.

다음은 3개의 모델을 결합하는 방식입니다.

밑에 실패 사례에서 소개 해드리겠지만 RMSE를 통한 예측값에 가중치를 주어 최종 예측치를 나타내었습니다.

여러 가중치를 시도하여 최종적으로 나온 가중치는 라소에 0.6, 그라디안에 0.16, xgb에 0.24를 주었습니다.

최종 결과값은 이전 전처리 과정에서 종속변수에 로그변환을 해주었기 때문에

역 로그 변환을 하여 최종 주택 가격 예측값을 출력하여 kaggle에 제출하였습니다.

밑에 보이는 캡쳐는 위의 결과로 얻은 순위이며 약 4600개의 팀중에 1085위를 달성하였습니다.

 

@ 실패 사례

다음은 프로젝트를 진행 하면서 겪은 실패 사례 3개를 보여드리겠습니다.

첫번째 실패 사례로는 모델들을 만들고 앙상블을 사용하는 과정에서 나타난 실패 사례입니다.

밑에 단순 앙상블은 앞서 각각의 모델들을 통해 도출해낸 RMSE를 비율화 시켜 결과 값에 가중치를 부여한 것입니다.

위에 앙상블은 약간의 파라미터 값들을 주어 시도해본 앙상블 함수 입니다.

원래 계획은 위에 있는 파라미터들을 조정하여 더 좋은 앙상블 모델을 만들고 싶었지만

단순 앙상블보다 더 좋은 결과값을 얻지 못하여 단순 앙상블을 쓰게 되었습니다.

두번째 실패 사례 입니다.

몇몇 모델들을 만들기 위해서는 범주형태의 데이터는 더미화를 시켜주어야만 했습니다.

변수들이 너무 많아 처음에는 방법을 몰라 왼쪽처럼 변수를 일일이 작성하였습니다.

하지만 분석 도중 여러 값들을 조정함에 있어서 불편함을 느꼈고

몇 가지 규칙성을 통해 반복문과 조건문으로 더미화를 간략화 하였습니다.

세번째 실패 사례입니다.

수치형 변수들 또한 여러 문제가 있었습니다.

일단 각각 결측값들이 너무 많았고 이러한 결측값들을 처음에는 각 변수들의 특성을 몰라

0 또는 평균으로 대체했었습니다.

결과적으로 RMSE가 너무 높게 나오는 것을 확인하였고

다시 한번 각 변수들의 설명을 확인하고 각각 변수의 결측값들을 특성에 맞도록 대체하였습니다.

+ Recent posts