월간 데이콘 행동 데이터 분석 인공지능 AI 경진대회

1등 솔루션 공유

2020.04.15 18:34 6,584 조회

아래는 솔루션 요약입니다.


핵심 IDEA

  • Player0, 1의 종족 순서를 통일하였습니다. 예를들어 T vs Z는 Z vs T과 같은 싸움이기 때문에 T vs Z로 기준을 잡고 Z vs T은Player ID와 종족을 Swap 해주었습니다. 그리고 마지막에 swap한 항목들은 1-prob로 예측값을 바꿔주었습니다.
  • Feature의 개수가 많아 Permutation Importance로 Feature Selection을 해주었습니다. 다만 이 Permutation Importance를 각 Fold마다 따로 적용하여 Fold마다 Feature Selection을 다르게 하였습니다. Fold별로 데이터 형태가 달라서 폴드 마다 하지 않으면 손해보는 FOLD가 생기는 것 같았습니다.
  • LGBM + CAT Ensemble
  • Neptune AI를 활용하여 체계적으로 실험 정리


Feature

  • Player별 Ability Code Count, Diff
  • Selection Unit ID를 활용한 Unique한 Unit 개수
  • 시간 구간별 Event Count Feature
  • RightClick Target 상위 50개 개수 및 diff 값
  • Camera POS X, Y std, min, max, mean
  • ability code 상위 20개를 2개씩 combination DIFF 예를 들면 아래 Feature를 DIFF하였습니다.
'ability_code_5A0_player_0', 'ability_code_1360_player_0'
  • unique한 unit 상위 20개를 2개씩 combination IDFF
'Egg_len_player_0', 'SCV_len_player_0'
  • Ability Code가 첫번째 발생한 시간 100개
  • Ability Code가 마지막에 발생한 시간 10개


Modeling

  • LGBM gbdt
  • StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
  • Catboost


Ensemble

  • LGBM 0.6 + CAT 0.4



시도해본 것들

  • Data Augmentation: 꽤 좋은 IDEA라고 생각하고 시도했었습니다. Data자체도 전체 Sample중에서 10분 이하로 자른 것이기 때문에 Train Data를 GameID별로 Random으로 뽑아서 시간분포를 원래 분포와 비슷하게 혹은 Random으로 잘라서 Augmentation 했었습니다. Event도 비율을 정해서 10%, 20% 등 Random으로 일부 뺐었는데, Data를 많이 빼면 성능이 나빠지고 Data를 많이 빼지 않으면 Overfitting이 심하게 발생했습니다. 적정 비율을 찾으면 좋을 것 같은데 어느정도 해보고 더 시도해보지 않았습니다.
  • Pseudo Labeling
  • Start Position과 Map, 성능 향상이 크지 않아 일단 제외하였습니다.
  • Count를 Time으로 나눠주기
  • Location 정보들로 Aggregation
  • Build Order
  • 종족별로 모델 다르게 만들기
  • Seed Ensemble(성능이 더 좋은데 오래걸려서 최종 제출에서 선택하지 않았습니다.)
  • Player_1, Player_0을 나누지 않고 하나의 Player로 하고 대신 Row별로 Player가 2개가 되도록 함, 즉 같은 game_id에 row가 2개 생기도록.. 성능이 약간 안좋아서 더 사용하지 않음
  • 기타 많은 거쳐간 Feature들..ㅠㅠ



감사합니다.

로그인이 필요합니다
0 / 1000
공놀이하는경찰아저씨
2020.04.15 22:06

솔루션 공유 감사합니다. 혹시 궁금한 것을  여쭈어봐도 될까요?
처음 대회에 참여해보면서 가장 어렵게 느꼈던 부분인데요,
예측에 활용할 feature들을 어떻게 가공할지, 또 어떤 feature들을 어느 정도로 사용할지 전혀 감을 잡을 수 없었습니다.
혹시 이 부분에 대해 약간의 설명을 부탁드려도 될까요?

공놀이하는경찰아저씨
2020.04.15 22:06

예를 들어서 왜 Player별 Ability Code Count, Diff 같은 feature를 사용했는지,
Right Click Target 상위 50개 개수 및 diff 값에서 왜 상위 50개로 추렸는지, 어떤 기준으로 추렸는지 등등...
feature 쪽에서 너무 감이 안잡히고 대회 기간 내내 계속 헤매기만 해서 조금만이라도 설명을 덧붙여 주신다면 감사히 읽겠습니다.

처음해봐요
2020.04.15 23:38

Feature를 만드는 방법은 대회를 많이 해보는 수 밖에 없습니다ㅠㅠ이런류의 Data로 대회를 오래전부터 했었고 하다보면 어느정도 감이 생기는 것 같습니다. Kaggle이나 Dacon 지난 대회 솔루션들 보면서 다양한 Feature 추가 방법을 정리하면 좋을 것 같습니다. 물론 대회에 참여하지 않고 솔루션만 본다면 Feature들이 와닿지 않기 때문에 꼭 대회에 참여하시고 Solution 정리하는 것을 추천드립니다!

처음해봐요
2020.04.15 23:43

Ability Code Count나 Diff를 추가하게된 이유는 제가 파악해본 바로 Ability는 각 StartCraft2의 고유한 행동으로 보였습니다. 예를들어 유닛 생산, 건물 생산, 업그레이드 등을 나타내는 것 같았고 단순히 이런 행동들을 많이 할 수록 게임에 유리할 것 같았습니다.(커맨드센터 개수가 많아질 수록 이길 것 같은느낌??)Diff는 player1과 0의 차이를 넣고 싶어서 추가하였습니다.  상대적인 차이도 중요할 것 같았습니다. 

처음해봐요
2020.04.15 23:50

Right Click Target을 상위 50개만 추린 이유는 Feature가 너무 많아졌기 때문에 적당한 값을 찾고 싶었고 10,20,30 등 실험적으로 찾았습니다. 값을 보면 상위 50개에 안에 주요 Unit이 포함되어 있었습니다. 더 잘하려면 각 Target별로 Winner그래프를 그려서 확실하게 Winner의 분포가 구분이 되는 Right Click Target만 추가해볼 수도 있을 것 같습니다.

공놀이하는경찰아저씨
2020.04.16 14:24

설명 정말 감사합니다! 설명해주신 내용들을 읽고 나니 이번 대회에서 부족했던 부분들에 대한 갈증이 해소되는 기분입니다!

데아트
2020.04.16 14:54

감사합니다 첫번째 발생한 시간을 100개 하셨네요
저 같은 경우 시간값을 그대로 피처로 쓰면 정확도가 떨어지던데 혹시 시간에 역수를 취한다거나 하진 않으셨나요?
그리고 모델링에서 CAT이 아닌 regression 모델도 앙상블 해보셨는지 궁금합니다

처음해봐요
2020.04.16 15:28

따로 역수를 취하진 않고 그대로 사용했습니다. value_counts로 가장 많이 발생한 ability_code 100개를 골랐습니다.  10, 20, 30으로 할 수록 성능이 약간씩 올랐는데 어차피 feature selection으로 할거라서 100개를 몽땅 추가하였습니다. lgbm, catboost외에 다른 모델로 앙상블은 안해보았습니다! 시간이 좀 더 있었다면 NN이나 다른 Linear Model 혹은 lgbm을 regression문제로 바꿔서 stacking 혹은 ensemble을 해보지 않았을까 생각이듭니다!