Kaggle competition 간단후기

Kaggle competition 간단 후기 및 관련 포스팅 예정

***

최근 Kaggle 에서 Avito Demand prediction competition에 참여해보게 되었다. 항상 dataset을 얻거나 정보를 찾기 위해서만 이용했었고, 용기가 없어 competition은 해보지 못했었는데, 이번에는 처음이니 상위 50프로대만 진입해보자는생각으로 가볍게 시작해보았다. 커뮤니티 안에서 여러사람들과 kernal 및 discussion을 공유하며 조금씩 커널을 수정하고, 하다보니 어느새 submission도 70개를 훌쩍 넘겼고, 목표치이던 50프로대를 생각보다 일찍 달성해서 30프로대, 20프로대까지 진입할 수 있었다. 또, 커널을 열심히 올린 덕분에 (생각보다 내 커널을 많이들 좋아해주셔서...) keranl expert등급까지 올라갈 수 있었다.

이번 일을 계기로 kaggle competition에 더 활발히 참여해볼 예정이다. 사실 이미 다음 competition으로 Home credit default risk comeptition을 등록해놓았고, 40프로대까지 올려놓기는 했다. 그리고 이번 포스팅을 통해, 초보자로써 kaggle competition을 통해 느낀 점을 써보려고 한다. 그리고 다음 포스팅을 통해, 이번 competition을 하면서 알게된 데이터 분석 모델, data cleansing을 할때 사용되는 모델 등에 대해 포스팅해보려고 한다.


***


1. Kaggle 의 문화와 kernal의 공유

일단 Kaggle 은 세계에서 가장 크다고 해도 과언이 아닌 데이터 사이언스 커뮤니티이다. 최근에 알게 된 사실이지만 구글에 인수되어 현재 구글의 모회사인 Alphabet에 속해있다고 한다. (새삼 구글이 인공지능 및 빅데이터분야에 얼마나 많은 신경을 쓰고있는지가 느껴진다). 그래서 많은 회원들은 Data scientist이거나, 적어도 Data science에 많은 관심을 가지고 있는 사람들이다. 따라서 캐글에는 기본적으로 'For the augmentation of knowledge' 라는 문화가 깔려있다. 그렇기 때문에 수많은 사람들이 자신의 작업물을 공유하고, 어떻게 개선할 수 있을지, 무엇이 잘못되었는지 등에 대해 자유롭게 토론한다. 일반적으로 대회, competition이라고 한다면 상당히 엄격한 룰 아래에서 폐쇄적으로 진행되는 대회를 생각한다. 그렇지만 kaggle에서는 서로 더 좋은 결과물을 낼 수 있는 방법을 공개한다. 기본적으로 캐글 커널에 Fork라는 기능이 존재한다는 것에 상당히 놀랐다. Fork는 상대방의 커널 작업물을 그대로 복사해서 (물론 출처는 밝히게 되어있지만) 그 위에 추가적인 작업을 할 수 있는 기능이다. 추천을 많이 받는 상당히 '좋은 커널'은 여러차례 fork를 거쳐 '더 좋은 커널'이 된다. 

사실 처음에는, 나름 competition이기 때문에 다른사람의 kernal을 최대한 참조하지 않고 짠 코드로만 작업해보려고 했다. 그렇지만 어느 유저가 kaggle 의 커널공유와 fork는 캐글에서 지식이 공유되고 확장되는 핵심 요소라고 말하는것을 보고 다른이들의 커널을 많이 참조하게 되었다. 그러는 과정에서 데이터를 더 효과적으로 처리하는, 나는 알지 못했던 방법들을 알게되고, 모르고있었던 새로운 모델들을 알게되었고, 나만의 방법으로 코드를 수정해 적용해보기도 했다. 


2. 점수매기기, 리더보드의 맹점

