https://dacon.io/competitions/official/235927/overview/description
2022.08.01 ~ 2022.08.26 이라는 시간동안 Dacon에 참여하였습니다!
[자율주행 센서의 안테나 성능 예측 AI 경진대회]는LG Aimers 교육의 연장선으로, 같이 교육을 들은 분들과 함께 팀을 구성하여 한 달동안 열심히 배우고 적용하는 과정을 통해 제 실력이 많이 성장되었음을 느꼈습니다.
public LB는 1.93842로 82등이었지만, 최종 private LB는 1.95562로 38등입니다!!!! 처음 Dacon에 참여하였는데, 상위 4% 성적을 거두다니 너무 감격스럽습니다ㅜㅜ
팀원들과 함께 수많은 방법론과 다양한 아이디어를 시도하면서 가장 최적의 결과를 낼 수 있는 방법을 생각한 것이 private에서의 좋은 결과로 이어진 것 같습니다. 실제 리더보드에서의 가장 좋은 점수를 얻었던 방법들을 소개해드리고자 합니다. 참고 부탁드립니다
1. 데이터 인사이트 얻기
데이터는 X변수 56개, Y변수 14개가 있습니다. X변수는 공정 과정에서의 변수들로 이루어져 있고, Y변수는 X변수를 이용하여 예측해야할 안테나 gain, 신호대 잡음비 변수로 이루어져 있습니다.
먼저, 안테나 공정 과정의 지식을 얻기 위해 여러 가지 논문을 찾아보고 LG Aimers에서 제공하는 강의를 들으며 몇 가지 파생변수를 만들어 상관관계를 보았습니다. 최종적으로 많은 파생변수를 만들지는 못하였지만, 안테나 핀이 휜 정도가 있다면, 공정상에서 불량일 확률이 크기 때문에 이와 관련된 변수로 파생변수를 만들어보았습니다. 파생변수는 확실히 Y변수와의 상관관계가 더 높게 나타났으며, 실제로 성능이 좋아짐을 확인하고 이 변수를 사용해보았습니다.
특이했던 점은, X10, X11 변수에 0이라는 결측치가 굉장히 많았다는 점입니다. 이 변수를 처리하기 위해 여러 가지 방법들을 생각해보고 적용해보았지만, 역시나 drop 하는 것이 가장 좋다고 판단하였습니다.
이 외에 데이터에서의 인사이트를 얻기에는 변수에 대한 정보가 너무 적었고, 공정 과정을 확실하게 알 수 없어서 많은 부분을 알 수 없었습니다. 제가 알기로는 데이터 전처리가 최종 성능에 많은 영향을 끼치는 걸로 알고 있는데, 매우 아쉬웠습니다.
2. 회귀 모델 선정
기본 base line에서는 Linear Regressor를 사용하여 학습하였습니다. 하지만, 일반적으로 머신러닝 모델 중 성능이 좋은 것은 대부분 트리계열 모델입니다. 이외에도 정말 다양한 모델들을 접하게 되었지만, RandomForestRegressor 와 XGBRegressor 중에서 고민하였습니다. 약간의 더 좋은 성능을 보여주었던 RandomForestRegressor를 사용하고 싶었지만, 시간이 부족했던 점과, 앞으로 모델 하이퍼파라미터 튜닝을 할 때 걸릴 어마어마한 시간을 감당하지 못하고...(팀원 대부분이 기본 colab으로 돌렸습니다.) XGBRegressor를 택하였습니다.
3. Y feature를 어떻게 예측해야할까?
기본 base line을 보면, multioutput regressor를 사용하여 14개의 Y변수를 예측하였습니다. 다양한 방법으로 Y변수를 예측하여도 성능이 크게 좋아지지 않자, 14개의 Y변수를 각각 따로 예측하자는 결론에 도달하게 되었습니다. 그러기 위해서는 Y1 변수에 가장 큰 영향을 미치는 X변수가 있을 것이고, Y2는 이와 다른 또 다른 변수들이 중요하게 선정될 것입니다.
이렇게 각각의 Y에 중요한 영향을 미치는 X변수를 고르고, 그 변수들을 가지고 Y변수들을 하나씩 예측하는 방법을 택하였습니다.
4. X feature select하기
각각의 Y에 대한 X feature select이 필요하였습니다. 저희 팀은 RFE(Recursive Feature Elimination)를 사용하였습니다. feature select을 하는데에는 수 많은 방법들이 있습니다. 하지만, RFE는 모든 feature들로부터 feature를 하나하나 제거해가면서 가장 좋은 성능을 내는 방법이 저희 팀이 원하는 방식과 동일하여 채택하였습니다. RFE를 사용할 때에는 많은 시간이 걸리니 주의하시길 바랍니다..
X변수는 X1, X2, ... 순서로 존재합니다. 하지만, 저희 팀은 Y변수에 대한 X변수의 feature importance 순서대로 모델을 학습시키는 것이 성능이 더 좋아진다는 점을 발견하였습니다. 따라서, RFE를 통해 feature importance를 뽑아내고, 가장 좋은 성능을 내는 feature까지 정하여 Y변수 예측에 사용하였습니다.
5. Hyperparameter 튜닝하기 (Optuna, k fold)
X feature select과 사용할 회귀 모델을 선정하였으니, 이 변수에 가장 잘 맞는 모델의 hyperparameter를 찾는 과정을 진행하였습니다. 저희 팀은 hyperparameter를 찾는 과정이 매우 중요하다고 생각하였습니다. 이 값으로 성능이 많이 차이가 났으며, 적절한 hyperparameter는 저희 팀의 성적을 높여줄 마지막 무기라고 생각하였습니다.
hyperparameter 튜닝 방법으로는 크게 Grid search와 Optuna가 있었습니다. 저는 이번에 Optuna를 처음 알게되었는데요, Grid search는 기존에 사용하였을 때, 몇 가지 변수가 없어도 시간이 너무 오래걸리는 단점이 있어서ㅜㅜ 이번에는 Optuna를 사용하기로 하였습니다. 각각의 Y변수에 대한 NRMSE값을 표로 분석하여 작성하였고, 더 좋은 점수를 가진 hyperparameter로 계속 업데이트해주었습니다. 모두가 밤낮동안 열심히 Optuna를 돌린 결과, 기대할만한 점수를 가지고 리더보드에 올렸습니다. 하지만.. 점수가 예상과는 달리 안좋게 나왔습니다.
저희는 좋은 결과를 가질 것이라고 확신을 하였지만, 안좋게 나온 결과에 대해 분석을 해보았습니다. 제가 내린 결론은 다음과 같았습니다. 저희는 NRMSE 값을 낼 때, train, valid set을 나누었습니다. 이 때, random_state를 고정시켜서 학습한 결과는 해당 train set에 너무 과적합이 되어 최종적으로 다시 모델을 전체 학습시킬 때, 오히려 더 안좋은 성능을 내는 것이 아닌가 였습니다. 이 문제를 해결하기 위해서 K-fold Cross Validation 방법을 통해 전체 train set에 골고루 좋은 성능을 낼 수 있는 hyperparameter를 다시 찾았습니다. Optuna를 사용하기 위해 정의한 함수에 K fold를 적용하였습니다. hyperparameter를 찾는 방법은 다음과 같이 진행되었습니다.
- hyperparameter를 Optuna가 범위 내에서 골라준다.
- K-fold를 이용하여 해당 hyperparameter를 적용한다.
- 결과(NRMSE) 값이 각각의 fold에 나타나면, 이 값들을 평균을 낸다.
- 이 평균값을 토대로, 더 좋은 평균값이 나타날 hyperparameter를 찾는다.
- 1번부터 다시 반복한다.
이 과정은 정말정말정말 오래걸립니다... 참고로 저희는 n_estimators의 범위를 1000 ~ 10000으로 주었기 때문에 더더더욱 오래걸린 것도 있다고 생각합니다.
이러한 과정을 가지고 저희는 최종적으로 private에서 무려 50등정도 더 높이 올라갈 수 있었습니다. 이 대회의 핵심은 데이터와 그 분포를 잘 파악하는 것이 아니었을까 생각합니다. 많이 부족하였지만, 첫 dacon에서 38/1000 의 성적은 정말 짜릿했습니다ㅎ 이 맛에 공부하나봅니다. 이번 데이콘에서 팀원들과 함께하며 정말 공부를 많이 할 수 있었습니다. 이제 저도 어느정도 할 수 있다고 말해도 될련지요ㅎㅎ 실력을 더 갈고 닦아서 최고가 되는 그날까지 도전하겠습니다~!
1달 동안 했던 많은 내용을 생략하고, 간단하게 적으려니 많이 힘드네요ㅜ 계속해서 글을 수정해나가겠습니다!
대회 참여할 때 사용하였던 github 주소는 아래에 나와있습니다. 아직은 private상태이지만 곧 public으로 올릴게요~!
'Competition' 카테고리의 다른 글
[AI CONNECT] 노트북으로 GPT 맛보기 ( 6등 / 418팀 ) (0) | 2023.04.07 |
---|