///
Search
👹

AI

태그
AI
Major
CS

기계학습 기초와 실습

학점: B+

기타 과목들

산업 데이터 사이언스 개론
A0
통계적 기계학습
A+
추천 시스템 및 그래프 기계학습
A0
통계적 데이터 사이언스 응용
Final_report_Group7_합본.docx
3692.1KB
해당 프로젝트에서 롤 데이터를 기반으로한 데이터 분석 및 ML 모델 개발에 참여하였습니다. 해당 프로젝트는 롤 게임 데이터를 기반으로 클러치 플레이를 발견하는 것을 목표로 게임 내의 이벤트 데이터에 대해서 클러치 플레이인지 아닌지를 발견하는 것이 목표입니다.
우선 클러치 플레이인지 아닌지의 여부가 없기 때문에 이를 만들어내는 것이 중요했습니다. 하지만 모든 플레이 영상을 보고 수동으로 데이터를 annotate 할 수 없었기 때문에 게임 내의 이벤트 데이터를 통해 특징적인 playstyle을 발견하고 각 playstyle 별로 PCA Score를 매겨 그 분포를 기반으로 High, Mid, Low로 나누었습니다.
이렇게 만들어진 Label에 대해서 Random Forest 모델에 모든 Feature를 넣은 후 Label을 예측하게 하였습니다.
My Contribution
여기서 저는 다음과 같은 contribution을 하였습니다.
Data Analysis & Visualization
초기 분석 시에 다음과 같이 clutch play를 ‘비등비등하다가 갑자기 Gold 또는 킬이 많이 벌어지게 하는 플레이’로 정의하고 이에 해당하는 게임을 찾았습니다.
이후 분석에서는 Game Time이 진행됨에 따라 각 Metric이 어떻게 변하는지를 분석했습니다.
특히 이전 시간대와 현재 시간대에서 얻은 Gold나 킬의 차이를 Gain이라고 정의하고 이의 분포를 분석했습니다.
Gain By Time (Trend)
Gain Distribution By Time
위 BoxPlot을 binning 한 것입니다.
이를 보게 되면 확실히 시간이 지날 수록 Diff가 커지게 되며 binning distribution에 대해서도 variance가 커짐을 알 수 있습니다. 이를 통해 게임의 후반부로 갈수록 승부를 확실하게 벌리는 큰 Gain의 플레이가 많이 나옴을 알 수 있습니다.
Gain Diff(Blue-Red)
시간에 따른 Blue-Red 팀의 점수 차를 분석하기 위함입니다.
각 팀의 Gain을 시간대별로 구한 다음, 그 차이를 나타낸 것입니다. 이를 통해 블루 팀이 진 경우 음의 Diff가 이긴 경우 양의 Diff가 나오게 됩니다.
위의 Trend 결과를 바탕으로 생각했을 때, 해당 그래프가 쌍봉 낙타 형식의 그래프가 나올 것이라 생각하였는데, 이를 정확히 반영하였습니다.
RoldGroup 별 Gain
기존의 역할군이 측정하는 Metric에 의해서 잘 구분이 되는지 확인해보고자 하였습니다. 이를 확인하기 위해 각 RoleGroup 별로 구분되는 특성이 모든 TimeInterval에 대해서 일관되게 나타나야합니다. 결과는 아래처럼 모든 TimeInterval에 대해서 각 RoleGroup 간의 관계가 비슷하게 나타났습니다. 이를 통해 RoleGroup을 기반으로 playstyle을 가정해도 되겠다는 결론을 얻었습니다.
분석에 사용된 코드는 아래 링크에서 확인할 수 있습니다.
데이터 전처리
이후 이벤트 기반의 새로운 private data를 확보함에 따라 해당 데이터 전처리를 맡았습니다.
기존 데이터는 게임 내의 데이터가 csv 파일의 컬럼에 잘 정리되어있는 예쁜 형태였다면, raw data는 모든 데이터가 json형식으로 저장되어있는 형태였기에 이를 분석하여 parsing 해줘야했습니다.
이를 위해 bracket을 열고 닫는 걸 체크해서 Json을 split하는 간단한 코드를 통해 게임별 JSON을 만든 다음, 이를 다시 데이터의 특성에 따라 participants_frames.csv와 events.csv로 분리하였습니다.
이후 Object를 획득하는 이벤트 중심으로 time window를 정해 그 안의 Kill Event를 위주로 살펴보기로 결정한 후, 다음과 같은 아이디어를 제시하였습니다.
먼저 모든 feature를 사용하여 클러스터링을 시도합니다. 이 때 실루엣 점수가 잘 나오는 방향으로 feature engineering을 진행합니다. feature engineering 과정으로 feature selection 또는 PCA를 시도할 수 있습니다. ( 이 과정의 실제적인 진행은 저희 팀의 다른 분이 해주셨고 Random Forest의 Feature Importance를 기반으로 분석하셨습니다. )
이후 분리된 클러스터링에 대해서 다시 한 번 PCA를 진행합니다. 이를 통해 해당 클러스터 내의 포인트들을 가장 잘 구분하는 feature vector를 찾게 됩니다. 이를 통해 PCA Score가 높은 데이터들이 전체에서 해당 플레이스타일에서 상위권으로 바라보며 이를 이용해 High, Mid, Low로 라벨링합니다. ( 이 과정은 제가 진행하였습니다.) 그리고 최종적으로 모든 feature를 이용한 Random Forest 모델로 High, Mid, Low 라벨을 예측합니다.
이 과정에서 각 클러스터 별로 PCA 벡터가 비슷하지 않아야할 것 같아, cosine similarity로 비교해본 후, PC2를 도입하기로 하였습니다.
이후 PC Score에 대한 분포를 보면 예쁘게 normali distribution을 따르는 것을 알 수 있습니다.
최종적인 classifier의 점수는 다음과 같습니다.
New Attempt
이후에는 object를 먹은 이벤트를 분류할 때, object를 먹은 팀이 한 행위는 모두 positive sample, 못 먹은 팀은 negative sample로 놓고 contrastive learning을 진행해보았습니다.
Contrastive Learning의 경우 Event를 EventEncoder를 통과시킨 후 Representation을 구하게 되는데, 이 때 Negative와 Positive는 서로 멀어지게, 그리고 각각은 가까워지게 학습을 시킵니다. 이후 FFN을 이용한 간단한 classifier를 만든 후에 이전에 구한 representation을 통과시켜 최종적으로 예측합니다. 해당 classifier는 입력으로 들어오는 이벤트가 positive인지 negative인지를 맞추는 간단한 classifier입니다. 추론 시에는 test data를 encoder, classifier에 통과시켜 순차적으로 예측합니다.
이 때 Loss의 경우 NT-Xent Loss를 사용하며 데이터 증강을 feature에 대해서 noise를 주는 식으로 진행하였습니다. 이 때 NT-Xent Loss는 증강된 데이터 외에 한 batch에 들어오는 모든 데이터에 대해서는 음성 쌍으로 간주합니다.
결과는 다음과 같습니다.
Accuracy: 0.6058 Precision: 0.6232 Recall: 0.6312 F1 Score: 0.6272 ROC AUC: 0.6045
Java
복사
다만 이 방법은 현재처럼 명확하게 positive와 negative가 존재하는 상황에서는 좋은 구현이 아니라고 판단하였습니다. 따라서 라벨이 있는 상태에서 진행하는 SupCon으로도 진행해보았습니다.
SupCon에 대한 설명은 다음 링크에서 자세히 확인할 수 있습니다.(https://hyen4110.tistory.com/76)
classifier는 binary classification이므로 logistic regression을 사용하였습니다.
결과는 다음과 같습니다.
precision recall f1-score support 0 0.81 0.81 0.81 51771 1 0.83 0.83 0.83 57270 accuracy 0.82 109041 macro avg 0.82 0.82 0.82 109041 weighted avg 0.82 0.82 0.82 109041
Java
복사
이전의 self-supervised learning 기반의 contrastive learning 보다 성능이 올랐음을 파악할 수 있습니다.