Kernal의 공유가 좋은점도 있지만 이것에도 분명 맹점이 존재한다고 느꼈다. 바로 Kaggle competition은 기본적으로 대회이고, 리더보드를 통해 실시간 순위가 공개된다는것. 그렇기 때문에 누군가가 다른이가 공개한 코드를 그대로 가져다가 쓴다던지, 혹은 fork해서 한 줄도 수정하지 않고 같은 결과물을 제출하는것도 시스템적으로는 가능하다. 물론 이렇게 한다면 '아, 이사람이 스스로 작업한 결과물이 아니구나'라는게 어느정도 심증적으로나마 짐작할 수 있다. 다른사람의 작업물을 fork한다면 fork한 이후 몇줄의 코드를 수정했는지 표시되며, 리더보드에는 이 사람의 submission 갯수가 공개된다. 또한 리더보드를 통해 프로필을 조회해서 과거 작업물, 등급, 활동 등을 살펴볼 수 있기에 Data science에 대한 경험이 아예 없는이가 다른사람의 커널을 그대로 제출한다면 어느정도 표가 난다. 

Kaggle은 이런 점을 감수하면서도 지식의 공유와 확장이 더 가치있다고 판단한 것 같다. 그러나 여전히 더 나은 등수와 점수를 원하는사람들은 많다. 심지어 요즘은 학교 수업이나 교육기관 등에서 Kaggle competition을 하도록 시키기도 하는 것 같다. 이것이 절대 나쁘다고 생각하지 않지만, 점수가 높은 공개커널이 올라오면 갑자기 그 커널과 같은 점수대에 진입하는 사람들이 많아진다. 실제로 마감 이틀 전 당시 공개된 public kernal중에 점수가 가장 높은 커널을 공개했었는데, 그 직후 나와 같은 점수대에 사람들이 몰리는 현상을 보았다. 또, 마감 하루 전 어떤이가 공개된 커널들의 결과물만 그대로 다운받아 평균을 낸 커널을 올렸는데, 이 커널의 점수가 상당히 높아서 리더보드에 대 혼란이 일어났다(...) 이것에 대해 다음 파트에서 좀더 자세히 이야기해보도록 하겠다. 

3. Blending의 유혹

이번 competition은 Root Mean Square Error (평균 제곱근 편차. 이하 RMSE)를 기준으로 점수를 내는 대회였다. RMSE를 사용하는 경우에만 그런지는 모르겠지만 (아마 아닌 것 같다) 점수를 끌어올리기 위한, 소위 Blending이라 말하는 기법이 있다. 쉽게 말하면 결과물들끼리 적절히 섞어 평균을 냄으로써 더 RMSE점수가 좋은 결과물을 내는 것이다. 처음에 이방법을 접했을때는 매우 신기했다. 아마 적잖은 커널이 이 blending에 대해 이야기하고 있다. 심지어 그저 결과물들을 섞어서 평균을 내는게 아니라, 나름의 통계적 분석을 통해 결과물들을 섞어 최적의 결과가 나올 수 있게 하는 방법에 대해 이야기하기도 한다. 

그런데 현업 데이터 분석가인 유저가 ''My very first kernel was a stupid blend and i learned the lesson that it adds near to nothing in someone's knowledge' 이라고 말하는 것을 보고 상당히 공감했다. 사실 이 blending을 통해 점수를 더 높일 수 있을것이며, 어느정도 통계적으로도 일리가 있는 방법이라고는 생각한다. (추후 이것에 대해서도 더 연구해보고 포스팅을 해볼 생각이다.) 하지만 Blending을 통해 점수를 높히는 커널은 크게 지식향상에 기여가 되지는 않는다. 

또한, 아무래도 competition이기때문에 자신의 점수를 높히기 위해 자신의 결과물들을 가지고 blending을 시도하는 것은 괜찮다고 생각한다. 그러나 다른사람이 올려놓은 커널의 결과물만을 다운받아서, blending을 통해 점수를 높힌다면 대회 자체의 취지에 어긋나는 행위라고 생각한다. 실제로 이번에 대회마감 하루 전날, 어떤 유저가 공개된 커널들의 결과물만을 다운받아 blending을 시도했고, 상위 10프로대에 해당하는 점수를 냈다. 문제는 이 유저가 이 커널을 public kernal 로 공개했다는 것인데, 이로 인해 순식간에 200여명의 유저가 같은 점수대로 올라가는 혼란이 빚어졌다. 나의 기존 점수는 이 점수와 큰 차이가 나지 않았기때문에 결과에 큰 차이는 없었지만 수많은 유저들이 이를 비난했다. 

