tak's data blog

배틀그라운드 어뷰징 탐지 모델링(2) 본문

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

배틀그라운드 어뷰징 탐지 모델링(2)

hyuntaek 2022. 12. 8. 19:52
반응형
SMALL

 

지난 시간에는 아래와 같이 kaggle데이터를 활용해서 직접 어뷰징 유저를 정의하고 분석하는 과정을 가졌습니다.

https://taek98.tistory.com/83

 

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

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

taek98.tistory.com

 

직접 정의한 어뷰징 유저들을 기반으로 이제는 모델링을 진행해보도록 하겠습니다.

우선 데이터의 특성상 불균형한 클래스를 가지고 있었습니다. (0은 일반유저이고 1은 어뷰징유저입니다.)

 

아래 내용 출처: https://www.youtube.com/watch?v=Vhwz228VrIk&t=419s

 

이 상태로 분류 모델을 실시한다면 모델 성능에 왜곡이 생길 수 있습니다.

아래와 같은 표를 보면 

Confusion matrix 예측
 
실제
 
  이상 정상
이상 5 5
정상 0 40

Accuracy(정확도) = (5 + 40) / (5 + 5 + 0 + 40) = 45/50 = 0.9

로 높지만 실제로 이상인 것 중에 반 밖에 성공하지 못함을 알 수 있습니다.

 

그래서 저는 이를 해결하기 위해 2가지 방안을 적용해보았습니다.

 

 

해결 방안

 

1) 언더샘플링

다수 범주를 줄여서 소수 범주와 비슷하게하는 기법

 

Random undersampling

 다수 범주에서 무작위로 샘플링(무작위로 샘플링하기 때문에 할 때마다 다른 결과)

 

장점: 다수 범주 관측치 제거로 계산 시간 감소, 데이터 클렌징으로 클래스 오버랩 감소

단점: 데이터 제거로 인한 정보 손실 발생

 

2) 오버샘플링

소수 범주를 증폭시켜 다수 범주와 비슷하게

 

Random oversampling

소수 범주 내 관측치를 증폭시키는 것

단점: 소수 클래스에 과적합이 발생할 가능성이 있음

-> 보완책으로 가상의 관측치 생성

 

장점: 정보 손실이 없음, 대부분의 경우 언더샘플링에 비해 높은 분류정확도를 보임

단점: 과적합 가능성, 계산 시간이 증가, 노이즈 또는 이상치에 민감

 

 

모델링 과정(랜덤포레스트 모델 사용)

모델 사용 이유: 트리 시각화로 추후에 협업에 직관적으로 도움이 될 수 있으므로

그리고 프로젝트의 목적은 모델 성능을 무조건적으로 높여보는 것보다는 어뷰징과 관련된 모델링 기술을 하나씩 써보며 배워가는 것에 초점을 두었습니다.

 

 

0. 샘플링 없이 실행했을 경우

from sklearn import metrics    
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score
from sklearn.metrics import plot_confusion_matrix
from sklearn.metrics import accuracy_score, precision_score,recall_score, fbeta_score
#from sklearn.model_selection import GridSearchCV
from imblearn.under_sampling import *
from imblearn.over_sampling import *
#from imblearn.combine import *

x = df_train
y = df['user_status']

# stratify의 유무(계층적 데이터 추출)
x_train, x_test, y_train, y_test = train_test_split(x, y,stratify=y, test_size=0.3, random_state=7)

rfc = RandomForestClassifier(random_state=2022)

rfc.fit(x_train, y_train)
y_pred = rfc.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
fbeta = fbeta_score(y_test, y_pred, beta=0.2)

print(fbeta, accuracy, recall, precision)
0.05473684210526315 / 0.9507472826086957 / 0.0026666666666666666 / 0.25

# 클래스의 비율
y_train.value_counts()
0    84927
1     4374

 

오 뭐야? accuracy가 0.95네 예측을 잘했구나!라고 판단하면 안됩니다. confusion_matrix를 보시면 전체 test데이터 셋에서 실제 어뷰징 1,875명 중 예측한 값은 20명밖에 되지 않고 그 중에서도 5명밖에 맞추지 못했기 때문입니다.

 

그래서 모델의 성능에 왜곡이 되었다고 볼 수 있습니다. 위와 같이 recall값과 precision값의 차이가 크면 가중치를 다르게 주어 점수를 내는 f beta score를 활용하면 된다고 공부할 수 있었습니다. f beta score에서 가중치는 도메인이나 데이터에 따른 기준이 또 존재해야 한다더군요. 

 

f1 score와 fbeta score는 다음과 같은 수식으로 서로 관계가 있습니다. 

결국 fbeta score는 beta값이 1보다 크면 recall에 1보다 작으면 precision에 가중치를 준다는 의미입니다.

 

