ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리그오브레전드 데이터를 활용한 승/패 예측
    ML, DL & Python/Riot API를 활용환 데이터 분석 2019. 6. 2. 13:00

    이전 포스팅에서 수집한 매치데이터를 이용하여 팀의 승/패를 예측해보겠습니다.

     

    다들 teams 변수를 이용하여 데이터프레임화를 했던 것을 기억하시나요.

    teams데이터는 리스트안에 딕셔너리가 있는 구조로써 dict데이터의 key값을 변수로, value값을 값으로 풀어줘야 했습니다.

     

    데이터를 잠시 보여드리겠습니다.

    team데이터

    변수설명

    • teamId - 경기내의 파랑팀 (100) / 경기내의 빨강팀 (200)
    • win - 승 / 패 , target_variable로 사용할 변수입니다. (W/F)
    • firstBlood - 가장 먼저 상대팀의 챔피언을 킬했는지 여부. (T/F)
    • firstTower - 가장 먼저 상대팀의 포탑을 깻는지 여부. (T/F)
    • firstinhibitor - 가장 먼저 상대팀의 억제기를 깻는지 여부. (T/F)
    • firstBaron - 가장 먼저 바론을 먹었는지 여부. (T/F)
    • firstDragon - 가장 먼저 드래곤을 먹었는지 여부. (T/F)
    • firstRiftHerald - 가장 먼저 전령을 먹었는지 여부. (T/F)
    • towerKills - 깬 타워의 수(연속형변수)
    • inhibitorKills - 깬 억제기의 수(연속형변수)
    • baronKills - 처치한 바론의 수(연속형변수)
    • dragonKills - 처치한 드래곤의 수(연속형변수)
    • vilemawKills - 상관하지 않아도 되는 변수입니다.(5:5 게임에는 없는 오브젝트)
    • riftHeraldKills - 처치한 전령의 수 (게임 내에서 전령은 20분전까지 한번밖에 나오지 않으므로 사실상 0과1로 나뉩니다.)
    • dominionVictoryScore - 상관하지 않아도 되는 변수입니다.
    • gameDuration - 경기 시간, 초라고 생각하시면 됩니다.(연속형변수)

     

    자 이제 팀 데이터의 변수를 이용하여 승/패를 예측하는 분석을 시작해보도록 하겠습니다.

     

    앞서 데이터는 A팀과 B팀이 있다고 설명했는데, A팀이 이기는 것은 B팀이 지는 것이고 A팀만의 정보만으로도 이겼을 때와 졌을 때의 특성을 알 수 있기 때문에 A팀의 데이터만을 이용해서 분석을 진행하였습니다.

    data_team = pd.concat([team1_df,data[['gameDuration']]],axis=1) #분석을 위해서 상대편데이터는 일단 빼고
    
    data_team = data_team.dropna(axis=0) #데이터의 결측치 제거
    
    data_team2 = data_team[list(data_team.columns)[2:]]#타겟데이터를 제외한 나머지 데이터 
    

     

    다음으로는 데이터의 종속변수(승/패)말고 first로 시작하는 변수들은 T/F 값을 가지고 있어 해당 변수들을 인코딩을 해줘야합니다.

    인코딩 방법으로는 ONE HOT ENCODING와 Labeling을 하는 방법이 있는데 저는 라벨링 방법으로 변수를 인코딩 하겠습니다.

    from sklearn.preprocessing import LabelEncoder
    for i in range(0,6):
        le = LabelEncoder()
        y = list(data_team2.iloc[:,i])
        
        le.fit(y)
        y2 = le.transform(y) 
        
        data_team2.iloc[:,i] = y2

    자 이제 데이터를 확인해보시면 데이터에 라벨이 붙어 있는 것을 확인하실 수 있습니다.

     

    이제 종속변수도 라벨링을 해주겠습니다.

    dict_winner2 = {"Win" : 0, "Fail": 1}
    data_team['win'].map(dict_winner2).tolist()

     

    분석을 위한 준비를 끝냈습니다.

     

    이제 본격적으로 모델에 학습시켜 보겠습니다.

     

    1. 먼저 데이터를 train과 test로 나누겠습니다.

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(data_team2, np.array(data_team['win'].map(dict_winner2).tolist()), test_size=0.25, stratify=np.array(data_team['win'].map(dict_winner2).tolist()), random_state=123456)

    이렇게 train과 test로 데이터를 0.75 : 0.25 비율로 나눴습니다.

     

    • Random forest 학습
    from sklearn.ensemble import RandomForestClassifier
    
    rf = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=123456)
    rf.fit(X_train, y_train) #소환사 코드를 float로 바꿔줘야함
    
    from sklearn.metrics import accuracy_score
    
    predicted = rf.predict(X_test)
    accuracy = accuracy_score(y_test, predicted)
    
    #oob_score = out of bag score로써 예측이 얼마나 정확한가에 대한 추정치입니다.
    print(f'Out-of-bag score estimate: {rf.oob_score_:.3}')
    print(f'Mean accuracy score: {accuracy:.3}')

    결과는 약 87%의 정확도를 보인 것을 알 수 있습니다.

     

    • Gradient Boosting classifier
    from sklearn.ensemble import GradientBoostingClassifier
    clf_gbc = GradientBoostingClassifier()
    clf_gbc.fit(X_train,y_train)
    
    y_pred = clf_gbc.predict(X_test)
    
    print('테스트 정확도 = ' + str(accuracy_score(y_test,y_pred)))

    GBC로 예측한 결과도 RF와 비슷하게 88%정도의 정확도를 보이는 것을 알 수 있습니다.

     

    • Xgboost
    from xgboost import XGBClassifier
    import xgboost as xgb
    from xgboost import plot_importance
    from matplotlib import pyplot
    
    #xgb로 학습시키기 위해서는 dtypes이 단순하게 int형식이면 안된다. 따라서 데이터 형식을 float로 변환시켜줘야함
    X_train[['towerKills', 'inhibitorKills', 'baronKills', 'dragonKills', 'vilemawKills', 'riftHeraldKills', 'dominionVictoryScore', 'gameDuration']] = X_train[['towerKills', 'inhibitorKills', 'baronKills', 'dragonKills', 'vilemawKills', 'riftHeraldKills', 'dominionVictoryScore', 'gameDuration']].astype('float')
    
    #xgb로 학습시키기 위해서는 dtypes이 단순하게 int형식이면 안된다. 따라서 데이터 형식을 float로 변환시켜줘야함
    X_test[['towerKills', 'inhibitorKills', 'baronKills', 'dragonKills', 'vilemawKills', 'riftHeraldKills', 'dominionVictoryScore', 'gameDuration']] = X_test[['towerKills', 'inhibitorKills', 'baronKills', 'dragonKills', 'vilemawKills', 'riftHeraldKills', 'dominionVictoryScore', 'gameDuration']].astype('float')
    
    xgb_model = XGBClassifier()
    xgb_model.fit(X_train,y_train)
    y_pred = xgb_model.predict(X_test)
    
    print('테스트 정확도 = ' + str(accuracy_score(y_test,y_pred)))#정확도 계산

    xgboost로 예측한 결과도 마찬가지로 높은 정확도를 보였습니다.

     

    3개의 모델이 어떻게 데이터를 학습시켜서 높은 설명력을 가지게 되었는지 변수중요도를 통해서 알아보겠습니다.

    각 모델별 중요하다고 생각하는 변수는 조금씩 다르지만 어느정도 중요한 변수들이 같은 것을 알 수 있습니다. 가령, 타워, 억제기와 주로 first 즉, 오브젝트 선취점에 높은 점수를 부여하는 것으로 보입니다. 이와 관련해서는 다음 포스팅에서 시각화와 함께 분석을 진행해보도록 하겠습니다.

     

     

    지금까지 3개의 모델을 사용해서 간단한 승/패 예측을 해보았는데요. 이를 통해서 제가 설명했던 변수별로 승패에 어느정도 영향을 끼치는지 알 수 있었습니다. 그래서 게임 내에서 어떠한 행동을 하면 승리에 더욱 가까워질 수 있다는 점을 알게 되었고요.

     

    하지만 이렇게 높은 설명력을 보이지만 실제로 어느정도인지 감이 오지 않을 것입니다. 따라서 정확하게 어떤 변수가 높아졌을 때 승리할 확률, 패배할 확률이 높아지는지 회귀분석을 통해서 알아볼 것이며 시각화를 통해서 승/패별로 변수들의 차이를 알아볼 계획입니다. 다음 포스팅도 기대해주세요!

     

    위의 데이터로 분석을 하실분들은 아래의 제가 캐글에 구축해 놓은 데이터 셋을 다운받아서 하시면 됩니다!!

     

    1. 챌린저, 그마, 마스터 랭크게임(바로 분석할 수 있도록 정교하게 데이터 셋 구축한 버전)

     

     

    League Of Legends High elo Ranked Games(2020)

    Classification High elo(Challenger, GrandMaster, Master) Ranked Games Results

    www.kaggle.com

     

    2. 챌린저, 그마, 마스터 경기 시작 후 10분, 15분까지의 게임 데이터(바로 분석할 수 있도록 정교하게 데이터 셋 구축한 버전)

     

    League Of Legends Challenger Rank Game-10min,15min

    Match data from the start of the Challenger Ranked games to 10 and 15 minutes.

    www.kaggle.com

     

    3. 챌린저, 그마, 마스터 랭크게임(모든 경기 데이터가 다 담겨있지만 전처리가 필요한 데이터 셋)

     

    League of Legends(LOL) - Ranked Games 2020

    challenger,grandmaster,master 108,000 game data (Riot, korea, 2020)

    www.kaggle.com

     

     

    4. 챔피언, 아이템에 대한 정보

     

    League of Legends(LOL) CHAMPION and ITEM - 2020

    riot games League of Legends game item and champion information

    www.kaggle.com

     


    댓글

Designed by Tistory.