이번 방학에는 기계학습을 좀 공부해보고 있는데, 재미있는 모델들이 많아서 여러 가지 연습을 해보고 있다.
복수전공으로 배우고 있는 계량경제학 과목에서 금융시계열분석 파트를 공부하면서 시계열자료에 대해 접근하는 방법을 보고, 인공지능을 공부하다 보니 너무 경제 시계열변수에만 초점을 두고 보고있는게 아닌가..싶다는 생각이 들었다.
그래서 이번에는 시계열 분석이 아닌 계량적인 분석에 초점을 맞춰서 데이터를 짜보고 모델을 설계하는 연습을 해보고자 한다. 아직 잘 다뤄보지 않은 도메인이기 때문에 이론적으로 잘 알고 있는 데이터를 기반으로 연습을 하면 데이터셋에 대한 이해도가 높기 때문에 모델 학습을 하기에도 좋다고 생각을 했다.
그래서.. 어떤 데이터가 나에게 익숙한가..? 생각을 해봤는데 마침 그 때 친구가 아케인 무기 시세를 물어봐서 이거다!! 라는 생각이 들었다. 아케인 무기시세를 한번 분석해보기로 했다.
일단 아케인 무기의 가격에 영향을 주는 지표는 여러 가지가 있는데,
1. (주스텟)
2. (부스텟)
3. 공/마
4. 보뎀올 추옵
5. 윗잠 : 보공/공/방/(주스텟,뎀)
6. 밑잠 : 공/뎀
7. 소울
8. 가횟
크게 이정도가 있다. 괄호 친 것들은 크게 영향이 없는것들이다.
이러한 지표들을 넣고 regression을 진행하면 가격 추정이 될 것이다.
pytesseract를 통해서 ocr을 진행해서 데이터를 크롤링하고자 했지만.. 한글 + 도트 글씨체 덕분에 정확한 추정이 되지 않아서 하루 100~150개씩 1주일에 거쳐서 "수기로" 데이터 입력을 진행했다..
그렇게 해서 1095개의 데이터를 만들었다.
데이터를 수집하면서 다음과 같은 문제점이 있을 것 같아서 몇 가지 유의사항을 만들어서 수집했다.
1. 80억 이상 아이템만 가지고 왔다. 가격이 낮아질 수록 아이템간 편차가 커진다고 생각한다.
강화 상태가 제각각이기 때문이다. 강화 상태가 제각각이더라도 각 강화 상태에 따른 비용이 선형적으로 비례하면 되는데, 아이템들간의 편차도 크기 때문에 데이터셋에 포함시키지 않기로 했다. 그리고 가격이 비싼 아이템일수록 각 옵션들이 평준화 된다.(윗잠은 보보공, 아랫잠은 공공)
2. 일주일이라는 빠른 시일 내에 최근 2개월 이내의 아이템만 수집해왔다.
이는 데이터가 계열상관 되지 않게 하기 위해서이다. 만약 t시점의 무기 가격이 t-a 시점의 무기 가격과 다르다면, a 값에 따라서 label 값이 유의하게 다르다면 이는 시계열성을 띄는 것이고, 내가 생각하는 횡단면 데이터, 한 시점에서의 데이터 계량분석이 쉽지 않게 된다. 추정량에 편의가 있을 수 있게 될 것이다.
무기 시세 변동이 시간에 따라 크게 없는 경우는 상관이 없지만, 현재 메이플의 경우 환불사태 -> 피케인 지급 -> 스펙 인플레로 인한 해방 증가 -> 밸패로 인한 수요 불균형 등 시간에 따라 시세에 영향을 미칠 여지가 상당히 많았기 때문에 데이터 수집 시점을 최대한 줄여야 했다.
이상적인것은 딱 하루만의 데이터를 가지고 분석을 하는것이 좋겠지만, 그렇게 되면 데이터 수가 얼마 없게 된다.(특히 오로라서버임) 그리고 하루종일 엑셀을 잡고 있을 수만도 없기 때문에, 시그너스 리마스터 후 2개월 동안 데이터를 수집하기로 했고, 일주일동안 시간을 쪼개서 최대한 짧은 시간 내에 많은 데이터를 수집하려고 했다.
3. 데벤져, 제논 무기는 제외했다(ㅜㅜ)
주스텟, 부스텟 개념이 모호하고 데벤져 같은 경우는 HP를 실제 스텟으로 환산해야 한다. 예를들어 hp 2400과 힘 100을 그냥 깡으로 데이터셋에 입력해버리면 데벤져 무기가 상당히 가격이 고평가되는 일이 생길 것이기에.. 스케일링 하면 되기야 하겠지만 너무 귀찮아진다. 제논같은 경우도 주스텟이 세개다 보니깐 데이터셋에 다 포함시키기 애매해서 그냥 빼버렸다.
일단 제대로 작동하는지 보기 위해서 LGBM 모델을 사용해서 평가해보도록 하겠다.
알아볼 수록 상당히 매력적인 모델이고 회귀분석을 공부했던 내 입장에서는 오차를 줄이는 방법이 상당히 직관적으로 다가오기 때문에 이 모델이 내가 수집한 데이터 또한 잘 예측할 것이라고 생각한다.
우선 비선형 분석이라 상관은 없겠지만, 무기 공격력 데이터를 좀 건들 필요가 있어보였다. 왜냐하면 무기 종류마다 기본적인 공격력이 다르지만 주흔,강화수치는 크게 차이가 없다. 그러므로 정확한 분석을 위해서는 무기 종류 데이터와 공마 데이터가 최대한 완벽하게 분리를 시켜야 한다. 그러므로 공마에서 무기 고유 공격력 마력을 빼버리기로 했다.
#무기 기본 공격력과 추옵은 차이가 나지만 작은 차이가 나지 않기 때문에 선형적인 비례관계 아님.
#그래서 혹~시 비선형이긴 하지만 스케일 문제가 있을 수 있으니 빼자
default_attk = {'ESP리미터' : 347,
'건' : 216,
'건틀렛리볼버' : 221,
'너클' : 221,
'단검' : 276,
'두손검' : 295,
'두손도끼' : 295,
'두손둔기' : 295,
'듀얼보우건' : 276,
'매직건틀렛' : 347,
'부채' : 276,
'브레스슈터' : 276,
'샤이닝로드' : 347,
'석궁' : 283,
'소울슈터' : 221,
'스태프' : 353,
'아대' : 149,
'에인션트보우' : 276,
'완드' : 347,
'창' : 295,
'체인' : 276,
'케인' : 283,
'튜너' : 295,
'폴암' : 264,
'한손검' : 283,
'한손도끼' : 283,
'한손둔기' : 283,
'핸드캐논' : 302,
'활' : 276}
def attkPreProcess(x):
return x['공마'] - default_attk[x['무기']] #각 부위에 해당하는 기본 공마를 뺌. 따라서 이제 공마에는 스타포스+작+추옵 만 반영된 수치.
df['공마'] = df.apply(attkPreProcess,axis= 1)
그래서 이런식으로 무기 기본 공격력을 빼버린다. 이렇게 되면 공마 데이터의 공격력은 추옵+작+스타포스 로 밖에 구성되지 않는다. 물론 추옵이 남아있어서 완벽하게 분리되진 않았지만.. 무기에서 큰 비중을 차지하는 기본옵션이 사라졌기에 의미가 없진 않다고 생각한다.
우선 어느 정도 잘 작동하는지 테스트해 보기 위해서 몇 가지 데이터를 버렸다.
주스텟,부스텟 -> 공마 데이터와 상당히 linearly dependent 하다. 아마 선형 회귀분석을 했다면 Multicollinearity 문제 때문에 무조건 제외 했어야 했을 것이다. 이 두 지표때문에 추정량이 불일치 할 수 있고 실제로 메유저들은 스텟보다 공마를 보고 무기를 평가하기 때문에 그냥 제외하고 분석을 시작한다
무기종류/소울옵션 -> one-hot vector로 만들어서 학습을 시켜야 하기 때문에 차원이 기하급수적으로 늘어나 컴퓨터에 상당히 부담이 되서 일단 제외한다.
그리고 예측 label인 가격을 10억으로 나눴다. 왜냐하면 gradient dsecent 기법을 사용할 때 loss 함수를 MSE로 사용하는데, 10억에 제곱이면.. 연산이 쉽지 않을 것 같아 그냥 10억으로 나눴다 ex) 85억 -> 8.5억
그리고 다른 피팅과 다르게 그냥 overfitting을 허용하기로 했다. 왜냐하면
1. 저 데이터들이 현재 오로라 서버 아케인 무기 매물의 모든 데이터
2. 학습 데이터의 시점과 현재 시점이 별로 차이가 없음(무기 시세에 크게 영향을 주는 이벤트가 일어나있지 않음)
모든 데이터를 깡으로 포함하고 있기 때문에 굳이 오버피팅을 피해야 할 이유가 없다고 생각했다. 현실에서는 일어나지 못할 일이겠지만 일단 메이플 오로라서버의 시장 규모가 그렇게 크지 않기 때문에 가능한 일인 것 같다.
잘 나오는것 같긴 한다. 중간에 저 700억 800억짜리는 아마 내가 잘못 입력한듯 하다.
실제로 없다
검증을 해보자. 물론 중요한 데이터(무기종류, 소울옵션)이 빠져버려서 추정량이 유의하다고 생각하지는 않지만 일단 해본다. 왜냐하면 무기 종류에 따라 같은 작 상태라도 가격이 수십억씩 차이가 나기 때문에..
이런식으로 테스트 데이터를 구성했다. 재획보면서 유투브 하듯이 유투브 보면서 경매장 보고 쳤다..
아까 학습했던 모델 그대로 추정해보자.
추정을 해보면 확실히 추정량이 편의가 있다. 어느 정도 예측은 하지만 완벽하게 하지 못한다. 차분한 값을 그려보면
추정이 정확하게 되지 않은것을 알 수 있다. 누락된 데이터가 이렇게 문제가 되나 싶지만 일단 그렇다.
누락시킨 정보를 넣어서 다시 해봐야겠다.
'메끄적' 카테고리의 다른 글
일요일 샤타포스 결과 (0) | 2022.07.31 |
---|---|
LGBM이 잘 작동하지 않은 이유 (0) | 2022.07.30 |
<메이플> 버닝섭 vs 본섭?! 버닝섭 극한의 이득 보는법 (0) | 2022.06.29 |
<스타포스> 22성까지의 메소 기댓값&파괴횟수 기댓값과 편차에 관해 (0) | 2022.05.20 |
(메이플스토리,몬스터라이프) - FastApi로 농장리스트 뽑아오기 (0) | 2022.03.13 |