공부방/Upstage AI Lab 4기

경진대회 Fast-Up Report

Eddie_D 2024. 9. 20. 00:11

오늘은 경진대회를 마무리하고 각 팀마다 어떻게 모델을 만들었는지 발표하고 각자 배운 점과 어려웠던 점을 공유하는 세미나를 가졌다. 다른 팀의 발표를 보면서 엄청나게 동기부여를 받았는데, 그 기세를 몰아 이 밤에 Fast-up report를 작성하고 있다. 


결과가 나타난 리더보드

1. 어떤 대회였나?

인공지능 AI 부트캠프 4기 학생들이 모여서 아파트 가격 실거래가를 예측하는 대회. 2024. 09. 09~09. 13까지 일주일 동안 진행.

 

2. 목표는 무엇인가? 

나는 2조였는데, 우리 조의 경우에는 최대한 많은 외부 데이터를 수집했고, 그 외부데이터를 활용해 기존에 주어진 결측치 많은 데이터를 대체하고 실거래가를 예측하려는 것이였다. 수치적으로는 RMSE 값을 최대한 낮추는 것이 목표였다. (실제 가격과 예측한 가격의 오차를 줄이는 것) 
개인적으로는 머신러닝 경진대회가 처음이였고(대부분이 그랬지만), 인공지능 모델을 만든다는 것이 어떤 식으로 굴러가는 건지도 모르고 있던 상태라서 일단 최대한 코드를 이해하고 따라가보는 게 목표였다. 대회 흐름을 파악하고 개념을 파악하는 것이 일차적인 목표였다면, 부수적으로는 그 과정 중에 추가 데이터를 수집하고, 결측치 보간에 선형 회귀를 적용해보고, 2~3개 이상의 모델을 사용해보는 것이 목표였다. 

 

3. 실제로 무엇을 했는가? 

1) 데이터분석 단계:
결측치가 많은 데이터들을 확인하고 이걸 어떻게 해야하는지 고민했다.

2) 추가 데이터 수집 단계: 

구별 백화점 수와 공원 데이터를 찾아서 새로운 피쳐로 추가해주려고 했다. 백화점 수는 어떻게 찾아가며 했는데, 공원은 x, y좌표값만 있는데 이걸 어떻게 기존 데이터에 합칠 수 있을지 감이 안와서 못했다. 이 부분은 다시 시간들여서 시도해봐야할 것 같다. 백화점 수 합친 것은 포스팅으로 정리해둬서 첨부. 

2024.09.06 - [프로젝트] - 머신러닝 경진대회 1 | 판다스로 데이터 합치기

3) 베이스라인 코드 내용 파악:
처음 베이스라인을 돌렸을 때 백화점 데이터가 합쳐진 데이터로 시작. 해제사유발생일이 취소된 거래라고 생각해서 해제사유발생일에 값이 입력된 것 row는 삭제하고, 해제사유발생일 컬럽도 아예 삭제해줬다. 그 외에도 임의로 피쳐들을 판단해서 여러가지 피쳐를 삭제했다. 베이스라인대로 연속형 변수의 결측치는 선형보간했고, 범주형은 null이라고 넣어줬다. 전용면적을 IQR 이상치 제거 방법으로 처리해주고, 범주형을 레이블 인코딩 한 다음에 랜덤 포레스트로 돌렸는데 rmse 값이 8270이 나왔다. 원래 베이스라인대로만 해도 rmse가 5851인데, 더 높아지다니; 피쳐를 너무 많이 빼버려서 그런건가. 하여튼 이때까지도 전혀 감을 못잡고 있었다. 

4) 최종 데이터셋 합치기:
팀원들이 수집한 데이터들을 한번에 모아서 합치는 것도 생각보다 쉽지 않았다. 처음에 각자 피쳐와 값들을 저장한 컬럼을 만들고 공유해서 각자 붙이자고 했는데, 하다보니 잘 안되어서 결국 한 명이 총대(?)메고 그 한명에게 데이터를 주면 concat하고 모두에게 뿌리는 방식으로 했다. 모두 합친 뒤에는 피쳐 무려 83개로 굉장히 비대했다. 

