-
K-CYBER SECURITY CHALLENGE기타 활동 2020. 12. 26. 02:22반응형
K-사이버 시큐리티 2020 게임봇 탐지 분야에 참가하였다.
아쉽게 4등으로 마무리했지만, 대회 준비 과정에서 배운 점이 많아, 내가 맡은 부분 위주로 정리하려고 한다.
대회 개요
개발해야 하는 AI의 목적은 일반 유저들 사이에 숨어있는 게임봇을 탐지하는 것이다.
데이터 전처리 방식
데이터는 날짜 단위로 묶여 있는 csv 파일을 받았다.
일반 유저와 게임 봇이 섞여 있었기 때문에 유저의 아이디 별로 1차 분류를 진행하였고, 이후 로그 아이디별로 2차 분류를 하여 게임봇의 특징을 탐색하였다.
당시 AI 개발에 대한 경험이 매우 적어, 어떻게 좋은 피처를 뽑을지 막막했었다.
그래서 여러 논문들과 작년 수상작 발표 자료들을 찾아 읽어, 게임 봇에 대한 이해를 높이려고 노력했다.
그리고 여러 가지 가설을 세우면서 피처로 적합한 데이터의 조합을 찾았다.
사용한 피처
1. 이동 좌표 유사도
pdfs.semanticscholar.org/9b39/d298cd4508e645d3ee1fa53bcde0e868e76f.pdf
"자기 유사도를 이용한 MMORPG 게임봇 탐지 시스템" 논문에서
게임봇은 정해진 프로그램에 따라 플레이를 하기 때문에 일반 유저에 비해 동일한 행동을 반복할 가능성이 크다고 한다.
여기서 힌트를 얻어 플레이어 이동에 대한 유사도를 피처로 사용할 수 있을 것이라는 생각이 들었다.
먼저 플레이어의 x, y, z좌표를 시간 순으로 그래프를 찍어 유저와 게임봇의 이동 형태를 확인했다.
위는 게임봇의 이동 좌표에 대한 그래프이다. 그래프의 기울기도 크게 차이나 보이지 않고, 특정 좌표에 여러 번 머물렀다는 것을 확인할 수 있었다.
일반 유저에 대한 그래프이다. 게임봇에 비하면 일정한 규칙이 없어 보인다.
그래서 [x, y, z 좌표에 대한 코사인 유사도 * 중복된 x, y, z 좌표의 비율]으로 피처를 생성하였다.
2. 상점/거래 관련 행동으로 키나 증가/감소한 비율
게임봇 특히 작업장의 목적은 빠르게 돈을 벌기 위함으로 알고 있다.
그래서 게임봇은 많은 시간이 소요되고, 보상이 비교적 던전, 결투 등의 시스템보다, 적은 시간이 걸리는 거래 시스템을 사용하여 키나를 획득/사용했을 것이라는 생각이 들었다.
키나 증가/감소 로그 바로 전 로그의 거래와 관련된 로그일 경우(big_log_id == 200) 거래를 통해 키나를 획득/사용했다고 가정하고, 이에 대한 비율을 구해 피처로 사용하였다.
3. 기타
이외에도 최고 레벨, IP 개수, 아이템 생성량, 아이템 획득량, 아이템 채집량, 경험치 획득량, 비행/활공 거리/시간, 각 로그 아이디별 count, 파티 시간, 네트워크 관련 피처 등을 사용하였다.
(작년 수상작을 참고해서 피처를 추가하였다.)
4. 정규화
유저마다 게임을 플레이한 시간에 차이가 존재했다. Count와 Sum으로 계산한 피처들은 값이 플레이 시간에 영향을 크게 받는다는 문제점이 있었다.
- 시간(160번 로그 count)으로 나눈 피처
- 총 log 개수로 나눈 피처
- 아무런 값으로 나누지 않은 피처
총 3가지 방식으로 모델을 학습을 진행하였고, 그중 시간으로 나눈 피처가 가장 성능이 좋았다.
로그의 개수를 세서 만든 피처와 아이템 채집량, 아이템 획득량 등의 데이터들을 합하여 만든 피처들의 데이터 범위 차이가 꽤 컸었다. 그래서 스케일링을 시도했으나, 오히려 f1 score가 낮아지는 결과가 나왔다.
모델 학습
피처들을 사용하여 여러 모델의 f1 스코어를 계산하였고, 이 중 f1 스코어가 높은 모델들을 뽑아 stacking ensemble를 진행하였다.
feature importance를 구했을 때 나의 예상과 다르게 104번 로그(count)가 가장 중요하다는 결과를 얻었다. 내가 새롭게 만든 피처의 CDF 그래프가 예쁘게 나와서 feature importance가 높게 나올 것이라는 예측을 했는데...;;
모델 학습 시 일반 유저의 데이터의 비해 게임 봇의 데이터가 매우 적었기 때문에 문제가 발생하였다.
초반에는 일반 유저와 게임 봇의 비율을 1:1로 맞춰 학습과 test를 진행했다. 그 결과 test set의 f1스코어보다 제출용 데이터의 f1 스코어가 10% ~ 20% 정도 낮아졌다.
(1:1 비율인 test set 자체에 문제가 있다고 생각하기 때문에 그 test set을 사용하여 얻은 precison, recall 분석은 의미가 없다고 생각이 들었다.)
test set과 제출용 데이터의 게임봇 비율 차이 때문에 이러한 문제가 발생했다고 생각이 들어 유저와 봇의 비율을 10:1로 늘려 다시 학습을 진행했다. f1 score가 0.875라는 좋은 결과를 얻을 수 있었다.
나는 대회를 통해서 실제 온라인 게임의 로그 데이터를 다뤄볼 수 있었다는 점에서 좋은 경험을 했다고 생각한다.
특히 데이터 전 처리하는 과정에서 데이터를 이것저것 뜯어보고 의미 있는 피처를 추출해내는 과정이 나의 적성에 잘 맞았다. 사소한 것 하나하나 가설을 세워 시도해볼 수 있었고, 이에 대한 결과를 그래프로 바로 확인할 수 있어서 재미있었다. (코딩 난이도가 낮기도 했고..ㅎㅎ)
아쉬웠던 부분은 내가 AI 모델에 대한 이해도가 낮은 상태에서 대회를 진행한 점이다. 모델의 원리를 하나하나 비교하면서 게임봇에 적합한 모델을 찾았어야 했는데, 자세하게 몰랐던 덕분에 그냥 가장 성능이 좋은 모델을 선택할 수밖에 없었다.
반응형'기타 활동' 카테고리의 다른 글
라이언의 푸딩 구매 대작전 (0) 2018.09.05