본문 바로가기
프로젝트/축구결과 예측 모델

[ML-01] 문제 개요 및 정의

by 너티드코오딩 2023. 11. 19.

 

축구결과 예측모델은 정말 단순한 호기심에서 출발했다.

먼저 나는 축구광이고, 한때 축구 스타트업에서 근무를 했었던 적이 있었다. 그 당시 여러 미팅을 하면서 들었던 체육****의 이야기를 듣고 들었던 생각이 '아, 절대로 망할 수 없는 구조다' 였다.

 

이윽고 시간이 흘러, 내가 AI를 공부하고, 여러 모델을 학습하면서 스포츠분야에서 내가 직접 AI 모델을 만들고 싶다는 생각을 하게 되었다.

 

'오즈들의 선택은 항상 경제적일까?'

'배당을 변동하는 이유는 환급에 있어서 손해를 보지 않으려고?'

'과연 오즈들은 절대로 손해를 보지 않는 구조를 만들어 내는가?'

 

이러한 개인적 호기심에서 출발해서 내가 이 아이디어를 뿌시는(?) 축구결과 예측모델을 만들어보자고 다짐했다.

 

사실 이 프로젝트를 만들어보면서 정말 비약적으로 머신러닝 스킬과 파이썬 스킬이 상승했다. 특히 데이터 수집, 가공, 전처리 부분에서 역량이 말이다.

 

이전까지는 제공되는 자료를 활용했고, 캐글, 데이콘 등 주어지는 데이터에서 그저 모델학습과 시각화에만 급급했는데

이 프로젝트를 해보면서 문제정의부터 검증까지. 모든 스텝을 내 판단에 의해서, 내가 자율적으로 하다보니 '데이터분석'의 제대로 된 맛을 본 것 같다. 

 

어떻게 해야 성능을 높일 수 있을지, Recall과 Precision에서 무엇이 더 중요한지.

이런 부분들은 이론에서 많이 배우지만, 실제 실습에서는 비교적 간단하게 넘어가는 경우가 많다. 하지만 이번 프로젝트를 하면서 직접 경험했고 이 경험에 대해서 기록해보고자 프로젝트를 하나씩 정리해보고자 한다.

 

먼저 이 프로젝트에 대해 설명을 해보면, 말 그대로 축구 결과를 예측하는 모델이다.

매주 발생하는 축구 경기의 값들을 넣으면 이 경기의 승, 무, 패 결과를 예측해준다.

프로젝트 세부 설명에 앞서, 문제정의부터 해당 ML의 워크플로우를 이해해보고자 한다.

 

축구경기 결과예측 모델의 Workflow

 

먼저 문제정의 부터 살펴보겠다. 사실 본 프로젝트는 개인적 흥미와 호기심에서 출발했기 때문에.. 현상, 문제점, 기대효과 등이 프로젝트처럼 실용적이거나 구체적으로 나타나지는 않았지만 한번 작성해보았다.

원래 목적은 예측을 정확하게 해서 좀 맞혀보자..ㅎ

 

이를 위해 활용한 데이터는 국내 합법 스포츠 배당을 보여주는 베트맨 사이트의 승, 무, 패 배당과 그 경기의 환급률 총 6개의 수치형 데이터와, 리그라는 카테고리 변수를 활용해 총 7개의 데이터를 수집하였다.

해당 데이터는 크롤링을 통해 수집했고, 이상치와 경향성을 확인했다.

 

다음으로 데이터 전처리를 진행했는데, IQR을 활용해 이상치를 제거하는 것이 일반적이나, 여러 테스트 결과 축구경기의 경우 오히려 IQR을 제거했을 때보다 제거 하지 않았을 때 더 성능이 좋았다.

여기서 이제 이론과 실제의 차이를 느꼈다.

책과 이론에서는 이상치를 제거해야한다., IQR을 활용한다. 이런 얘기들이 있지만, 상황에 따라 다르다는 것이다.

축구에서의 이상치는 꼭 제거할 필요가 없었던 것이, 배당이나 환급률의 이상치가 오타도 아니고, 오히려 이상치 영역에서 유의미한 부분들이 있었다.

정리하자면, 도메인 영역에 따라 이상치를 어떻게 처리해야할지 판단할 필요가 있다.

 

피쳐 엔지니어링 파트에서는 환급률을 재계산했고, 경기 결과의 편향이 있는 데이터의 특성상(승이 비율적으로 많았음) 이를 재계산할 필요가 있어서 종속변수 가중치를 계산해 불균등을 해결해보았다.

이때 활용한 것이 weight(가중치)와 SMOTE 기법.

 

모델은 XGB, RF, LGB를 활용했는데 앙상블로 2개의 모델을 스태이킹 해서 활용하면 더 좋을 수 있다는 논문을 읽어보고 stacking 모델을 활용해보았다. 확실히 stacking 모델이 조금 더 과감했다고 해야할까.. 천천히 정리해보겠다.

 

마지막 모델 검증은 'Recall vs Precision'으로 표현해보았는데, Recall을 활용했다.

이유또한 천천히 검증파트에서 풀어보겠다.

 

해당 모델은 올 중순에 제작을 완료하였고, 모델의 하이퍼파라미터 튜닝을 위해 Optuna패키지 활용을 하고 있다.

GridSearchCV는 너무 오래걸려서..(내가 잘못했을 수도 있지만) Optuna로 선택하였다.

Recall을 개선하고자 데이터를 지금까지도 데이터를 수집하고 있으며 약 7천개 이상의 데이터를 확보했고 지속적으로 튜닝중이다.

현재 Recall은 최대 55%까지 나오는 걸 봤을 때, 단순하게 승, 무, 패 33% 의 확률보다는 비교적 높은 성능을 보여주고 있다.

 

해당 모델은 ML을 활용했지만, 향후 딥러닝 기반의 모델도 구축해볼 의향이 있다. 올해 말까지 수집한다면 데이터는 충분할것으로 보기 때문에.

 

다음 파트는 데이터 수집과정과 EDA를 보여주고자 한다.

 

* 구체적인 코드는 공유하지 않을 예정이다.