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

     


    댓글 6

    • 김신뢰 2019.10.09 19:54

      다음 포스팅 언제 올리시나요? 기다리고 있어요!!

      • 사용자 me뇽 2019.10.09 23:02 신고

        포스팅에 관심가져주셔서 감사합니다!
        지금 하고 있는 일들이 많아서 따로 제 메모장에 포스팅 할 것들을 정리만 해놓고 있고 실질적으로 포스팅을 못하고 있습니다 ㅠㅠ 죄송합니다.
        급한일들 마무리하면서 새로운 포스팅을 지속해서 올릴 생각이구요 "김신뢰"님이 재미있게 보시는 것 같으니 리그오브레전드부터 조속하게 분석하여 포스팅하도록 하겠습니다.
        다시한번 감사드립니다!

    • Anesthetic 2020.02.09 03:30 신고

      저도 흥미롭게 보았습니다
      조금 한가해지시면 다음 포스팅도 부탁드려요!

    • 9800000 2020.12.15 13:00

      SettingWithCopyWarning:
      A value is trying to be set on a copy of a slice from a DataFrame.
      Try using .loc[row_indexer,col_indexer] = value instead

      이 에러 떳는데 무시해도되는건가요?
      실행은 되긴하는데

      • 사용자 me뇽 2020.12.15 21:49 신고

        네!!
        보통 warnings 메시지는 기존에 쓰이던 라이브러리에서 사용했던 함수가 다르게 바뀌어서 그부분을 수정해서 쓰길 권고한다는 메세지인데 보통은 백단에서 현재 라이브러리 버전에서 쓰이지 않는 함수인데 쓴 함수를 자동으로 변환해서 사용해주는 것으로 알고 있습니다.

        그래서 저기서 권고하는 것으로 쓰면 좋으나 사실 그대로 쓰셔도 무방합니다!!
        참고로 warning 메세지를 무시하시려면

        import warnings
        warnings.filterwarning('ignore')

        를 해주시면 됩니다!

Designed by Tistory.