5) 조건을 바꿔가며 실험하기:

각 피쳐들을 어떻게 처리하면 좋을지, 이걸 바꿔가면서 베이스라인코드대로 계속 이것저것 돌려봤는데 딱히 큰 의미는 없었던 것 같다. (아니면 있는데 못찾은 걸지도.) 예를 들면, '시군구'라는 데이터를 분할해서 새로운 컬럼을 만들고, 기존의 시군구 피쳐는 제거한다던가. 해제사유발생일을 0 또는 1로 만든다던가. 이런 작업들. 나중에 알게 됐는데 이것보다 더 중요한게 Validation 을 어떻게 구성할지를 좀 더 신경썼어야 했던 것 같다. 팀원들의 여러 아이디어도 있었는데, 건축년도와 계약년월을 가지고 구매 당시의 아파트 연식을 구해서 새로운 피쳐로 만들어보자는 것. 

그리고 타겟값(아파트 실거래가)에 로그 스케일을 적용해보기도 했다. (당시에는 잘 이해하지 못하고 그냥 코드만 따라 썼는데, 이게 무슨 의미인지 다시 생각해봐야겠다. 숙제가 많네ㅠ)

+ 몇 가지 시행착오들:
처음에 몰랐는데, train data랑 test data랑 합쳐서 전처리를 하고 마지막에 분리해서 모델에 돌리는 것이였다. 어찌보면 당연(?)한 것이였는데, 처음에 할때 train만 전처리해서 피쳐들 막 없어져있는 상태에서 test를 돌리려고 하니 안됐다.

그리고 학습용이랑 테스트용을 합친 concat 데이터를 전처리하는 과정에서 어떤 조건에 해당하지 않는 것들을 삭제해줬는데 test에 있는 것도 삭제가 된건지, 결과를 올리니 fail이 뜨기도 했다. 

6) 결측치:

결측치를 선형 회귀로 보간해주면 좋다는 얘기를 강의에서 들어서, 그걸 시도해봤는데 딱히 유의미한 차이는 나타나지 않았다. 처음에 train 데이터로 k-어쩌고 값들 전부 다 결측치 채워봤는데, 결측치가 80% 넘는 애들도 있고 거의 75% 이상이라서 사실 이렇게 채우는 게 별로 의미가 없는 것 같았다. 모든 피쳐를 다 넣고 돌린거랑 최대한 다 빼고 돌린거랑 비교해보려고 했는데, 중간에 다른 팀원들 코드랑 섞여서 비교가 어려워졌다. (아마 이때 타겟값에 로그 스케일 적용하고, 데이터셋도 한번 바뀌었던 것 같음)

다른 조 발표를 들어보니 그냥 아예 결측치 많은 피쳐는 뺀 조가 많았다. 아니면 외부에서 끌어와서 결측치를 채워주거나. 특히 x, y 좌표 위치값은 그렇게 채워줬던데, 나도 이거는 한번 해봐야겠다.

아래는 catboost 모델 사용하고, 타겟값을 로그 취했던 거였나..? 기억이 안나는데ㅠ 하튼 선형회귀 한거랑 안한거 0.01 차이이길래 별로 의미없는 것처럼 보여서 그때부터 선형 회귀는 포기했다; (좀 더 생각봐야할듯..) 

 

7) 피쳐 사용과 스케일링 팀원들과 통일:
피쳐는 뭘 사용하고 뭘 뺄 것인지 다같이 의논해서 정하고, 스케일링은 어떤 걸 사용할 것인지 함께 그래프를 보면서 정했다. 제거한 피쳐들은 다음과 같다. 

