본문 바로가기

Analytics/Study

실전#4 오늘 밤 유럽 축구, 어디가 이길까(6)

이제 모델 학습 및 심화 분석 과정이다.
 
바로 본론으로 들어가보자
 

Logistic Regression

from sklearn.linear_model import LogisticRegression

# LogisticRegression 모델 생성/학습
model_lr = LogisticRegression(max_iter = 10000)
model_lr.fit(X_train, y_train)

동일하게 로지스틱 회귀분류 모델을 생성/학습한다.
이 때 옵션에 추가되는 max_iter는 과소적합을 줄이기 위한 방법이다.
과소적합을 줄이기 위해 alpha 값 조정이 필요한데 max_iter(반복 실행하는 최대 횟수)를 통해 조정할 수 있다.
물론 alpha값을 낮추면 모델의 복잡도는 증가하는 반면, train과 test에서의 성능은 개선되는 장점이 있다.
 

from sklearn.metrics import classification_report

# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_lr.predict(X_test)
print(classification_report(y_test, pred))

학습한 모델 평가를 확인해보면
전체적인 accuracy가 0.48로 일반적인 모델 결과에 비해 낮은 것을 확인할 수 있다.
추가로 강의에서는 각각의 target별 비중을 통해 어느 타겟에 얼마만큼 정확도가 있는지를 살펴보았다.

print(sum((y_test == 0)) / len(y_test))
print(sum((y_test == 1)) / len(y_test))
print(sum((y_test == 2)) / len(y_test))

## 결과
0.4531148393809338
0.2564702822213552
0.290414878397711

전체 y_test 갯수 중 0,1,2 별 합을 비율로 살펴본 내용이다.
강의에서는 이 부분 역시 의미있게 설명해주었지만
개인적으로는 모델 성능이 워낙 낮아서 추가적인 과정의 의미를 깊이있게 공감하지는 못했던 것 같다.
(여러 방향으로 개선한 결과가 역시 유사하다면, 그 때 의미를 가질 수 있을까?)
 
뒷강의에서 다루었지만, 흐름상 먼저 설명하는게 좋을 것 같아 심화 분석까지 함께 살펴보자

# Logistic Regression 모델의 coef_ 속성을 plot하기
fig = plt.figure(figsize=(15,5))
plt.plot(X.columns, model_lr.coef_[0])
plt.xticks(rotation = 90)
plt.title('What Makes Home Team Wins?')
plt.grid()
plt.show()

 
모델 계수를 통한 상관성 파악을 위해 plot 그래프를 그려보았다.
홈팀의 승리를 위해 가장 상관성이 높게 나타난 변수는 'away_defencePressureClass_High', 'home_defenceAggressionClass_Press' 였다. 반대로 가장 상관성이 낮은 변수는 'home_defencePressureClass_High'로 나타났다.
의미를 해석해보자면?
원정팀의 수비압박 분류가 높고, 홈팀의 수비적극성 분류가 압박이라면 승리와의 상관성이 높다는 의미가 되겠다.
(실질적인 의미 판단은 일단 보류하기로...)
 

# Logistic Regression 모델의 coef_ 속성을 plot하기
fig = plt.figure(figsize=(15,5))
plt.plot(X.columns, model_lr.coef_[2])
plt.xticks(rotation = 90)
plt.title('What Makes Away Team Wins?')
plt.grid()
plt.show()

 
원정팀에 대한 결과 역시 범주형 변수들의 상관성이 높게 나타나고 있음을 알 수 있다.
 

XGBoost

from xgboost import XGBClassifier

# XGBClassifier 모델 생성/학습
model_xgb = XGBClassifier()
model_xgb.fit(X_train, y_train)

# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_xgb.predict(X_test)
print(classification_report(y_test, pred))

모델 성능이 (강의에서는 조금 차이가 있었지만)
내가 돌렸을 때에는 로지스틱과 유사한 수준으로 나타났다.
 

# XGBoost 모델의 feature_importances_ 속성을 plot하기
fig = plt.figure(figsize = (15,6))
plt.bar(X.columns, model_xgb.feature_importances_)
plt.xticks(rotation = 90)
plt.show()
feature_importances를 통한 변수별 중요도를 살펴보면,
이 때에도 범주형 변수들의 중요도가 높게 나타났고
수치형 변수들은 중요도가 낮은축에 몰려있었다.
 
 
축구에 대한 도메인 이해가 아예 없는 것은 아니기에
수치형 변수들이 제대로 모델에 학습되지 못한 것 같다는 생각이 들었다.
마침 강의에서도 추가 강의가 마련되어있어
비슷한 흐름의 내용 전개를 기대해보자.
 
http://bit.ly/3Y34pE0

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.