들어가는 말
이번 글에서는 Dean De Cock가 Kaggle에 공개한 데이터셋을 사용하여 미국 아이오와의 부동산 가격 예측 모델을 구축해 보도록 하겠습니다. 이 데이터 셋은 주택의 가격에 영향을 미치리라 생각되는 설명변수 79개로 구성되어 있으며 이 프로젝트의 주요 목표는 다음과 같습니다.
· 탐색적 데이터 분석
· 데이터 정제
· 머신러닝을 위한 특징 생성
· 고급 회귀 분석
데이터 세트
트레이닝 데이터 세트는 1460개의 행과 81개의 열로 구성되어 있으며 80개의 특징과 1개의 타겟인 주택 가격으로 구성되어 있습니다. 테스트 데이터 세트는 1459개의 행과 81개의 열로 구성되어 있습니다.
트레이닝 데이터 세트는 다음의 그림과 같이 19개의 변수에 누락된 데이터가 존재하며, 테스트 데이터 세트에는 33개의 변수에 누락된 데이터가 있습니다. 각 변수들의 분포는 비슷합니다.
이번 분석에서는 타겟인 종속 변수의 분포, 특징을 설명하는 독립변수와 주택 가격인 종속 변수와의 관계에 중점을 두도록 하겠습니다. 다음의 그림은 주택 가격의 분포를 보여주고 있습니다. 보시다시피 정규분포와는 거리가 멀어 보입니다. ML모델(Machine Learning)의 예측률을 높이려면 데이터 변환이 필요해 보입니다.
다음의 그림을 보면 종속변수인 주택 가격과 독립변수인 OverallQual, GrLivArea가 높은 상관관계가 있음을 알 수 있습니다. 변수들간의 상관관계를 미리 확인하는 것은 모델링을 위해 매우 중요한 작업입니다.
변수들간의 관계를 좀더 알아보기 위해 다음의 그래프를 그렸습니다. 다음의 그래프를 보면 처리해야 할 아웃라이어가 몇몇개 보입니다.
또한 다음 그래프를 보면 OverallQual과 SalePrice가 양의 상관관계가 있음을 확인할 수 있습니다.
데이터 정제
결측치 처리
누락된 항목은 주택이 이 속성값을 갖고 있지 않기 때문에 생긴것 입니다. 예를들면 차고, 지하실, 수영장, 울타리, 골목과 같은 항목입니다. 변수가 숫자값일 경우 0으로 대체하고 범주 값인 경우 '없음'으로 대체하면 됩니다. LotFrontage, masVnr과 같은 변수는 중간값으로 대체하였습니다.
독립 변수의 정규화
일부 독립 변수의 분포를 조정하기 위해 변수 값을 변환하여 변수의 분포가 정규 분포를 보이도록 조정하였습니다. 로그변환과 boxcox 변환 모두 좋아 보였으나 boxcox 변환을 선택하였습니다.
다음 두개의 그래프는 전환 전과 전환 후의 GrLivArea 변수의 Probability Plot 분포를 보여줍니다. 변수의 변환 전환 전에는 GrLivArea의 분포가 곡선 모양을 보여주지만 변환 후에는 직선 모양으로 바뀌었습니다.
아웃라이어
아웃라이어는 모델링에 큰 영향을 미칩니다. 결과 예측치를 왜곡하고 정확도가 떨어지게 됩니다. 이 문제를 해결하기 위해 주택가격과 높은 상관관계를 보이는 GrLivArea, OverallQual 등의 변수에 scipy.stats의 zscore 함수를 사용하였으며 zscore의 절대값이 3.5 이상인 4개의 아웃라이어를 제거하였습니다. 2개의 그룹으로 나누어 아웃라이어를 분석하였으며 하나의 그룹은 최대, 최소값 2개를, 나머지 그룹은 최대, 최소값 각각 2개씩, 총 4개를 전처리 하였습니다.
특징 정하기
1. 특징 삭제하기
Street, Utilities, ID 변수는 주택 가격과 관련이 없으므로 데이터 세트에서 삭제 하였습니다. 또한 PoolQC는 결측치가 너무 많아 삭제하는 것이 좋다고 판단했습니다.
2. 범주형 값으로 변환
몇몇 변수는 원래 선형인 변수 값을 범주형 값으로 변환하여 모델 정확도를 높였습니다. 그대로 선형값을 유지했다면 몇몇 데이터는 이상치 처럼 보였을 것입니다. 다음에 나열한 변수의 값을 선형에서 범주형 값으로 변환 하였습니다.
- 'KitchenAbvGr',
- 'TotRmsAbvGrd',
- 'BedroomAbvGr',
- 'GarageCars',
- 'HalfBath',
- 'BsmtHalfBath',
- 'FullBath',
- 'BsmtFullBath',
- 'Fireplaces'
이 변수들의 값 변환으로 49개의 변수는 범주형, 27개의 변수는 선형값을 갖게 되었습니다.
3. 특징을 생성 또는 통합
각각의 층에 대한 특징을 '총_특징'이라는 변수로 통합하고 각각의 화장실 특징 변수를 '화장실_특징'이라는 변수로 통합하였습니다. 또한 HaveFirePlace, HaveSecondFloor 등과 같은 새로운 변수를 생성하기도 하였습니다.
4. 범주형 더미 변수
선형회귀 모델링을 하기 위해서는 Panda의 get_dummies 함수를 사용하여 범주형 데이터값을 선형값으로 변환해야 합니다. 데이터를 변환한 결과 변수값이 49에서 309로 확장 되었으며 drop-most 기능을 사용하여 49개의 항목을 제거하고 6개의 아웃라이어를 제거 하였습니다.
모델링
Ridge 선형회귀
Lasso 선형회귀
ElasticNet 선형회귀
선형 회귀 모델로 Ridge, Lasso, ElasticNet 이 있습니다. 선형 회귀 모델의 적용을 위해서는 범주형 변수는 더미 변수와 함께 선형변수로 변환해야 합니다. 전체 데이터 세트를 트레이닝 데이터 세트 80%, 테스트 데이터 세트 20%로 나눠서 모델링과 검증을 하였습니다.
Ridge와 Lasso 선형회귀 모델링에 필요한 하이퍼 파라미터는 한개 입니다. ElasticNet 선형회귀는 1개의 하이퍼 파라미터 외에 추가로 1개의 파라미터를 더 필요로 하기 때문에 모델링에 좀 더 많은 시간이 필요합니다.
Sklearn의 그리드 검색 기능인 GridSearchCV는 매개 변수의 단계와 범위를 지정하고 폴드 수를 5로 설정할 수 있는 편리한 기능입니다. 그리드 검색 기능을 사용하면 전체 데이터의 80%를 트레이닝 세트로 사용하는데 이 80%중 4/5의 데이터를 사용하여 모델링을 하고 나머지 1/5의 데이터로 검증을 합니다. 그런 다음 전체 데이터의 80%인 트레이닝 세트 데이터를 이용하여 모델을 수정합니다. 이렇게 만들어진 모델과 나머지 20%의 데이터로 다시한번 검증을 합니다.
서포트 벡터 머신
랜덤 포레스트
그라디언트 부스팅
XGBoost
이 모델은 모두 비선형 모델이며 더미 변수로 변수를 선형화 하는 전처리 작업이 필요하지 않습니다. 그러나 문자형의 범주형 데이터는 Sklearn LableEncoder로 레이블이 인코딩 되어 있어야 합니다. 선형회귀 모델링과 같이 전체 데이터 세트를 트레이닝 세트 데이터를 80%, 테스트 데이터 세트를 20%로 나눕니다. 이 모델은 많은 하이퍼 파라미터가 있어 튜닝이 복잡합니다. 먼저, 1~3개 변수가 포함 되도록 2~4개의 그룹으로 그룹핑 하였습니다. 작거나 중요한 그룹부터 시작하여 단계적으로 범위를 넓히고, 다시 좁히고, 정교화 하면서 한번에 한 그룹씩 조정 작업을 진행했습니다. 매개 변수가 그룹 범위의 경계에 있으면 범위를 넓히고 다시 실행합니다.
작업을 하고 있는 그룹의 모든 매개 변수가 최적으로 선택되면 다음 그룹으로 이동하여 동일한 단계를 반복했습니다. 이 과정은 매우 지루하고 시간이 많이 소요됩니다. 각 모델링에 파라미터 값이 모두 조정되면 나머지 20%의 데이터 세트로 모델을 검정하는 작업을 진행하였습니다.
블렌딩 모델
위의 각 모델들에 가중치를 적용하여 혼합 모델을 만들 수 있습니다. 가중치는 상위 1%를 트레이닝 데이터 세트로 사용하였고 평균제곱오차를 결측 함수로 이용하였습니다.
결과
각 모델들을 정규 평균제곱오차(MSE) 값을 이용하여 비교해 보았습니다. 아래 표는 결측치를 제거했을 때의 정규 평균제곱오차(MSE) 입니다. 각 모델 모두 아웃라이어를 제거 했을 때 예측 값이 높게 나왔습니다.
선형 모델은 비선형 모델보다 안정적이며 예측 결과가 좋습니다. 정교한 특성값 조정도 필요하지 않으며 특성값이 모델의 예측 결과에 많은 영향을 주지는 않습니다.
특정치의 중요성
Ridge 선형회귀의 양의/음의 상관관계가 큰 순서대로 상위 20개 변수와 Gradient Boosting 모델에서 추출된 중요 변수 10개를 분석해 보았습니다.
분석 결과 생활 공간, 품질 및 건축 연도가 주택 판매 가격에 긍정적인 영향을 미친다는 것을 알 수 있습니다. 나쁜 동네 분위기, 에어컨 없음, 관리 부실 변수는 주택 판매 가격에 부정적인 영향을 미칩니다.
각 모델의 평균제곱오차(MSE) 값을 기준으로 가충치를 적용하여 결합모델을 만들었습니다. 각 모델의 요소를 조정하여 최적의 조합을 찾을 수 있었습니다.
요약
1. Ridge, Lasso, ElasticNet과 같은 선형 회귀 모델은 구현하고 모델을 수정하기 쉬우므로 종속변수 예측에 가장 적합합니다. 그러나 이 모델들은 아웃라이어의 영향을 쉽게 받습니다.
2. 랜덤 포레스트, 그라디언트 부스팅, XGBoost 모델은 아웃라이어의 영향을 덜 받지만 오버 피팅이 될 가능성이 높습니다.
3. 혼합 모델은 위의 두 문제를 최소화 하고 더 나은 예측을 할 수 있지만 올바른 가중치를 찾기가 매우 어렵습니다.
4. Boxcox 변환, 아웃라이어 제거와 같이 데이터 전처리는 정확한 모델링을 위해 매우 중요합니다.
보완해야 할 점
혼합 모델링을 하기 위해 사용한 상위 1% 데이터 뿐만 아니라 모델 스태킹도 살펴 보아야 할 것입니다. 가중 평균을 사용하여 혼합 모델링을 하는 경우 모델 집합을 조합 하여야 합니다. K-fold Cross Validation을 트레이닝 데이터 세트에 적용하여 가중치를 구하는 경우 동일한 Grid Search를 적용해야 합니다.
Comments