4. 하드웨어

마지막으로 느낀점은 하드웨어의 한계이다. 전공 수업시간에 몇십만줄에서 백만줄 되는 csv 파일을 돌리며, '맥북 프로 정도면 문제없구나'라고 안일하게 생각했었는데 새삼 빅 데이터가 얼마나 '빅'데이터인지 실감하게 되었다. (새삼 전공수업 교수님이 당시에 학생등 커널이 돌아가는 시간이 너무 오래걸리자 '램 8기가에요? 16기가는 되야죠~' 라고 말씀하신게 떠오른다) 일단 기본적으로 내 컴퓨터에 데이터를 작업하려보 하면 너무 커서 파일을 다운받을 수가 없다. (특히 이번 competition은 이미지파일이 포함되어있어서 zip 파일 하나가 기본 1기가바이트에서 크게는 90기가바이트나되는 큰 용량이었기 때문에...) 

그래서 Kaggle 에서 제공해주는 온라인 커널을 사용했다. 요즘은 자사의 컴퓨팅 리소스를 클라우드 형식으로 제공하는 서비스가 많이 있는걸로 알고있었는데 사용해보니 왜 클라우드컴퓨팅이 강력하다고 하는지 알 수 있었다. 어떤 CPU를 제공하는지는 모르겠으나, 옵션을 통해 GPU를 추가할 수도 있고, 기본적인 램 용량이 17기가바이트정도로 내 컴퓨터의 하드웨어보다 뛰어났다. 

그렇지만 기본적으로 제공하는 커널의 하드웨어역시 한계가 있었다. 조금만 큰 파일을 로드한다던지, 한번에 process 하는 column의 수가 많아진다던지 하면 정말 오랜시간을 기다려야 했다. 한번은 imgage feature extraction을 하기 위해서 이미지 파일을 로드하려 시도했으나 제공되는 스토리지가 충분하지 않아 파일을 모두 로드할 수 없었을 뿐더러, 이미지 하나하나를 처리하는데도 굉장히 오랜 시간이 걸렸다. 그래서 결국 파일의 압축을 풀지 않고 zip 파일 내부에서 image feature를 직접 추출하는 방법을 찾아내서 사용했다. 이렇게해도 시간이 너무 많이 걸려서 (150만개의 이미지를 추출해야 했기 때문에) 커널 하나에 10만 개씩, 15개의 커널을 동시에 돌리는 방법으로 6시간만에 이미지를 모두 추출할 수 있었다. 

Discussion을 통해 어떤 유저는 20개가 넘는 코어의 하드웨어를 가지고 15분만에 image feature 추출에 성공했다고 대답했다. 그 외에도 다른 유저들이 추천한 방법 (특히 뉴럴 네트워크나 image feature extraction에 있어서)를 시도해보려고 해도 하드웨어가 약해서 시도할 수 없었던 것이 너무나도 많다. 보통 고득점을 하는 상위권에 있는 유저들중에는 lab이나 직장 연구실에서 사용하는 하드웨어를 사용하는 일도 많다고한다. 


***

일단 이번 competition을 통해 크게 느낀점은 이 정도인 것 같다. 다음 포스팅을 통해, 이번에 새로 알게 된 모델 / 데이터 처리 방법 등에 대해 다뤄볼까 한다. 

- TF - IDF vectorizing : Text feature를 처리하기 위해 사용
- XGB / LGBM : Boosting 기법을 사용한 모델
- N/A (비어있는 데이터) 를 처리하는 여러가지 방법
- Categorical feature를 labeling하기
- Ridge Riggression

이외에도 생각나는게 또 있으면 함께 포스팅하도록 하겠다. 





댓글

이 블로그의 인기 게시물

[Python mini projects] Python을 활용한 텍스트 속 유의미한 통계 산출하기 -1

(2부) 플랫폼 비즈니스,그리고 카카오의 수익모델에 대한 idea