tak's data blog

배틀그라운드 어뷰징 탐지 Isolation Forest(3) 본문

프로젝트/배틀그라운드 어뷰징 정의 및 분석

배틀그라운드 어뷰징 탐지 Isolation Forest(3)

hyuntaek 2023. 2. 12. 18:35
반응형
SMALL

https://taek98.tistory.com/83

 

배틀그라운드 어뷰징 정의 및 탐지(kaggle 데이터 활용)(1)

실제로 게임을하면서 어뷰징으로 이탈했던 경험과 이를 해결하기 위해 내가 할 수 있는 일은 무엇일까?? 고민하며 게임 어뷰징 탐지라는 분야에 관심을 가지게 되었다. 게임데이터로 어뷰징탐

taek98.tistory.com

지난번엔 어뷰징유저를 aim_point라는 지표를 통해 새롭게 정의하였고, 그로써 어뷰징 유저의 특징들은 무엇을 가지고 있을까? 라는 의문으로 분석하는 과정을 가졌습니다.

 

최근 Isolation Forest기법을 배우고 이를 지난번에 분석했던 데이터를 활용해 다른 인사이트를 도출해보고자 합니다.

 

지난 시간에는 'user_status'변수를 각각 'normal', 'abusing'으로 범주를 지정하였습니다. 하지만 비지도학습 기반을 위해 정답 label을 고려하지 않은 분석을 진행해보겠습니다.

 

간단한 개념 정리는 아래주소에 해두었습니다.

Isolation Forest: https://taek98.tistory.com/97

 

Anomaly Detection-Isolation Forest

출처: https://www.youtube.com/watch?v=puVdwi5PjVA&list=PLetSlH8YjIfWMdw9AuLR5ybkVvGcoG2EW&index=20 기본적으로 소수 범주로 가정 그 객체들은 특정한 속성값들이 굉장히 정상데이터에 속하는 객체들과는 매우 다른 속

taek98.tistory.com

 

 

Isolation Forest

from  sklearn.ensemble  import IsolationForest

isol = IsolationForest(n_estimators=500, max_samples=0.3, random_state=123)
available = ['weaponsAcquired', 'kills', 'killStreaks', 'revives', 'DBNOs', 
'assists', 'not_weapon', 'killPlace', 'aim_point']

data_x = data[available]
data_x.head()

주요 선정 변수들은 지난 시간에 했던 분석 결과를 기반으로 활용했습니다.

 

 

isol_fit = isol.fit(data_x)
isol_pred = isol_fit.predict(data_x)

sum(isol_pred==-1)
# 1878

127,573명의 데이터 중 1,878명을 이상치 유저로 판단했습니다.

 

 

itrain = data.copy()
itrain["isolation"] = isol_pred

isolated = itrain[itrain["isolation"] == -1]
isolated.head()

isol.decision_function(data_x)
# array([0.05579426, 0.05957289, 0.08520675, ..., 0.14555975, 0.12987898,
       0.04708703])
       
itrain['isol_prob'] = isol.decision_function(data_x)

 

 

이상치 유저의 특징 확인

plt.figure(figsize=(12,14))
plt.scatter(itrain['weaponsAcquired'],itrain['aim_point'], 
            c = itrain['isolation'], s=-5*itrain['isolation']+8, alpha=0.8)

 

보라색 유저들이 이상치로 탐지한 유저들입니다.

- 무기획득이 많은 것에 비해 헤드샷 비율이 낮은 유저들을 이상치로 판단했습니다.

마찬가지로 보라색유저가 이상치로 탐지된 유저들입니다.

- 타유저에 비해 데미지를 많이 입힌 유저들을 이상치로 판단했습니다.

 

 

유저별 추가 특징 분석

plt.figure(figsize=(20,10))
plt.title('유저별 입힌 데미지', fontsize=20)
sns.distplot(itrain[(itrain['isolation'] == -1)]['damageDealt'], color='tomato')
sns.distplot(itrain[(itrain['isolation'] == 1)]['damageDealt'], color='skyblue')
plt.xticks(fontsize=20); plt.yticks(fontsize=20)

- 빨간색 분포가 이상치유저입니다. 전체적으로 높은 데미지 분포를 가지고 있습니다.

 

- 이상치유저(-1, 좌)이 헤드샷의 비율이 높은편에 분포함을 확인할 수 있었습니다.

 

- 이상치 유저들이 최대 예상 등수가 0에 많이 몰려있습니다. 높은 등수가 예상되는것으로보아 이전 게임 기록들이 좋았음을 알 수 있습니다.

- 이상치 유저들은 걸어서 이동한 거리가 상대적으로 낮게 분포합니다.

- 이상치 유저들은 무기 획득수가 높은 곳에도 분포함을 확인할 수 있었습니다.

 

 

여기까지 Isolation Forest를 활용한 추가 분석이었습니다. 데이터의 목적이 등수 예측이므로 이상치 탐지랑은 거리가 있었지만, 위와 같은 인사이트를 내릴 수 있었습니다.

 

 

 

지난 분석과 다른 결론

- 이상치 유저들은 무기획득수가 많은 편에 속하지만 헤드샷 성공비율은 낮다.

- 이상치 유저들은 killStreaks(짧은 시간안에 적을 동시 처치)가 높은편에 분포한다.

- 이상치 유저들은 타유저에비해 입힌 데미지가 높은 편이다.

 

지난 분석과 같은 결론

- 어뷰징 정의에 쓰였던 aim_point가 이상치유저가 좀 더 높은 분포를 가진다.

 

 

 

아쉬운 점

- 실제 이상치를 탐지해서 해결하고자하는 과제가 있을 때 활용해보고 싶다. 그러지 못한 것이 아쉬움

- label이 이상치로 정해졌을 때 분석하면 눈에 띄는 결과가 있지 않을까 생각함

 

 

 

참고자료:

https://medium.com/towards-data-science/outlier-detection-with-isolation-forest-3d190448d45e

https://brunch.co.kr/@freakanalyst/30

 

반응형
LIST