머신러닝(AI학습 29)

이유진·2024년 7월 8일

--11.LOL-필승전략 분석.ipynb--

평가 : NCS 머신러닝 기반 데이터 분석

데이터 소개

  • 이번 주제는 League of Legends Diamond Ranked Games (10 min) 데이터셋을 사용합니다.
  • 다음 1개의 csv 파일을 사용합니다.
    • high_diamond_ranked_10min.csv
  • 각 파일의 컬럼은 아래와 같습니다.
    • gameId: 게임 판의 고유 ID
    • blueWins: 블루팀의 승리 여부 (0: 패배, 1: 승리) <-- ⭐타겟값
    • xxxWardsPlaced: xxx팀에서 설치한 와드의 수
    • xxxWardsDestroyed: xxx팀에서 파괴한 와드의 수
    • xxxFirstBlood: xxx팀의 첫번째 킬 달성 여부
    • xxxKills: xxx팀의 킬 수
    • xxxDeaths: xxx팀의 죽음 수
    • xxxAssists: xxx팀의 어시스트 수
    • xxxEliteMonsters: xxx팀이 죽인 엘리트 몬스터 수
    • xxxDragons: xxx팀이 죽인 용의 수
    • xxxHeralds: xxx팀이 죽인 전령의 수
    • xxxTowersDestroyed: xxx팀이 파괴한 탑의 수
    • xxxTotalGold: xxx팀의 전체 획득 골드
    • xxxAvgLevel: xxx팀의 평균 레벨
    • xxxTotalExperience: xxx팀의 총 경험치 획득량
    • xxxTotalMinionsKilled: xxx팀의 총 미니언 킬 수
    • xxxTotalJungleMinionsKilled: xxx팀의 총 정글 미니언 킬 수
    • xxxGoldDiff: xxx팀과 다른 팀 간의 골드 획득량 차이
    • xxxExperienceDiff: xxx팀과 다른 팀과의 경험치 획득량 차이
    • xxxCSPerMin: xxx팀의 분당 CS 스코어
    • xxxGoldPerMin: xxx팀의 분당 골드 획득량
  • 데이터 출처: https://www.kaggle.com/bobbyscience/league-of-legends-diamond-ranked-games-10-min

평가환경

  • Jupyter Notebook
  • scikit-learn

1_1. 데이터셋 준비

  • 위 출처의 데이터셋 다운로드하여 현재 폴더에 저장하기
  • DataFrame 으로 읽어 들이고 변수명 df 에 담기
  • df.head() 출력하기

from google.colab import drive
drive.mount('/content/drive')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os

base_path = r'/content/drive/MyDrive/dataset'
filename = r'high_diamond_ranked_10min.csv'
filepath = os.path.join(base_path, filename)
filepath

df = pd.read_csv(filepath)
df

df.columns

df[['blueFirstBlood', 'redFirstBlood']]

df[['blueDragons', 'blueHeralds', 'redDragons', 'redHeralds']]

df[['blueGoldDiff', 'redGoldDiff']]

df.info()

1_2. EDA 및 데이터 기초 통계 분석

  • df 의 각 컬럼 분석
  • 기술통계량 분석

df.describe()

df.describe()[['blueDragons', 'blueHeralds', 'redDragons', 'redHeralds']]

df.corr()

fig = plt.figure(figsize=(4,10))
sns.heatmap(df.corr()[['blueWins']], annot=True)

컬럼과 승리여부 관계 시각화

sns.histplot(x='blueGoldDiff', data = df, hue='blueWins')

sns.histplot(x='blueKills', data = df, hue='blueWins', palette='RdBu', bins=8, kde=True)

sns.jointplot(x='blueKills', y='blueGoldDiff' ,data = df, hue='blueWins')

sns.jointplot(x='blueExperienceDiff', y='blueGoldDiff' ,data = df, hue='blueWins')

sns.countplot(x='blueDragons', data=df, hue='blueWins')

