2019년 11월 16일 토요일

2018 빅콘테스트 게임유저 이탈 예측 :: (3) 예측모델

2018 빅콘테스트 게임유저 이탈 예측


모델링


데이터 결합


예측모델을 만들기 위해 acc_id를 기준으로 결합

데이터 분할


현재는 평가기간이 지나 예측 대상으로는 평가가 불가능 하여 train_data 100000건을
train_data 75000, test_data 25000개로 분할하여 예측


학습 데이터와 테스트 데이터에 label별로 균등하게 잘 들어간것을 확인

Parallel Compution


분석하는 데이터이 양이 많기 때문에 시간이 오래 걸려 조금이라도 시간을 줄여보고자 했다

R은 풍부한 통계모델과 강력한 데이터 처리 도구와 시각화 도구가 있지만
in-memory 연산 모드를 사용하여 처리할 수 있는 데이터의 크기가 제한되고
싱글-스레드(Single-thread) 프로그램이기 때문에 놀고있는 자원이 생기게 된다

doParallel 패키지를 이용한 병렬처리


doParallel :: detectCores() 함수를 이용한 사용 가능 코어 확인


8개의 코어가 사용 가능하고 효율을 위해 4개의 코어만 사용함

싱글코어 VS 멀티코어


코드 실행시 속도가 개선 되는지 확인하기위해 10억개의 난수를 발생


싱글코어 : 272.58


멀티코어 : 263.77



약 1% 성능 향상

단순 난수발생 이므로 큰 효과를 보지 못한 것으로 예상된다

NNET



시간이 오래 걸려 실행시켜 놓고 밤에 돌려놓고 아침에 돌아와보니 결과가 나왔다

대기전력으로 바뀐 시간까지 포함된 건지 모르겠지만 약 3~4시간이 걸렸다




신경망 구조 확인



변수의 수가 너무 많아서 사진에 변수이름이 다 나오지 못한다
bestTune은 size = 15, decay = 0.001

예측결과 확인


gmodels :: CrossTable()을 사용하여 결과 확인




25000의 테스트 데이터를 예측한 결과

week : 75% 
month : 69.1% 
2month : 52.1% 
retained : 66.8%
총 예측률 : 64.3%

2month를 제외한 나머지 3개의 label은 예측률이 준수한 것을 확인할 수 있다
EDA에서 예측한 것과 동일하게 2month와 month를 예측하는데 어려움이 있고
그 중에서도 2month를 month로 예측하는 경우가 압도적이다

변수 중요도 확인


어떤 변수들이 결과에 영향을 많이 주는지 확인을 하고 타 예측모델과 비교해보기로 했다

gmodels :: garson() + ggplot2를 사용하여 그래프 생성



RandomForest


랜덤포레스트는 분류예측 모델로 이미 유명하고 별다른 사전 처리 없이 변수를 잘 선택해 준다는 특징이 있다








변수 중요도 확인



두 그래프에서 서로 중요도가 겹치는 변수도 있고 아닌 변수도 있고 NNET과도 비슷하게 판별한 변수가 있는 반면에 반대로 판단한 변수도 존재한다


변수 중요도 확인


어느 것이 예측력을 확인해보고 변수 중요도를 다시 확인해 보도록 함



25000의 테스트 데이터를 예측한 결과

week : 83.7% 
month : 70.2% 
2month : 56.8% 
retained : 76%
총 예측률 : 71.7%

별다른 설정 없이 모델을 만들었음에도 불구하고 NNET(64.3%)보다 예측 성능이 7% 가량 뛰어나다

랜덤포레스트 모델 역시 2month label을 잘 분류해내지 못하는 것이 보이고 NNET과 동일하게 2month를 month로 분류하고 있다

month와 2month를 혼동하는 문제를 해결하기 위한 방법을 연구할 필요가 있겠다

댓글 없음:

댓글 쓰기