Kaggle - [House Prices] 집값 예측 모델링 후기
학교 동아리에서 데이터 분석, 머신러닝에 관심있는 사람들끼리 모여서 시작했다!
8주 정도에 걸쳐서 진행했다.
처음에는 한 달 동안은 네이버 부스트 코스를 통해서
파이썬을 이용한 기본적인 데이터 분석 방법들을 익혔다.
나는 심심해서 네이버 부스트 코스에 있던 모든 머신러닝 관련 수업을 들었던 상태였다.
그래서 팀원들에게 부스트 코스로 공부하자고 했다.
처음에는 이왕 프로젝트를 진행하는 김에 공모전에 도전해보자고 다들 얘기를 했었다.
그래서 전주시 빅데이터 공모전에, 세부 지역별 인구 피라미드 예측 모델을 설계하려고 했다.
주 2회 회의를 진행했다. 1번은 파이썬을 통해 라이브러리 등을 공부했던 내용을 공유하는 것이었고,
다른 회의에는 공부했던 내용을 기반으로
전주시에서 제공하는, 여러 기초 데이터들을 분석하고 시각화했다.
하지만 나 빼고는 다들 시각화나 데이터 처리 관련 경험이 한번도 없었고,,
(물론 나도 2~3주간 부스트 코스 몰아들으면서 이것저것 해본 것 밖에는 없지만!)
다들 학교를 다니면서 병행하는 프로젝트이다 보니, (나는 휴학..!) 버거워했다.
따로 논문 몇개를 읽어보고, 더 고민해봤는데,
공모전이라는 게 정해진 데이터가 없어서,
어떤 데이터를 어떻게 얻어서 사용할 것인가에 대한 회의도 필요하고,
만족할만한 결과를 내기까지는 기초적인 내용들로는 버겁겠다는 판단이 내려졌다.
그래서 캐글에서 제공하는 컴피티션에 참가하는 방향으로 회의에서 이야기를 꺼냈다.
일단 데이터 셋도 정해져 있어서, 이 부분에서도 시간을 많이 절약할 수 있고,
해당 데이터 셋에 대해 많은 사람들이 여러가지 분석 기법을 활발하게 공유하기 때문에,
시야를 넓힐 수 있는 자료가 많기 때문이었다.
그렇게 해서 집값 예측 컴피티션에 도전해보았다!!
팀원들 중에서도 특히 나와 마음이 잘 맞는 통계학과 친구가 한 명 있었다.
이유를 모른 채 어떤 일을 진행하는 걸 둘 다 굉장히 싫어했다.
그래서 주로 이론적인 타당성을 확보하면서 프로젝트를 진행하기로 했다.
예를 들어,
- 해당 feature를 사용하는게 맞는가?
- 해당 feature가 종속변수에 어떤 영향을 어떻게 미치는가?
- 독립변수들 간의 어떤 관계가 있는가?
- 선형회귀의 가정이 무엇이고, 왜 그런가?
- 그 가정을 만족했을 때의 결과와, 만족하지 않았을 때의 차이는 어떨까?
- 상관관계가 서로 높은 피쳐들을 제거해야만 하나? 어떤 기준으로?
- 다중 공선성이 높은 경우에는 어떻게 해야하는지..?
- 상관관계를 연속형 변수와 이산형 변수간 피어슨 상관계수로 측정하는 것이 유효한가?
등등 수많은 질문들을 쏟아내면서, 하나하나 작업을 했다.
너무 좋았다!!ㅋㅋㅋㅋㅋㅋㅋ
노션을 통해서 주차별로 작업을 했다. (노션 링크)
([동현 유] 라고 되어있는게 내가 한 부분이다,)
동아리 내에서 발표도 진행했었다. 발표도 내가 했다!! 뿌듯!! (발표 링크)
( 20분간 발표했다! 딱 20분 맞췄다. )
결과 발표도 동아리 내에서 진행 했었는데, 사실 여기에 조금 복잡한 에피소드가 있다...
간단히 결론만 말하면, 시험기간을 앞두고 발표준비를 다시 새롭게 해야됐다.
다들 안그래도 과제가 밀린 상황이었고,
동아리 회장단 측에서는 발표를 해달라고 부탁을 해와서,
마침 휴학 중이었던 내가, 하기로 했다.
그래서 발표도,, ppt도,,, 부득이 하게 내가 다 하게 되었다는,,!
발표를 체계적으로 청중이 알아듣기 쉽게 정리하다보니
나에게 더 잘 정리되는 과정이기도 했다.
>>기억에 남는 몇가지 아무렇게 정리!
1. 상관관계 확인
- 연속형 변수 => 피어슨 상관계수
- 이산형 변수 => rank를 기반으로 하는 spearman, kendall 상관계수
- 범주형 변수 => ANOVA
2. 다중공선성 확인
- 수치형 변수 => VIF
- 범주형 변수 => Cramer' V = 카이제곱 독립성 검정 / (자유도)
3. 선형 회귀의 5가지 가정
- Linearity
- Homoscedasticity
- Independence of Errors
- Multivariate Normality
- Linear Independence (Little Multicollinearity)
4. 이상치란?
: 해당 피쳐의 의미를 잘 담아내지 못하는 개별 데이터!!
5. 다중공선성 제거 방법
- 의미가 중복되는 피쳐들을 제거
- 의미가 비슷한 피쳐들을 합쳐서 새로운 피쳐들을 생성 (예, 1층 면적 + 2층 면적 = 총면적 )
- 다중공선성을 상쇄할 수 있는 기법을 사용 (이런게 있을거 같은데 잘 모르겠다. PCA? 특정 모델?)
>> 아쉬웠던 점 아무렇게 정리!!
- 발표할 때, 결과를 정리하는 것에만 너무 신경을 썼다. 처음 듣는 사람들 입장에서는 과정이 복잡하게 느껴질 것 같았기 때문이다. 하지만 우리가 어떤식으로 작업을 했는지를 (예, 각 피쳐별로 그래프를 그려보고 분석했던 과정들) 더 보여주었으면 청중이 데이터에 대한 이해를 더 잘 했을 것 같다. 발표하고 나서 곰곰히 생각해보니까, 청중은 데이터 자체에 대한 이해가 잘 안되서 추상적으로 느껴졌을 것 같았다.
- 피쳐 중요도를 트리 기반 모델에서 자체적으로 제공하는 것에만 의존했다. 더 공부할 시간이 부족한 게 아쉬웠다. 사실 이 부분을 알기 쉽게 파악하고 싶었는데 너무 답답했다. (선형회귀의 가정을 만족할 때와 그렇지 않을때의 결과를 비교하면서 쉽게 이해된 것과 비교된다.) 각 피쳐들이 서로 어떤 영향을 갖고, 그래서 결과에는 어떤 영향을 미치는지 시각적으로 파악하고 싶은데 아직은 어떻게 해야할지 모르겠다. 조금 찾아보니 LIME 이나 SHAP 이라고 하는게 있던데,, 더 공부해봐야겠다!!
- 단순 호기심에, PCA로도 해보고 싶다!! PCA를 진행하면, 다중공선성 문제가 해결되는지도 궁금하다.
- 주워 듣기로는 딥러닝 같이 계층을 깊게 만들면 다중공선성을 신경쓰지 않아도 된다고 하는데,,, 그런 기법들을 더 공부하고 싶다.
- 다중공선선이 높다고 무조건 제거하는 것이 무조건 좋은 결과를 보장하지는 않았다. 오히려 결과를 안좋게 만들기도 했다. 결과를 예측하는데 도움이 되는 정도가, 예측에 대한 노이즈보다 더 컸기 때문이 아닐까 싶다.
- 무서워서 하이퍼파라미터 튜닝을 제대로 하지 못했다. GridSearchCV 로 진행하는데,, 연산량이 많다보니,, 컴퓨터 본체에서 비행기 이륙하는 소리가 나서 무서웠다. 30분이 지나도록 이륙하길래 무서워서 제대로 못했다... 구글에서 제공하는 CoLab 으로 해봤는데 너무 오래걸려서 결과가 안나와서.. 실패
- 좋은 데이터를 사용하는 것도 중요하고, 오버피팅과 언더피팅 사이의 적절한 오차수준을 유지하는 것이 중요하다는 것을 느꼈다. 이것도 꽤나 추상적이다. 적절함을 판단하는 기준이 존재할까..? 표본집단과 모집단 간의 관계를 살펴보면서, 표본집단이 모집단을 얼마나 적절하게 대표할 수 있는지도 봐야할테고,,, 그 데이터에 과적합되지도 않아야 하는,,, 그런 이상적인 경지....!
- 정규성을 만족하게 하는 여러가지 Transformation이 있는데, 변환들끼리의 성능을 측정할 수 있었으면 좋겠다. 이번 프로젝트에서는 log 변환보다는 boxcox 변환이 더 좋은 성능을 보였는데, 왜 그런건지 알 수가 없다. 뇌피셜로는,, 정규성를 더 잘 만족하게끔 했기 때문인걸까..? 왜도와 첨도를 측정해서 평균내보면 알 수 있겠지..?! 해봐야겠다. 이거는 함수로 만들어 놓면 유용하게 써먹을 수 있을 듯하다.
- R square 와 같은 기초적인 통계지식에 대한 기반이 부족했다. 부전공을 해야하나... 생각이 든다. 어찌됐든 통계 이론에 대해서 더 탄탄한 지식의 필요성을 느꼈다.
- 각 모델에 대한 이해가 부족했다. 정확히 말하면 하이퍼파라미터에 대한 이해가 부족했다. 릿지, 라쏘, 엘라스틱, SGD 등 기본적은 선형회귀는 부스트코스에서 듣고 따로 공부해서 알고 있는데,, 트리 기반 모델이나 앙상블 쪽으로 넘어가면 대충 이렇구나~ 만 알고 자세히는 알지 못한다.