Phase 1이 약 한달간 강의를 통해 공부하는 과정이었다면
Phase 2는 LG에서 제공하는 data를 통해 문제를 해결하는 해커톤 과정이다
(https://dacon.io/en/competitions/official/235927/overview/description)
데이콘이란 기업들이 데이터와 상금을 제공하고, 참여자들이 이를 해결하는 데이터 대회 경쟁 플랫폼이다. 캐글과 유사하지만, 한국의 플랫폼이며 한번쯤은 도전해봐야겠다는 생각이 있었어서 좋은 기회라 생각했다.
우리 주제는 '자율주행 센서의 안테나 성능 예측'이었으며 총 56개의 X feature를 통해 14개의 Y feature를 예측하는 것이였다.
결과적으로 우리 팀은 상위 4%를 달성했으며 첫 데이터 경진대회였던 만큼 많은 것을 배울 수 있었기때문에 그 흐름을 기록하고자 한다.
multi input은 익숙했지만 단 한번도 multi output에 대해 접해본 적이 없었다. 따라서 주어졌던 baseline에서 사용한 MultiOutputRegressor 함수역시 상당히 낯설었기 때문에 다중출력 회귀에 대해서 먼저 공부해보았었다.
https://velog.io/@dangdang2222/MultiOutputRegressor
나는 회귀 모델보다는 신경망 모델들이 조금 더 익숙하기도 했고, X 변수가 많은만큼 회귀 모델로 예측하는데는 한계가 있다고 생각했다. 그래서 신경망 모델로 간단하게 도전을 했었는데 cnn, lstm, bi-lstm, mlp를 사용해보았다. 여기서 그나마 성능이 좋게 나왔던 것은 mlp였다. 왜일까 생각해보았는데 cnn의 경우 공간적(spatial) 정보를, lstm은 시간적(temporal) 정보를 데이터에 반영한다. 따라서 해당 모델들은 각각 시계열, 이미지 영역에서 좋은 결과를 나타내지만 우리 데이터의 경우 이전 혹은 앞으로의 데이터가 현제 데이터에 영향을 미치는 형태가 아니므로 오히려 mlp가 더 성능이 좋았던 것 같다.
정말 다양한 eda를 해보았다. 기본적인 cor부터 다중공선성 plotting, boxplotting 등... 평소 cor를 시각화할때는 x feature 끼리의 상관도를 파악하고 너무 높은 경우 둘 중 하나를 사용하는 등의 전략을 취하거나 단일 회귀/분류의 경우 y feature를 덧붙여서 y feature에 대한 x feature의 상관도를 통해 값이 너무 낮은 x feature를 제거하는 방향으로 사용했다. 이번 데이터의 경우 cor heatmap을 사용했던 방법이 조금 독특했다. 파생변수를 생성하고 그 성능을 평가하는데 어려움을 많이 겪었는데, heatmap을 통해서 상관도의 변화를 파악하며 생성했었고 생각보다 좋은 도움이 되었다. 그 외의 box plotting 같은 경우는 변수도 너무 많고 그 관계들이 명확하지 않아 아무 도움이 되지 못했다. 그러나... 대회가 끝나고보니 다시한번 eda와 그 해석이 얼마나 중요한지 알 수 있었다(8번 참고)
해당 대회는 회귀 대회였지만 특이하게 y 값에 추가 정보가 있었다. y 예측값에 대한 범위가 정보로 주어졌고 그 정보로 pass/nonpass가 갈렸던 것이다. 초반에는 이게 key point라고 생각했었다. train y 회귀 예측값을 주어진 범위로 pass/nonpass를 나누고 이를 따로 학습해보았을 때(y가 pass인 x만 회귀모델로 학습 / y가 nonpass인 x만 회귀모델로 학습) pass만 학습한 회귀 모델의 성능이 너무 좋았기 때문에 분류기가 정답일 것이라 생각하고 만들어보았지만...성능이 좋았던 대신 confusion matrix에서
이런 결과가 나왔다. 대부분의 데이터들이 pass였고, 그 차이가 명확하지 않으니 우리의 분류기는 모두다 pass로 예측해버리는 것이다. 즉 분류기가 의미가 없는 결과가 나왔다! 이후로 14개의 y에 대한 개별 분류기도 만들어보고, 분류 모델이 아닌 nn으로도 만들어보고 automl을 통해서 여러 분류기들을 실험해보았지만 다 큰 의미는 없었다. 유일하게 svm만이 예측 결과에 nonpass가 존재하였으나 성능이 너무 떨어져서 활용하기는 어려웠다.
이런저런 시도가 다 실패하고 다시 원점으로 돌아가서 가장 basic한 회귀모델에 전처리와 파생변수를 더해보기로 했다. 먼저 전처리하면 가장 흔하게 생각나는 scaling, smoothing, drop 세가지를 진행했다. 놀랍게도 scaling과 smoothing은 아무런 효과가 없었고 오히려 성능이 떨어졌다. smoothing의 경우, 시계열 데이터도 아니고 x feature의 소숫점 단위가 y 예측값에 영향을 다수 미치기 때문에 필요없다는 결과가 나왔다. scaling의 경우, 각 x feature의 범위가 다 다르기때문에 필요할 것이라 생각했지만... 왜인지 성능이 떨어지는 결과가 나왔다. x feature를 보면 2개의 feature가 거의 대부분이 0인 결측치 feature들이었다. 당연히 제거하는 것이 맞겠다고 생각했지만 이를 제거하면 예측 성능이 떨어지는 y가 존재했으며, 모든 값이 1로 동일한 feature가 4개 있었지만 이들 역시 제거하면 성능이 떨어졌다. 결측치를 해결하기 위해 보간법도 사용해보고, 분류기를 해결하기 위해(nonpass 데이터가 너무 적어서 성능이 좋지 않다고 판단) oversampling, undersampling도 해보았지만 의미없었다.
여러모로 불편하고 어렵고 힘든 데이터였다.
다양한 시도가 다 실패하고 난 후, 시간은 1주일도 채 남지 않았고 그래서 우리는 14개의 개별 모델에 대해서, 개별 전처리와 개별 튜닝을하기로 했다.
전처리에 대해서는 우선, 모든 값이 1로 동일한 4개의 feature를 drop하고 각 데이터의 1%, 99% 지점을 확인하여 이를 clipping, 그리고 위에서 언급한 방법으로 파생변수를 6개 추가하였다. 이후, xgboost에 대해 RFE를 사용하여 feature 중요도를 ranking하였고 반복문을 통해서 이 feature들이 몇개 포함되었을 때, 가장 좋은 성능을 갖게 되는지를 파악하여 feature selecting을 하였다. 즉 중요도가 높은 상위 몇개의 feature가 포함되었을때 가장 높은 성능을 갖는지를 보는 것이다.
이후 optuna를 통해 튜닝을 시도했는데, 처음 튜닝할때는 fold 없이 진행하여 오히러 성능이 떨어지는 결과를 받게 되었다. 그 이유를, 해당 튜닝이 과적합되었다고 판단하고 kfold를 섞어서 n개의 fold의 rmse 평균이 가장 높은 경우의 튜닝을 최종 튜닝으로 결정하였고 이 과정을 y feature마다 14번 반복하여 최종 output을 만들었다
놀랍게도 feature seleciton + kfold optuna는 public에서 82위(1.93842), private에서 38위(1.95562)를 기록하며 상위 4% 이내의 성적으로 해당 대회를 마감하게 되었다.

public보다 private에서 등수가 높았다는 것은, 우리가 마지막에 택한 kfold optuna 즉 과적합을 방지하기 위한 튜닝이 상당히 의미있었다는 것을 알려준다.
기본 모델을 튜닝하는 과정에서 독특한 점을 발견했었다. traintestsplit을 할 때, shuffle의 default 값이 True이며 과적합 방지를 위해 무조건 shuffle을 하는 것이 옳다고 알고 있었다. 그래서 아무 생각없이 shuffle을 하다가, 어느날 shuffle을 false로 뒀을때 성능이 훨씬 좋았던 경우를 봤다. 이때 이게 중요한 포인트라는 직감이 들어서 나름대로 해석을 했었는데, 그 당시 한참 분류기에 빠져있을 때였어서 거기에 맞추다보니 y feature 값이 pass인 데이터가 예를 들어 test_size=0.2인 경우 상위 80%에 더 많아서, 즉 pass인 데이터를 더 많이 학습하다보니 그런가보다 싶었다. 실제로도 nonpass 데이터들이 하위 20%에 몰려있기도 했었고.
근데 대회가 끝나고 다른 팀들의 insight를 참고하다보니 한가지 간과한 사실을 알게되었다. X feature에 패턴이 있었던 것이다.

EDA를 그렇게 열심히 해놓고 이걸 놓쳤다...
데이터 경진대회를 처음 나가다보니, process 과정도 잘 모르고 생각나는것 먼저 막 시도하다 막히고 포기하고 좌절하기를 반복했던 것 같다. 특히 뭔가 문제를 해결할만한 독특한(?) key point 아이디어를 생각해내기에 바빴지만, 결과를 보면 기본에 충실하기만 해도 충분히 좋은 결과가 나온다는 것을 알게되었다.
이번 기회를 통해 다시한번 eda와 모델 튜닝에 대한 중요성을 알게되었으며 틈틈이 이에 대해 더 공부해보려고 한다.
그래도 좋은 팀원들을 만나서 상위 4%라는 좋은 결과까지 받아낼 수 있어서 한달 고생한 보람이 있었던 것 같다.