하지만 저는 precision을 주요 지표로 판단하기로 하였습니다. 그 이유는 어뷰징이라고 예측한 것들 중에 실제 어뷰징인 것의 비율로, 일반유저를 어뷰징으로 분류해서 제재를 가한다면 피해를보는 유저가 생길 수 있기 때문입니다.

 

 

1. 오버샘플링

1-1. 랜덤오버샘플링

X_resampled, y_resampled = RandomOverSampler(random_state=0).fit_resample(x_train, y_train)

print(fbeta, accuracy, recall, precision)

0.22571428571428576 / 0.9475857023411371 / 0.042133333333333335 / 0.27335640138408307

y_resampled.value_counts()
0    84927
1    84927

train데이터 셋에서만 샘플링을 진행하고 나머지는 똑같이 실행하면 됩니다.

오, 확실히 precision값이 높아졌을 뿐만 아니라 예측되는 숫자에서도 차이가 있네요.

 

 

1-2. SMOTE

X_resampled, y_resampled = SMOTE(random_state=0).fit_resample(x_train, y_train)

print(fbeta, accuracy, recall, precision)

0.2279528403001072 / 0.8982023411371237 / 0.4362666666666667 / 0.2236806125239267

y_resampled.value_counts()
0    84927
1    84927

랜덤오버샘플링보다도 더 많은 예측과 실패를 보여주었습니다.

 

 

2. 언더샘플링

2-1 랜덤언더샘플링

X_resampled, y_resampled = RandomUnderSampler(random_state=0).fit_resample(x_train, y_train)

print(fbeta, accuracy, recall, precision)

0.17186618299072956 / 0.896686872909699 / 0.8746666666666667 / 0.16651436694080618

y_resampled.value_counts()
0    4374
1    4374

랜덤언더샘플링의 경우 수많은 유저를 어뷰징으로 예측했지만 그만큼 선량한 유저가 속해있네요..

 

 

언더샘플링의 경우 자칫 중요할 수 있는 정보들을 많이 잃을 수 있다는 가능성이 있으므로 최종적으로 오버샘플링을 선택하려합니다. 오버샘플링을 기준으로 앙상블 모델을 실시했을 때의 성능은 다음과 같습니다.

 

 

3. 앙상블

X_resampled, y_resampled = SMOTE(random_state=0).fit_resample(x_train, y_train)

log_model = LogisticRegression()
rnd_model = RandomForestClassifier()

voting_model = VotingClassifier(
    estimators=[('lr',log_model),('rf',rnd_model)], # 2개의 약한 학습기
    voting='hard' # 직접 투표(hard voting)
)

# 앙상블 모델 학습
voting_model.fit(X_resampled,y_resampled)

# 모델 비교
for model in (log_model,rnd_model,voting_model):
    model.fit(X_resampled,y_resampled)
    y_pred = model.predict(x_test)
    print(model.__class__.__name__," : ",precision_score(y_test,y_pred))
    
LogisticRegression  :  0.09009487666034155
RandomForestClassifier  :  0.22401289282836423
VotingClassifier  :  0.2220609579100145

랜덤포레스트와 로지스틱회귀분석을 앙상블한 결과입니다. 앙상블이라고 무조건적으로 좋은 결과를 내는 것은 아니군요

 

 

4. 비용 기반 -> Cost sensitive learning

모델링에서 범주에따른 가중치를 주는 것이라 해석하였습니다.

rfc = RandomForestClassifier(random_state=2022, class_weight='balanced')

위와 같이 class_weight을 조정하면 됩니다. 결과는 차이가 없어서 해석하지 않도록 하겠습니다.

 

 

feature importance

변수중요도의 경우는 다음과 같습니다. kill과 관련된 변수가 주요했음

 

 

 

여기까지 샘플링에 따른 모델링 과정을 간단하게 실시해보았습니다. 확실히 언더샘플리이나 오버샘플링이 기존의 것보다는 효과가 있다고 판단할 수 있었습니다. 기존에 등수예측이라는 목적과 다르게 어뷰징유저를 직접 정의하고 판단하는 과정에서 도메인 지식을 활용한 어뷰징 정의나 모델링시 주의할 점 등 많은 것을 배웠습니다. 추후에 실제 게임데이터를 기반으로 활용해보도록 하겠습니다.

 

 

기억해야할 점

1) 언더, 오버샘플링의 장단점을 고려하여 방법을 선택해야 함

2) 불균형 데이터의 경우 accuracy가 높다고 좋은 것이 아님(모델의 왜곡을 판단해야 함)

3) precision, recall의 가중치를 다르게 줄 수 있는 fbeta score의 존재성

4) 모델링시에 class_weight으로 불균형데이터에 대한 보정을 할 수 있음

5) precision을 주요지표로 판단할 때 실제로 몇명이 분류되었는지 봐야함. 1,800여 명 중 겨우 20명을 어뷰징 탐지라고 하는 것은 모델링의 효과가 없는 것이나 마찬가지

반응형
LIST