Intro
거창하게 6월 로드맵을 새워서 주 6~7회의 포스팅을 생각했던 과거의 나는 여러 변수를 고려하지 않은 듯하다. 포스팅이 멈춘 기간 동안 covid-19에 걸린 것은 아니지만, 접촉자가 되어 자가 격리에 들어갔었다. 타이밍이 안 좋게 본가에 방문했을 때 진행되어 아무것도 못한 채 오랜만에 휴식을 가졌다. 오래간만에 즐긴 휴식이라 스스로를 돌아볼 수 있는 시간이었다.
잡설은 뒤로 하고 어느새 데이터 경진대회가 마감된지 한 달째다. 교육을 위해 제공된 데이터가 아니라 실제 실무에서 쓰일 수 있는 데이터를 다뤄본 경험이 처음이라 벽에도 부딪히고, 굉장히 흥미로운 시간을 보냈었다. 끝나고 그러한 기억들을 남기고자 후기와 습득한 여러 지식에 대한 포스팅을 진행하려 했으나, 일상에 치이다 이제야 올리게 되었다.
네트워크의 여러 프로토콜을 오랜만에 올리는 포스팅으로 작성하기에 부담이 되기에 새로운 대회 출전에 앞서 이전 대회를 정리하고자 한다. 조금 더 스케일이 큰 대회에 참여하게 되었으며, CNN쟁이에게 낯설었던 데이터 사이언스 대회가 아닌 새로운 종목으로 출전하게 되었다. 다행히 주전공인 영상처리 주제가 선정되어 좀 더 자신감을 갖고 있다.
새로운 대회를 전력으로 준비하기 위해 이전 대회에 대한 기억은 추억으로 남기려 한다. 전체적인 진행 과정 및 결과, 그리고 수상자의 결과와 비교하며 포스팅을 마치겠다.
FLOW
데이터 분석 및 모델을 설계하는 과정은 학부 수준에서 정제된 데이터를 이용해 진행했던 과정 이후로는 처음이었다. 따라서 전체적인 그림을 보기 위해 위와 같은 과정을 수립해 차근차근 진행했었다.
EDA
EDA는 데이터 분석 과정이다. 데이터 분석을 통해 방향을 수립하고, 전처리 방법을 결정했다. 특히 데이터의 특성을 파악하는데 집중했다. EDA 결과 얻은 결론은 아래와 같다.
- Tabular Data Binary Classification
- Score by F1 beta score
- Ordered by continuous time and device number
- (Y=0 : Y=1) = 85% : 15% → Imbalanced Data
F1 beta score를 사용한다는 점에서 Y값 분석에 들어갔다. 결과적으로 85:15의 비율을 보이는 불균형 데이터셋이었다. 이를 보고 후에 전처리 과정에서 over sampling을 기반으로 한 알고리즘의 적용이 필요함을 생각할 수 있었다. 주어진 데이터셋의 가장 큰 특징은 서로 다른 A, B, C가 있다고 하면, A에 대해 24시간 측정 결과, B에 대한 24시간 측정 결과, 그리고 C에 대한 24시간 측정 결과 순으로 정렬돼있었다. 이를 보며 엄청난 양의 데이터셋을 압축시킬 수 있지 않을까 생각했다. 두 가지 방안이 있었다.
- 텐서 형식으로 데이터셋을 변형해 CNN 혹은 convolution을 이용해 robust한 모델 설계
- 중요한 시점, 혹은 변화율 등을 이용해 A, B, C에 대해 1 row로 만들 수 있다. 이 과정을 거치면 약 100만 개가 넘는 row를 약 2만 개로 줄일 수 있다.
이를 모두 적용시켜 팀원과 분담해 테스트를 진행했다.
Feature Selection
너무 많은 Feature 개수로 인해 트레이닝 속도나 정확도에서 문제가 있었다. 약 20개의 feature에서 뭐가 중요한지 파악하기 위해 아래와 같은 과정을 거쳤다. 이 과정에서 이론과 괴리를 느꼈고, 문제가 발생했다고 생각한다.
- Correlation Coefficient
- Multicollinearity
- PCA or Drop
상관계수를 통해 결과값에 큰 영향을 미치는 feature들을 추려냈다. 2개의 feature가 0.80 이상의 높은 수치를 기록했다. 이 두 feature만 이용해도 정확도 80% 이상의 모델을 만들 수 있을 것이다. 하지만 목표는 100%에 가까운 수치를 원하기 때문에(절대 100%는 될 수 없을 것이다.) 이를 근거로 feature를 줄여 나가기 시작했다. 서로 상관관계를 가진 feature set에서 두 번째로 다중 공선성을 확인했다. 이 feature들이 실제로 서로 독립적이지 못하고, 종속적으로 존재하는지 확인했다. 이 결과 몇 개의 feature를 지워낼 수 있었다.
이후에 PCA를 통해 두 가지를 확인했다.
- 최적의 feature 수는 몇 개인가?(95% 이상을 표현할 수 있는 차원의 수를 구했다.)
- 상관 관계는 있지만, 다중 공선성은 나타나지 않는 feature들을 하나의 차원으로 줄일 때 손실이 얼마나 생기는가?
이러한 과정을 거치며 feature의 개수를 줄여 나갔다. 위의 과정들은 Data Science 카테고리에서 좀 더 자세히 다뤄보겠다.
Preprocessing
하나의 row로 데이터셋을 활용한 방법과 텐서의 형태로 활용한 방법에 따라 두 방향으로 진행했다. 텐서의 경우 CNN에서 사용할법한 기법들을 가져와 사용했다. 반대로 하나의 row로 이용한 방법은 데이터를 압축한 만큼 제거된 row들에 대한 정보를 대표할 수 있는 feature를 추가해줬다.
우선 텐서로 활용했을 때 전처리 과정은 다음과 같았다.
- Padding
- Normalizing
- Random Sampling
- SMOTE(over-sampling)
- Split Data with train, test, and validation set
데이터를 압축해 하나의 대표 row로 각각을 활용했을 때 전처리 과정은 다음과 같았다.
- Normalizing
- New Feature with derivative
- SMOTE(over-sampling)
Model
모델 선정의 경우 가장 분업을 잘 했다고 생각한다. Logistic Regression에서 시작해 기존에 있던 모델을 이용해 테스트를 진행했으며, 팀원은 NN을 이용해 자체적인 네트워크 설계에 힘을 썼다. 결과적으로 기존에 있던 모델을 활용했지만, NN을 활용한 시행착오가 없었으면, 확신할 수 없었을 것이다.
모델 선정을 위해 테스트해본 모델들은 다음과 같다.
- NN
- LSTM
- Logistic Regression
- XGBoost
- LightGBM
우선 구현이 쉽고, 자신이 있는 Logistic Regression을 통해 feature를 옳게 선정했는지 검증했다. 그 후에 Imbalance Data 처리 및 조절이 가능하고 성능이 좋은 XGBoost로 방향을 틀었다. 이후에 XGBoost의 장점을 계승하고, 기능이 다양해져 다양한 parameter 조정이 가능한 LightGBM으로 모델을 최종 결정하게 되었다.
또한, Scikit-learn의 GridSearchCV를 활용해 적절한 parameter를 찾아나갔다.
Result
최종적으로 두 개의 평가 데이터셋에서 F1 beta score 96.95, 97.5의 결과를 얻었다. 학부때 접하지 못했던 높은 수치였지만, 아쉽게 수상에 실패했다. 수상권의 경우 98~99 후반의 높은 점수를 얻었다.
자체적으로 분석을 진행했을 때 이상한 부분이 몇 가지 있었다. 우선 SMOTE를 활용하기 전과 후에 정확도에 큰 차이가 없었다. 다른 방식으로 Imbalanced Data를 해결했어야 되는 것 같다. 또한, 시간이 부족해 validation을 가장 간단하게 진행했다. 그러나 이 부분에서 오히려 validation set에 대해 약한 over fitting이 발생하지 않았나 싶다. 마지막으로 hyper parameter tuning을 정밀하게 진행할 시간이 없었다. 수상권의 점수를 보니 이 부분 역시 크리티컬 하지 않았나 싶다.
Next
이 포스팅의 Next는 Data Science 카테고리와 이어진다. 이번 대회를 참여하며 얻었던 지식들에 대해 실제 데이터셋을 활용해 포스팅하겠다. Skewed data(Imbalanced data)를 활용해 이번 대회를 진행한 Flow로 재현해 나가겠다. 좀 더 개선된 결과를 얻는 것을 목표로 하며, 이번 포스팅에서 보이지 못한 데이터 분석의 묘미, 시각화(visualization)을 많이 보여주도록 하겠다.
바쁜 일상의 연속이다. 빠른 시일 내에 다음 포스팅을 이어나갈 수 있도록 노력하겠다.