Introduction
빅데이터분석방법론 수업 프로젝트
Steam 게임 태그로 Clustering
BearHunter49/steam_gametag_kmeans
-
🍏 Environments
-
📗 Libraries
문제 접근
학기 중 수업, '빅데이터분석방법론' 수업 때 했던 프로젝트이다. 주제는 자율 주제라, 아무 주제나 선정해도 됐다(물론 AI쪽).
평소 Steam 게임을 하면서, 재밌게 플레이 했던 게임과 비슷한 게임을 찾는 과정이 별로였던 기억이 났다. 게임별로 테그도 주고, 비슷한 게임을 추천해 주기는 하는데 생각보다 비슷하다기 보단, 그냥 같은 범주에 들어가면 추천해 주는 것 같았다. 마침 평소 해보고 싶었던 프로젝트라 주제 선정에 큰 어려움은 없었다. 결국 프로젝트 주제는 'Steam Game Tag를 통한 Clustering'.
Clustering은 비지도 학습의 일종인데, 비슷한 데이터끼리 군집화(그룹화)를 이루는 학습 방법이다. 따라서 Steam 게임들의 태그를 수집하고 각 태그가 속성(Attribute)이 되도록 한 뒤, 군집화 알고리즘을 적용하면 되겠다 싶었다. 그리고 군집화 중 가장 유명한 K-means 알고리즘을 적용하였다.
과정
- 데이터 수집
- 먼저 데이터 수집을 위해 Steam 홈페이지에서 데이터를 크롤링하기로 했다. 하지만 Steam에 등록된 게임이 워낙 많아서인지, 모든 게임 목록을 보여주는 창이 없었다! 단지 인기 순으로 정렬된 게임, 현재 세계 사람들이 플레이중인 게임 등 상위 게임들만 보여지도록 있었다(하긴 게임만 몇십 몇백만개 있을테니...). 따라서 현재 플레이 중인 게임(묻히지 않은 게임들)을 수집 대상으로 삼았다.
- 하지만 또 문제가 발생했다. 어떤 창의(인기 게임) 게임들은 한 게임 당 태그가 열 몇가지가 달려있는가 하면, 현재 플레이중인 창의 게임들은 한 게임 당 태그가 3~5개(상위 태그)만 달려있었다. 즉, 내가 크롤링 하려던 창에서는 태그가 3~5개 밖에 수집이 안됐던 것이다(왜 다르게 해놨지...). 하지만 단순히 해당 게임의 전체 태그 중 몇 개를 뽑은 것이 아니라, 그 게임에 대해 가장 사람들이 많이 찾는 태그 3~5개를 추려논 것이었다. 따라서 게임의 특징을 더 잘 나타낼 수 있겠다는 판단이 들어 그대로 진행하게 됐다.
- 크롤링 자체는 requests로 빠르게 사용하려 했지만, 반응형 페이지라 결국 selenium을 사용했다(느리긴 하더라...).
- 또 문제가 발생했다(아닠)! 게임 태그 종류도 모으기 위해, 게임 태그 창(Steam 페이지 중 있다)에서 태그들을 다 긁어다가 내가 수집한 데이터에 Onehotencoding을 시켰는데, 불일치 하는 태그들이 나왔다. 즉, 스팀 태그 페이지에서 수집한 약 160가지 태그와 내가 수집한 약 15000개 게임의 태그랑 다르다는 것이다(...). 헛걸음을 뒤로하고, 수집한 게임 데이터의 태그 종류를 모았다(약 380개 태그가 나왔다).
- 데이터 전처리
- Onehotencoding을 이용하여 단순하게 처리했다. 태그들이 속성이 되어 없으면 0, 있으면 1 이런식으로... 하지만 비효율적이라고 생각한 것이, 정작 한 게임당 태그는 3~5개인데, 총 속성 개수는 380개 가량이다. 0인 데이터가 너무 많아지는 것 아닌가..?
- 군집화
- scikit-learn 라이브러리의 K-means를 사용하였다. 그룹은 최종적으로 64개로 결정했는데, 실험적으로 얻어낸 타협안이다. 100개 넘게 해보고, 50개 밑으로도 해보았지만 직접 군집화된 데이터들을 살펴보니 64개 정도가 가장 정확도가 좋았다(물론 내 기준에서)! 나름 유명한 게임들은 잘 알고 있어서, 직접 묶인 게임들을 보며 판단했다. 하지만 1만개가 넘는 것을 내가 단편만 보고 판단했다기엔 무리가 있을수도..?
- 시각화
- 시각화 툴은 scikit-learn의 TSNE를 적용하여 matplotlib로 했다. TSNE란 차원 감소 기법의 일종인데, PCA의 경우 차원 감소를 시키면 군집화된 데이터들이 분별력이 사라지는데(선형적으로 사상되버리니) TSNE는 거리를 기반으로 비선형적으로 축소를 한다고 한다. 그래서 차원을 줄여도 군집화가 유지된다고 한다(자세한 것은 더 공부해봐야 알 것 같다). 따라서 2차원이나 3차원으로 축소시켜 시각화 하기에 많이 쓰인다고 한다.
(단점으로는 차원 감소시켜서 데이터 피처로 학습시키기엔 별로라고 한다.)
시각화