2. 모델 학습을 위한 데이터 전처리

2_1. 학습에 불필요한 컬럼을 제거합니다

  • df 에서 다음의 불필요한 컬럼들을 제거합니다

    'gameId', 'redFirstBlood', 'redKills', 'redDeaths','redTotalGold', 'redTotalExperience', 'redGoldDiff','redExperienceDiff'

  • 컬럼이 제거된 df 의 df.head() 출력 하기

  • 컬럼이 제거된 df 의 column 개수 출력 하기

TODO : 컬럼이 제거된 df 의 df.head() 출력 하기 ↓

df = df.drop(columns = ['gameId', 'redFirstBlood', 'redKills', 'redDeaths','redTotalGold', 'redTotalExperience', 'redGoldDiff','redExperienceDiff'])

df.head()

TODO: 컬럼이 제거된 df 의 column 개수 출력 하기 ↓

len(df.columns)

2_2. 수치형 데이터 표준화하기

  • df에서 수치형 데이터만 모아서 X_num 변수에 담기 (DataFrame)
  • df에서 분류형 데이터만 모아서 X_cat 변수에 담기 (DataFrame)
    • ※ dtype 이 숫자타입이더라도 값의 종류가 2개 이하이면 분류형으로 담으세요
  • StandardScaler 를 사용하여 X_num 의 표준화를 진행한뒤 결과를 DataFrame 으로 바꾸어 변수 X_scaled 에 저장. 스케일링을 진행한 Scaler 객체는 scaler 변수에 담기
  • 데이터 X <= X_scaled 와 X_cat 을 합한 데이터 담기
  • 타겟값 y <= 'blueWins' 담기
  • X.head() 출력
  • X.describe() 출력

TODO

df.info()

df

df.columns

df['redTowersDestroyed'].unique()

df 의 수치형 데이터만 담기

X_num = df[['blueWardsPlaced', 'blueWardsDestroyed',
'blueKills', 'blueDeaths', 'blueAssists', 'blueEliteMonsters',
'blueTowersDestroyed', 'blueTotalGold',
'blueAvgLevel', 'blueTotalExperience', 'blueTotalMinionsKilled',
'blueTotalJungleMinionsKilled', 'blueGoldDiff', 'blueExperienceDiff',
'blueCSPerMin', 'blueGoldPerMin', 'redWardsPlaced', 'redWardsDestroyed',
'redAssists', 'redEliteMonsters',
'redTowersDestroyed', 'redAvgLevel', 'redTotalMinionsKilled',
'redTotalJungleMinionsKilled', 'redCSPerMin', 'redGoldPerMin']]

df 의 분류형 데이터만 담기

X_cat = df[['blueFirstBlood', 'blueDragons', 'blueHeralds', 'redDragons', 'redHeralds' ]]

from sklearn.preprocessing import StandardScaler

df['blueWardsPlaced']

표준화 한 결과 담기

scaler = StandardScaler()
scaler.fit(X_num)

X_scaled = scaler.transform(X_num)
X_scaled = pd.DataFrame(data = X_scaled, index = X_num.index, columns = X_num.columns)
X_scaled

X_scaled 와 X_cat 합치기

X = pd.concat([X_scaled, X_cat], axis=1)

'blueWins' 담기

y = df['blueWins']

출력하기

X.head()

출력하기

X.describe()

3. 최적 파라미터 찾기

  • 위에서 만든 X, y 를 LogisticRegression 모델에 학습시키기 위한 최적의 파라미터를 찾는다
  • 다음 2개의 파라미터 값의 grid 를 다음과 같이 주고 최적값을 찾아낸다
    • 'max_iter' : [100, 200, 300]
    • 'C' : [0.5, 1.0, 1.5, 2.0]
  • GridSearchCV 사용: 8분할(8-fold)하여 Cross-validation 수행
  • 결과의 최적점수 출력하기
  • 결과의 최적 파라미터 (dict)를 best_params 변수에 담고 출력하기
  • 결과의 cvresults 값을 DataFrame 으로 출력하기

