20200202 Palindrome 기념, 블로그 글쓰기
Kaggle은 분야별로 메달과 등급이 있고, 대회가 아닌 코드 부분인 Kernel에 3개월 정도 초점을 두고 진행했습니다. 그리고 2020/01/30 에 Kaggle Kernel Master를 달성하였습니다!! 아마 Kernel분야에서 Master는 한국에서 2번째인것 같습니다. 그 기념으로 Kaggle Kernel Master가 되는 팁을 소개합니다.
최근 Kernel Master 명칭이 Notebooks Master로 변경되었습니다. 참고 부탁드립니다.
Kaggle의 Progression & Medal System
Kaggle Progression System에서 더 구체적인 정보를 확인할 수 있습니다.
Kaggle은 Progression & Medal System과 순위로 사람들에게 동기부여를 주고, 참여하게 유도합니다.
분야는 총 4개의 분야이고, 각각 5단계로 진행됩니다.
- Competition, Dataset, Kernel, Discussion
- Novice > Contributor > Expert > Master > Grandmaster
각각의 단계는 메달에 따라 결정되는데 각 메달의 조건은 다음과 같습니다.
여기서 메달의 조건도 모두 다르지만 간단하게 Competition은 대회에서 좋은 성적을 받으면 되고, 나머지 메달을 Upvote를 통해 결정이 됩니다. 한마디로 Competition을 제외하고는 좋아요 경쟁입니다.
하지만 본인의 색은 어떤 분야든 가장 높은 분야로 표시됩니다. 어떤 분야든 높은 분야를 달성하면 색을 변경할 수 있다는 의미입니다. 그리고 저는 대회가 아닌 커널 분야를 선택해서 오렌지 색을 달성했습니다.
Upvote는 본인 것과 Novice의 Upvote를 제외하고 카운팅됩니다. 그렇기에 생각보다 메달을 쉽게 받기는 어렵습니다. 좀 더 구체적으로 분석해보겠습니다.
어떤 Kernel(Discussion)이 메달을 받을까
이전에 개인 페이스북 포스팅에서는 간략하게 올렸지만, Kaggle Kernel의 분석을 해보겠습니다.
Kaggle의 Kernel에는 여러가지 타입이 있습니다. 각자 조금씩 분석해보겠습니다. 제 주관적인 분석이니 재미로 읽어주시면 감사하겠습니다.
Winner Solution & High Score
Kaggle에서 Solution 공유는 매우 많습니다. 이에 대한 유형은 2가지가 있습니다.
- 대회 중간에 메달권 성적을 가진 Kernel
- 대회가 끝난 후에 Winner team에서 Kernel (최근에는 Winner의 Kernel보다는 Discussion이 많이 공유되는 것 같습니다.)
메달을 받는 것이 목적인 대회인 만큼 대회 중에 높은 성적 Kernel이 나오면 기간에 따라 동/은 메달은 기본적으로 받습니다. 이 분들은 보통 본인이 그보다 높은 성적을 가지고 있거나, 아니면 이미 조만간 공개될 내용이니 내가 미리 공유하겠다~ 인 느낌이 강합니다.
자신만의 Magic Feature 를 공개하겠다는 것은 본인에게도 독이 될 수 있기에 신중해야합니다.
기존 공개된 Kernel보다 높은 성적을 낸다는 것 자체가 초심자에게는 어렵기에 사실 어느 정도 지식이 있고 실력이 있어야 합니다. 물론 Winner는 더욱 실력이 있어야 가능합니다.
보통 대회 중반부에 많이 공유됩니다. (초반부에는 사람들이 score에 관심이 없기 때문)
본인의 ML/DL 실력도 높이며 성적을 받기 때문에 가장 좋은 방법이지만 초심자에게 어려운 방법입니다. (저도 올해에는 이렇게 메달을 받고 싶습니다.)
Utils
Utils는 포괄적인 내용입니다. 데이터 전처리/후처리와 중간 과정의 최적화라고 표현할 수도 있을 것 같습니다.
분야가 Detail할수록 도메인 전문가가 필요합니다. 이미지의 경우 적절한 Crop, 오디오의 경우에는 Mel-Spectrogram으로 만드는 방법 등이 있습니다. 데이터 타입이 기존 데이터셋들과 차이가 날수록 util 관련 코드의 Kernel들이 많습니다.
Score를 매기는 metric 함수에 대한 최적화나 코드를 빠르게 돌릴 수 있는 방법 등이 공유됩니다. 그 외에도 중간 과정에서 불필요한 과정을 생략하고, 간단하게 돌릴 수 있는 방법, 성능에 저하는 없지만 빠른 방법 들이 있습니다.
종종 데이터를 체크하는 방법 들도 공유되고는 합니다.
보통 대회 초/중반부에 많이 공유됩니다. 본인의 노력으로 충분히 구글링을 통해 만들 수 있고, 데이터 전처리나 최적화를 배울 수 있습니다.
Pipeline
특정 알고리즘에 대한 데이터셋 처리가 각각 다른 만큼 알고리즘 별로 Pipeline을 만들어 두면 좋습니다. 특정 알고리즘을 사용하고 싶은데 현재 데이터셋에 적용하는 방법을 몰라 고민하는 분들이 많기에 수요는 매우 많습니다.
데이터 전처리부터 결과가 나오기 까지의 코드를 만들어 공유하면 됩니다. 보통 정형데이터 대회에서는 부스팅 모델 Pipeline이 많이 공유되는 것 같습니다. 비정형 데이터 대회는 Class 단위로 코드를 작성하여 쉽게 사용할 수 있는 코드들이 공유됩니다.
개인적으로는 함수로 만들고 설명이 충분하여 Custom이 가능한 코드들이 보통 메달을 받습니다. 이런 Pipeline은 Util과 비슷하게 공유가 되는데, Upvote보다 Folk 수가 더 많은 경우도 있습니다.
대부분 이런 Pipeline은 경험치가 있는 분들이 만드는 것 같습니다. 이런 커널은 코드가 깔끔하여 가독성이 높을수록 Upvote가 많습니다. 아니면 문제를 해결하는 방식 자체를 변경하여 성적이 높은 커널인 경우도 있습니다.
EDA & Visualization
EDA(Exploratary Data Analysis)는 탐색적 데이터 분석 라고하여 데이터에 대한 전체적인 분석을 통해 데이터에 대한 전체적인 이해와 인사이트를 찾는 과정입니다.
초반 Speed가 중요하고, 시각화 스킬이 필요합니다. 초기 선점이 중요한 이유는 EDA는 보통 처음에 잘만든 선두주자가 Upvote를 모두 얻고, 그 커널을 수정해가며 점점 키워 나중에는 Winner Takes All의 모습을 띄게 됩니다.
초반에는 뛰어난 EDA가 없는 경우도 있기에 Pandas Profilling 라이브러리만 사용하여 동메달을 받는 경우도 많습니다.
보통 빠른 시각화를 위해 Seaborn을 많이 사용하고, 인터랙티브 시각화에서는 Plotly가 가장 많이 사용됩니다. 물론 Pandas + Matplotlib 조합만으로 빠르고 이쁘게 만드시는 분들도 있습니다.
대회가 아닌 일반적인 Dataset에서도 많이 진행이 되고 좋은 분석과 시각화가 많이 진행되고 있습니다. 저는 시각화를 매우 좋아하고, 이런 부분을 노려 일반적인 데이터셋에서 시각화와 EDA를 진행하여 메달을 따고는 했습니다.
Pandas를 활용하여 여러가지로 데이터를 바꾸어가며 만들 수 있어야하고, 데이터에 따라 효과적으로 시각화하는 방법들을 공부하면 됩니다. 시각화 툴들과 각 툴들의 장점들을 알수록 좋습니다.
EDA는 초반이 중요하고, 시각화는 시간과 상관없이 잘만들면 쉽게 메달을 딸 수 있습니다. 초반과 함께 점점 발전시키는 방법으로 가면 금은 충분히 딸 수 있습니다. (중반부에 HTML단위의 Custom과 더 좋은 설명으로 채우고 깔끔한 시각화가 있다면 충분히 금메달을 받을 수 있기는 합니다.)
도메인 지식이나 데이터 사이언스에 대한 지식이 조금 부족해도 메달을 딸 수 있기에 충분히 초심자도 도전할 수 있는 분야입니다.
Tutorial & Library & Algorithm
튜토리얼은 많은 분들이 아는 Tutorial입니다.
이미 다수의 튜토리얼이 공유되고 이미 유명한 커널들로 굳혀지면서 Tutorial로 메달을 받기는 어려워졌지만 여전히 열린 공간이기도 합니다. (이전에 Stacking, Ensemble, Seaborn, Matplotlib, Scikit-Learn 등 기본적인 내용은 이미 먹혔습니다.)
최근에는 다음과 같은 커널들이 Tutorial로 메달을 받았습니다.
- Pandas, Numpy 예제 100개
- pandas 1.0.0의 특징
- Matplotlib Simple Tips
물론 새로나온 알고리즘이나 라이브러리 소개도 좋습니다. Ng Boosting이나 Umap등 새롭고 핫한 알고리즘이나, categorical encoding, pandas profilling 등의 유용한 라이브러리도 소개되기도 합니다. unique한 시각화 라이브러리, 시계열 특화 라이브러리 등 정말 다양한 라이브러리들도 좋은 소재입니다.
신규 진입자가 읽기에 이전 튜토리얼이 너무 재미가 없거나, 너무 예전 코드라 안돌아가거나, 등등의 이유로 이전 커널보다 새로운 커널을 찾는 분들이 있기에 자신이 생각하기에 이해하기 쉬운 튜토리얼을 만든다면 메달을 딸 수 있습니다.
자신만의 컨셉으로 튜토리얼을 만든다면 쉽게 메달을 받을 수 있습니다. 이해하기 쉬우며 가독성이 좋아야하니 이는 글 쓰는 역량이 필요합니다.
Meaningful
특정 데이터셋을 올린 분들이나, 최근에 트렌드가 되는 내용을 Storytelling한 예시들입니다.
예를 들면, 사회적 약자에 관련된 Data Storytelling이나 최근에 이슈인 신종 코로나 바이러스 등이 그 예시입니다. Kaggle이 아니더라도 기사나 다른 사이트에서 접할 수 있지만, Kaggle에서도 그런 분들이 있다는 것입니다.
데이터를 통해 의미있는 인사이트를 전달하는 멋진 개발자라고 할 수 있겠네요. :)
Starter Code
내가 아직 Kaggle에 입문한지 얼마 되지 않은 분들에게 메달을 딸 수 있는 방법은 My First Kernel!! 등의 첫 커널을 만드는 것입니다. 보통 Titanic 또는 House Price에서 많이 보이는 사례입니다.
많은 Kaggler분들은 Kaggle에 유입되는 분들에게 그렇게 박하지 않습니다. 오히려 Keep Going! 등을 comment로 남겨주시며 격려해주십니다.
내용이 너무 비어서는 안되고, 본인의 성장을 위해서라도 다른 좋은 커널을 바탕으로 자신의 커널을 만들어야 합니다. 배끼지는 말라는 의미입니다.
이 방법은 개인적으로 추천합니다. 사람은 성취한 경험이 있을 때, 그 경험을 발판삼아 앞으로 나아갈 수 있다고 생각합니다. 노력으로 메달을 받을 때의 성취감을 느껴보는 것을 추천합니다.
Kernel 메달을 위한 Tips
Kernel 메달을 받기 위해, 제가 한 노력과 몇 가지 팁을 공유합니다. 위의 분석과 함께 다음과 같은 내용들에 초점을 두고 커널을 만들면 메달을 받을 수 있을 것입니다.
모든 것에 앞서 가장 중요한 것은 내용 입니다.
1. 구체적인 컨셉과 질문
커널을 만드는 작업은 데이터를 분석하는 일입니다. 데이터 분석은 사람마다 관점이 다르기 때문에 본인만의 컨셉을 잘 잡는 것이 중요합니다.
그렇기 위해서는 데이터를 보고 끊임없이 질문하는 과정이 필요합니다.
이 데이터를 A 방법으로 처리해보면 어떨까? B 방법으로 시각화해보면 어떨까? C 알고리즘을 써보면 재밌지 않을까?
이런만큼 컨셉에 초점을 두고 커널을 만들면, 데이터 처리하는 능력이 점점 늘 것입니다. parameter에 맞는 데이터, 시각화에 적합한 형태의 데이터 등 전처리 과정이 많기 때문입니다. (다른 말로는 pandas, numpy 등을 활용한 데이터 처리 연습을 해야합니다.)
모든 내용을 때려 넣는다고 해서 Upvote를 많이 받지는 않습니다. 유익한 내용을 가지고 있고, 통일성을 가지고 있어야 합니다. 통일성은 컨셉 이외에도 여러 가지 통일성이 있을 수 있습니다.
- code의 형태
- 설명의 분배 및 형태
- color palette 및 plot
데이터를 있는 그대로 시각화하고, 의미를 찾는 것은 많은 사람이 할 수 있습니다. 조금 귀찮고 힘든 과정이라도 많은 사람들이 하지 못하는 작업을 감수해야합니다.
2. 깔끔한 시각화와 Notebook 꾸미기
보기 좋은 떡이 먹기도 좋다 는 선조의 진리입니다.
같은 내용이라도 이쁜 시각화와 깔끔한 그림들이 함께라면 사람들은 더 관심을 가집니다.
시각화에 있어서 수정할 부분은 매우 많습니다.
- color palette
- tools & shape : 다양한 시각화 툴과 다양한 형태의 chart
- 제목과 부제목 : 그래프에 제목만 달아도 차이가 큽니다.
- Ticks와 Labels : 축을 어떻게 활용할 것이고, 가독성을 생각해야 합니다.
- 사이즈와 해상도
- Interactive
Notebook에서도 꾸밀 부분은 많습니다.
- 커널 시작 부분에 이미지와 Title을 이용한 초기 유입자 확보
- markdown을 활용한 특정 부분 강조한 가독성 증가
- h tag 들로 적절한 목차
- 필요시 HTML 문법을 활용한 프론트엔드 작업
이쁘게 만들면, 더 읽고 싶어집니다.
3. 코드가 1이라면, 코드+설명은 5
종종 코드에 자신이 넘쳐서 코드만 공유하시는 분들도 있지만, 코드와 함께 설명이 있는 것이 훨씬 좋습니다.
100명의 개발자가 있으면 100개의 코딩스타일이 있습니다. 본인의 코드를 이해하지 못하는 독자는 많을 수 있고, 본인의 코드와 함께 주석과 설명은 필수입니다.
보통 코드만 있게 되면 화면 내에 여백이 없어지고 가독성이 떨어집니다. UI 관점에서도 매우 읽기 싫어지는 화면이 됩니다.
그리고 본인만의 생각을 적어 본인 코드의 타당성을 주장하는 과정도 필요합니다.
(종종 컨셉으로 Only 3 Lines… 등의 느낌으로 만드는 커널도 있습니다.)
4. Clean Code
위의 항목과 유사하게 코드에 대한 설명도 중요하지만, 코드의 quality도 중요합니다.
최근에 Kaggle에서도 Issue로 올라온 내용으로 코드를 정리해서 공유하는 것은 중요합니다. 물론 이 부분에 대해서는 여러 가지로 의견이 갈릴 수 있다고 생각합니다.
저도 못하는 부분이지만 최대한, 코드를 정리하여 공유합시다. 본인의 성장을 위해서도 코드 정리는 필요한 과정이라고 생각합니다.
5. 내용도 과유불급, 적절한 길이
내용에 따라 커널의 길이는 중요한 요소입니다. 너무 양이 많아 로딩이 길거나, 읽기 힘들면 사람들이 읽지 않습니다.
내용을 많이 담는 거보다는 실용성에 초점을 두면 좋습니다. 물론 Tutorial류의 커널이나 완벽한 EDA의 경우에는 길이가 길어질 수는 있습니다.
일부 코드는 접어서 커널을 읽는 사람이 내용에 집중할 수 있도록 만드는 것도 하나의 팁입니다. (궁금한 사람은 열어보겠죠?)
6. Update와 Re-Comment
커널은 한 번 커밋했다고 끝이 아닙니다.
데이터셋이 업데이트 될 수도 있고, 설명에 오류를 수정해야할 수 있습니다. 시간이 지날수록 내용을 추가할 부분도 생길 것입니다.
시각화를 계속 tuning 할 수 있습니다. 처음부터 완벽하게 시각화를 만드는 사람은 없습니다. 지속적인 update로 완성형 커널을 만듭시다.
그리고 댓글이 달리면 감사의 댓글을 답시다. 본인의 대댓글이 글의 내용을 더 풍부하게 만들 수 있고, 앞으로의 캐글에서 좋은 관계들을 만들 수 있습니다.
또한 Update와 Comment는 본인의 커널이 검색에 유용하게 됩니다. Recently Run, Hotness 등의 검색이 잘 될수록 사람들이 볼 기회가 많아지고, 그렇게 어느 순간 흐름을 타면 금/은을 받게 됩니다.
7. 가만히 있는다고 글을 읽어주지 않는다.
많은 사람들은 본인의 글을 이리 저리 홍보하는 것을 관종 같다 라고 생각하며 불편하게 여깁니다. 하지만 글, 컨텐츠가 아무리 좋아도 초기 독자, 청자들이 없으면 내용이 뜰 수 없습니다.
Discussion에 본인의 생각을 이야기하고, 다른 사람 커널 중 자신의 커널과 유사한 부분이 있으면 그런 부분도 이야기하며 셀프 마케팅을 어느 정도 하는 것도 능력이라고 생각합니다.
다른 사람들과 소통하며 본인의 커널에서 보완할 부분을 찾고, 다른 좋은 커널에 Upvote를 하세요. 나는 다른 사람을 Upvote하지 않는데, 내가 Upvote를 받고 싶다는 것은 어떻게 보면 욕심이기도 합니다.
그리고 색이 달라질수록, 색 자체가 홍보 효과가 되어 그런 셀프 마케팅을 하지 않아도 될 것입니다. :)
마치며…
누군가는 머신러닝 스킬을, 누군가는 상금을, 누군가는 개발 실력을 목표로 할 수 있습니다. 그렇기에 캐글의 내용은 보물 창고 라고 해도 무방한 공간이 되고 있습니다.
Kaggle은 꼭 Competition만을 위한 공간이 아닙니다. 제가 Kaggle Kernel Master를 위해 노력한 이유 중 하나는 여러가지 방면에서 Kaggle을 활용할 수 있다는 점을 이야기하고 싶었기 때문입니다.
본인이 생각하는 중요한 가치를 Kaggle에서 얻을 수 있기를 바랍니다.
긴 글 읽어주셔서 감사합니다.
Kaggle을 위해 데이터 시각화를 공부하며 Data Visualization KR 커뮤니티를 만들었습니다. 많은 분들이 함께하면 좋겠습니다 :)
Leave a Comment