kaggle 필사 스터디 4주차에서는 'Costa Rican Household Poverty Level Prediction'라는 주제의 코드를 학습했습니다. 커널마스터인 Will Koehrsen의 커널 코드를 중심으로 공부하였으며, 전체 커널은 아래 링크를 통해 확인할 수 있습니다.
https://www.kaggle.com/willkoehrsen/a-complete-introduction-and-walkthrough/notebook
전 세계의 여러 국가들의 은행이나 기관에서는 도움이 필요한 사람들에게 금전적인 지원을 할 때 과연 누가 이러한 지원이 정말로 필요한 사람인지 판별하려고 하는데요, 이 때 정확히 판별하는 데 어려움을 겪는다고 합니다. 이 대회는 이런 어려움을 해소하기 위해 한 가정이 가지고 있는 140개 이상의 아주 다양한 속성들을 기반으로 그 가정이 가난한 가정인지 부유한 가정인지 판단하는 대회입니다.
주어진 훈련 데이터는 9,557개, 테스트 데이터는 23,856개 그리고 feature는 142개입니다.
이 대회는 Supervised multi-class classification Machine Learning problem입니다. 즉, training data에 label이 제공되고, 4개의 class로 구별되는 ML problem입니다.
poverty level은 위와 같이 4개의 class로 분류됩니다. 또한 feature는 id, idhogar, parentesco1 등 몹시 다양하고 많습니다. 이 대회에서는 househole(가정) 단위로 학습할 예정이며, 이 중 가장이 없는 가정에 속하는 개인들의 경우 훈련에서는 사용하지 않을 예정입니다.
여기서 가정의 빈곤 수준을 평가하기 위한 지표로 Macro F1 Score를 사용합니다. 이는 정밀도(Precision)와 재현율(recall) 지표를 조합하여 나온 값으로, 여기서는 각 class의 F1 score들의 평균을 활용할 예정입니다.
대회는 크게 다음과 같은 순서로 진행됩니다.
문제 파악 → 데이터 분석 → ML을 위한 데이터셋 생성 → 기본 ML 모델 비교 → 복잡한 ML 모델 시도 → 선택한 모델 최적화 → 문제에 맞는 모델 예측 → 결론 도출
위 과정은 학습을 위한 데이터들을 읽어오는 과정입니다. train.info(), test.info() 와 같은 코드를 통해 데이터들의 정보를 살펴볼 수 있습니다.
연산을 쉽게 하기 위해 training dataframe과 testing dataframe을 결합하는 작업을 해주었습니다. 나중에 Target을 기준으로 2개의 set을 분리할 수도 있습니다.
이번에 참고한 커널에서는 EDA(Exploratory Data Analysis, 탐색적 데이터 분석) 과정을 몹시 상세하게 설명해주어서 유익한 코드가 많았습니다. 그 중에서 인상이 깊었던 부분을 몇 가지 소개하겠습니다.
우선 Data label들의 분포를 확인해서 막대 그래프로 표현한 것이 바로 위의 그래프 사진입니다. 앞서 poverty level을 4가지로 나누었다고 했는데, 이 중에서 특히 extreme 영역의 수가 가장 적은 것을 볼 수 있습니다. 이와 같이 클래스 분포가 불균형하고, 유독 적은 수를 학습하게 되면 예측을 할 때 어려움을 겪을 수 있습니다. 이를 해결하기 위해 Oversampling이라는 것을 이용합니다.
데이터의 불균형은 크게 Oversampling과 Undersampling으로 나누어볼 수 있습니다. Oversampling은 앞에서 봤듯 적은 수의 데이터를 타 클래스와 유사한 정도로 그 수를 늘리는 것을 의미합니다. 반대로 Undersampling은 타 클래스보다 데이터 수가 많은 클래스의 데이터 수를 줄이는 것을 의미합니다.
이번 문제에서는 Oversampling을 활용할 것이기 때문에 이에 대해 좀 더 알아보겠습니다. Oversampling에는 SMOTE(Synthetic Minority Over-Sampling Technique) 기법이라는 것이 있습니다. 이는 적은 수를 갖고 있는 클래스 데이터들에서 최근접 이웃을 이용하여 데이터를 생성하는 것을 말합니다. 만일 정밀도(Precision)의 감소율을 낮추고, 재현율(Recall)의 증가율을 높이는 방향으로 만들고자 할 때 SMOTE를 활용할 수 있습니다.
위는 SMOTE를 코드로 구현해본 예시입니다.
또한 이 커널에서는 categorical variable들이 서로 상호작용하는 것을 보여주기 위해 함수를 사용했습니다. 보통은 산점도나 막대그래프 등의 옵션을 사용해서 보여주곤 하지만, 위와 같이 생긴 그래프를 보여주는 함수를 자체적으로 만들어서 보여주고 있습니다.
Feature Engineering 과정도 거쳤습니다. 이는 Machine Learning 문제에 대해 타겟에 대해 최고로 잘 표현할 수 있게끔 데이터를 가공하는 과정을 말하는데요, 여기서는 idhogar라는 feature를 그룹화한 다음에 data를 aggregate했습니다. count, max, min, sum 등의 내장함수를 통해 feature engineering하는 과정을 진행했으며 캐글에서의 구체적인 코드는 위와 같습니다.
학습을 위한 Machine Learning 모델링을 할 때는 pipeline을 활용했는데요, Null 값을 채워주는 Imputiong과 Feature들의 크기와 범위를 정규화해주는 Scaling 기법을 사용했습니다. 캐글에서의 구체적인 코드는 위와 같습니다.
또한 가지고 있는 feature들이 많기 때문에 이들 중 어느 feature가 더 중요한 정보인지 그 중요도를 확인하는 과정도 있었습니다.
100개가 넘는 많은 feature들 중에서 The average amount of education in the household 라는 feature가 가장 중요하다는 결과를 얻을 수 있었습니다.
RFECV(Recursive Feature Elimination with Random Forest)라는 과정도 시도했습니다. 이는 앞서 구한 feature importance가 낮은 feature들을 제거해가면서 각 feature 개수마다의 모델 성능을 계산하는 과정을 말합니다. 이 떄 각 feature의 개수마다 k-fold validation 등 cross validation을 활용할 수 있습니다. 평균을 구했을 때 가장 높은 성능을 갖는 feature 개수가 있을 것입니다. 그 때 해당하는 feature들을 최종 feature selection 결과로 사용하는 것이 목표입니다.
마지막으로 소개할 것은 Dimension Reduction 과정입니다. PCA, ICA, TSNE, UMAP 등의 다양한 기법들이 존재하는데 이 커널에서는 이 방식들을 모두 소개합니다. feature들이 너무 많을 때에는 Dimension Curse라는 문제가 발생하곤 합니다. 이를 해결하기 위해 차원의 수를 줄이는 방법을 말하는데요, 차원을 줄이게 되면 효율성을 높일 수 있고, robust한 결과를 얻을 수 있습니다. 또한 사람이 봤을 때 보다 쉽게 잘 이해할 수 있습니다. 커널에서는 여러 차원 축소 방식을 그래프를 통해 비교하여 보여주고 있습니다.
이번에 다룬 커널은 다양한 데이터 분석 기법을 구체적으로 설명해주어 더욱 유익했던 학습이었던 것 같습니다. 앞으로 다른 대회에서도 잘 활용할 수 있을 것 같다고 스터디원들이 모두 공감하기도 했습니다.
이번 문제는 Will Koehrsen의 커널 뿐 아니라 아래의 다양한 예제들도 있습니다. 다른 시각으로 이 문제를 접해보길 원하시면 아래의 커널들을 참고해보시길 추천드립니다.
https://www.kaggle.com/youhanlee/3250feats-532-feats-using-shap-lb-0-436
https://www.kaggle.com/skooch/xgboost
'3-1기 스터디 > 캐글 필사' 카테고리의 다른 글
[6주차] Zillow House Value Prediction (0) | 2021.11.29 |
---|---|
[5주차] Dynamics of New York city - Animation (0) | 2021.11.17 |
[3주차] 자동차 보험회사 데이터분석 (0) | 2021.11.07 |
[2주차] 타이타닉 데이터 분석 : 생존율 예측하기 (0) | 2021.10.17 |
[1주차] 캐글 시스템의 이해 (2) | 2021.10.09 |
댓글