TODO 최적 파라미터 찾기↓

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

param_grid = [{
'max_iter' : [100,200,300],
'C' : [0.5, 1.0, 1.5, 2.0],
}]

gs = GridSearchCV(estimator = LogisticRegression(), param_grid = param_grid, cv = 8)
result = gs.fit(X, y)

최적 점수

result.bestscore

최적 파라미터 값

bestparams = result.bestparams
bestparams

최적의 파라미터로 세팅된 모델

gs.bestestimator

cvresults 값을 DataFrame 으로 출력하기↓

pd.DataFrame(result.cvresults)

4. 학습데이터와 테스트데이터 분리하기

  • 학습용(train) : 테스트용(test) = 7:3 비율로 분리하기
  • 분리된 각 데이터와 레이블은 아래 변수명으로 담습니다.
    • 학습용 데이터 X_train
    • 테스트용 데이터 X_test
    • 학습용 레이블 y_train
    • 테스트용 레이블 y_test
  • shuffle은 랜덤으로 진행되되 고정된 랜덤형태로 분리될수 있도록 한다
  • 분리된 '학습용 데이터개수' 와 '테스트용 데이터 개수' 출력하기

from sklearn.model_selection import train_test_split

TODO: 데이터 분할하기↓

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

분리된 학습용 데이터개수와 테스트용 데이터 개수 출력하기↓

len(X_train), len(X_test)

5. Classification 모델 생성/학습하기

  • LogisticRegression 모델로 학습합니다
  • 위 에서 찾은 최적 파라미터 적용하기
  • 모델 변수명 model_lr

bestparams

TODO : LogisticRegression 모델 생성/학습

model_lr = LogisticRegression(C = 1.5, max_iter = 100)

modellr = gs.best_estimator

modellr = LogisticRegression(**best_params) # 세개의 코드 전부 의미는 같다. 택 1하여 사용.
model_lr.fit(X_train, y_train)

6. 교차검증 해보기

  • 원 변수 X, y 에 대한 교차검증 (cross validation) 하기
  • 4-fold(분할) cross validation 진행하기
  • 교차검증의 정확도 score 출력

  • 교차검증의 정확도 score 의 평균과 표준편차 출력

from sklearn.model_selection import cross_val_score, cross_validate

TODO : 교차검증 수행하기

scores = cross_val_score(model_lr, X, y, cv = 4) # 첫번째는 학습된 모델을 넣고, 그 다음 할당한 X, y 입력.

TODO : 교차검증의 정확도 score 출력

scores

TODO : 교차검증의 정확도 score 의 평균과 표준편차 출력

np.mean(scores), np.std(scores)

7-1. 모델 학습 결과 평가하기

  • 테스트 데이터에 대한 예측값을 내어보고
  • 예측값에 대한 classification_report 출력하기

from sklearn.metrics import classification_report

pred = model_lr.predict(X_test)
print(classification_report(y_test, pred))

7-2 . ROC curve 그리기

  • 테스트 결과에 따른 ROC curve 그리기

<예시>
image.png

from sklearn.metrics import roc_curve

from sklearn.metrics import RocCurveDisplay

fig = plt.figure()
ax = fig.gca()

RocCurveDisplay.from_estimator(model_lr, X_test, y_test, ax = ax)

7-3 중요한 feature 고르기

  • XGBClassifier 를 사용하여 승패에 가장 중요한 가장 큰 영향을 끼친 feature 하나를 찾아내세요

TODO: XGBClassifier 사용, 가장 큰 영향을 끼친 feature 는? ↓

from xgboost import XGBClassifier

model_xgb = XGBClassifier(use_label_encoder=False)
model_xgb.fit(X_train, y_train)

modelxgb.feature_importances

plt.bar(X.columns, modelxgb.feature_importances)
plt.xticks(rotation=90)
plt.show()

profile
독해지자

0개의 댓글