본문 바로가기
프로젝트/진행중

Project_LOL / 게임 승패 예측 (2)

by 가장따뜻한로봇 2023. 6. 1.

https://warmbot.tistory.com/14

 

Project_LOL / 게임 승패 예측 (1)

리그 오브 레전드(이하 롤)라는 게임은 여러가지 모드가 있는데, 그 중 남들과 경쟁하는 '랭크' 게임 중 솔로 랭크에서의 승률을 예측해 보고자 함. https://developer.riotgames.com/ Riot Developer Portal About

warmbot.tistory.com

 

 

승패 예측을 하기 위해 변수가 될 만한 것들을 생각해봄

 

게임이 끝나기 전에 알수 있는 것 ( 벤픽 후 게임 시작 시 로딩 화면에서 알수 있는 것)

=> 챔피언, 소환사주문,팀포지션, 메인룬, 보조룬, 팀 위치(블루, 레드)

 

게임 도중 승패에 영향이 있을 만한 것

=> KDA(킬,데스,어시스트), 딜량, 힐량, 획득한 오브젝트 수, 골드(미니언 + 정글몹), 경기시간, 시야점수 등


 

matchdata 만 이용하여

게임이 끝나기 전에 알수 있는 것들로 간단하게 데이터 분석을 해봄

import json
import pandas as pd
from tqdm import tqdm
import pickle

from sklearn.metrics import mean_squared_error
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# 2-1. matchdata 가공
with open('matchdata_0522.json', 'r') as f:
    js = json.load(f)
matchdata = pd.DataFrame(js)
matchdata.columns

간단하게 한 경기(KR_6499859239) 를 이용하여 데이터를 확인해 본 결과

# matchdata['KR_6499859239'][0]['championId'] # 챔피언
# matchdata['KR_6499859239'][0]['summoner1Id'] # 서머너 스펠 1,2
# matchdata['KR_6499859239'][0]['summoner2Id']
# matchdata['KR_6499859239'][1]['perks']['styles'][0]['selections'][0]['perk'] # 메인 룬
# matchdata['KR_6499859239'][1]['perks']['styles'][1]['selections'][0]['perk'] # 보조 룬
# matchdata['KR_6499859239'][0]['teamId'] # 200 이면 레드팀
# matchdata['KR_6499859239'][0]['win'] # 0 블루팀 승, 1 레드팀 승

팀포지션이 'TOP','JUNGLE','MIDDLE','BOTTOM','UTILITY' 라는 문자열(str) 으로 되어 있기 때문에

분석을 위해 LabelEncoding 을 해줌.

 

'TOP','JUNGLE','MIDDLE','BOTTOM','UTILITY' 으로 라벨링하니 오류 발생

=> 게임시작 부터 접속을 종료 할 경우 다시하기가 되는데 그 경우 '' 빈칸으로 포지션이 잡히는 것 같음 (예상)

다시하기가 된 경기 수는 78경기이므로 그러한 경기는 제외 하기로 결정

 

빈칸을 넣어 labelencoding

lbe = LabelEncoder()
lbe.fit(['TOP','JUNGLE','MIDDLE','BOTTOM','UTILITY',''])

팀 포지션이 빈칸일 경우 0번으로 잡힘

=> 0일 경우를 제외 하면 될듯함

 

# 2-2. RandemForest를 이용하여 간단한 승패 분류
data = pd.DataFrame(columns=['championId','summoner1Id','summoner2Id','primaryStyle','subStyle','teamPosition'] * 10 + ['win'])
# 10명의 데이터가 1개의 경기이므로 인덱스를 matchid 로 두고 10명의 데이터를 저장
re_play = False # 팀포지션이 0일 경우를 제외하기 위한 매개변수
for i in tqdm(matchdata.columns):
    tmp = []
    for j in matchdata[i]:
        if lbe.transform([j['teamPosition']])[0] == 0: # 팀포지션이 0일 경우를 제외
            re_play = True
        tmp.extend([j['championId'],j['summoner1Id'],j['summoner2Id'],j['perks']['styles'][0]['selections'][0]['perk'],j['perks']['styles'][1]['selections'][0]['perk'],lbe.transform([j['teamPosition']])[0]])
    tmp.append(j['win'])
    if re_play == False:
        data.loc[i] = tmp
    else:
        re_play = False

 

간단하게 RandomForest 를 이용하여 승패 분류를 예측 해봄

 

rf = RandomForestClassifier()
y = data['win']
x = data.drop(columns='win')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=321)

rf.fit(x_train,y_train)
pre = rf.predict(x_test)

accuracy_score(y_test,pre)

정확도가 대략 51.9%

 

적어도 정확도가 75% 이상은 되어야 된다고 생각

다른 방법이 필요하다고 결론이 남

'프로젝트 > 진행중' 카테고리의 다른 글

Project_LOL / 게임 승패 예측 (3)  (2) 2023.06.01
Project_LOL / 게임 승패 예측 (1)  (0) 2023.06.01