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 |