#k-data 모두 제거
del_col = [ 'k-단지분류(아파트,주상복합등등)', 'k-전화번호',
       'k-팩스번호', '단지소개기존clob', 'k-세대타입(분양형태)', 'k-관리방식', 'k-복도유형', 'k-난방방식',
       'k-전체동수', 'k-전체세대수', 'k-건설사(시공사)', 'k-시행사', 'k-사용검사일-사용승인일', 'k-연면적',
       'k-주거전용면적', 'k-관리비부과면적', 'k-전용면적별세대현황(60㎡이하)', 'k-전용면적별세대현황(60㎡~85㎡이하)',
       'k-85㎡~135㎡이하', 'k-135㎡초과', 'k-홈페이지', 'k-등록일자', 'k-수정일자', '고용보험관리번호',
       '경비비관리형태', '세대전기계약방법', '청소비관리형태', '건축면적', '주차대수', '기타/의무/임대/임의=1/2/3/4',
       '단지승인일', '관리비 업로드', '좌표X', '좌표Y', '단지신청일', '사용허가여부']
df.drop(del_col,axis=1, inplace=True)

각 피쳐의 그래프 개형을 보면서 이건 로버스트를 이건 민맥스를, 이건 박스콕스를 쓰면 좋겠다, (챗지피티에게 물어가면서) 정했는데 생각보다 스케일링 결과가 rmse 값에 거의 영향을 미치지 않아서 실망했었던 기억이.. 특히 이상치가 엄청 치명적인 스케일링이 있다고 그래서 데이터 잘 다루시는 분이 그 이상치 제거하고 처리한다고 시간도 많이 투자해주셨다. 덕분에 연휴 동안에 스케일링에 대해 조금 더 공부해서 알아갈 수 있었다. 참고글: 2024.09.16 - [프로젝트] - 머신러닝 경진대회 | 데이터 스케일링, 레이블 인코딩

8) 마지막으로 하이퍼파라미터 튜닝:
이 부분을 할 때는 내가 거의 파이썬 코드 오류를 붙잡고 있느라 해보지 못했다. 아쉽다ㅠㅠ 그래서 대회는 끝났지만 혼자라도 다시 해보려고 한다. 옵튜마가 뭔지는 모르겠지만, 최적의 하이퍼파라미터를 찾아준다고 한다. 우리 조는 모델 2개의 값을 앙상블해서(앙상블 개념도 아직 잘 모르겠다. 이것도 다시 공부해서 정리해야하는..) 결과를 내놓았다.

 

4. 한계는 무엇이고, 아쉬웠던 점은?

뇌 용량의 한계를 느꼈다..ㅋㅋㅋㅋ농담 아니고, 진담 맞고. ㅋㅋㅋ
이번에 느꼈던 한계는 일단 판다스로 데이터프레임을 다루는 것에서부터 막혔는데 공원 데이터를 x, y 좌표가 주어졌는데도 이걸 어떻게 아파트 데이터에 적용해야할지 갈피를 잡지 못해서 활용하지 못했다는 점이 아쉽다. 아마 찾아보면 금방 나오겠지만, 좀 더 찬찬히 생각해서 나만의 방법을 찾아보고 싶다는 고집이 생긴다. 
그리고 사실 베이스라인만 보고 이해하는 것 자체를 목표로 해서 그런지, 베이스라인에서 벗어난 생각을 하지 못했다. 아주 기본적인 부분이였는데 학습용 데이터에서 밸리데이션 데이터를 어떻게 구성할지가 정말 중요한 부분이였는데 이건 전혀 생각해보지 못했다는 것이 아쉬웠고, 모델에 따라서도 변수 중요도가 어떻게 측정되는건지 이해하지 못한 점, 그리고 피쳐 엔지니어링에 좀 더 고민을 해봤으면 좋았을텐데 제대로 고민하지 못한 것 같아서 아쉽다. 마지막에 다양한 모델을 사용해보지 못한 점도 아쉽다. 좀 더 일찍 모델 돌리는 걸 시작해볼껄! 그럼 시행착오도 빨리 얻어서 좀 더 다양한 시도를 할 수 있지 않았을까. 

 

5. 다음 경진대회에서 시도해보고 싶은 점은?

잘 이해가 안가더라도 일단 한번 사이클을 빠르게 돌아보는 것. 그 다음에 하나씩 찬찬히 뜯어가며 공부하고 변화를 주고, 각 변화에 따른 결과가 어떻게 달라졌는지 꼼꼼하게 기록을 남기고 싶다.