Posts 프리미어리그 데이터로 알아보는 간단한 선형회귀
Post
Cancel

프리미어리그 데이터로 알아보는 간단한 선형회귀

1. 프리미어 리그 데이터


1.1 개요

  • 프리미어 리그 데이터를 이용하여 간단한 선형회귀를 실습해보기
  • 데이터에는 득점, 실점, 승점 있고 득점과 실점을 이용하여 승점을 예측하는 모델을 생성 할 예정
  • Scikit-learn 패키지를 사용
    • 데이터 마이닝 및 데이터 분석과 모델링을 위한 패키지
    • 상업적으로 사용이 가능한 오픈소스


1.2 분석 절차

1.2.1 데이터 로드

  • https://raw.githubusercontent.com/hmkim312/hmkim312.github.io/master/assets/datas/premierleague.csv

  • 1) 위의 링크에서 control + s or command + s로 다운 받으면 csv 파일
  • 2) 위의 url을 pd.read_csv로 불러와도됨


1.2.3 데이터 전처리

  • 독립변수와 종속변수를 나눠줌
  • 독립 변수 : 득점, 실점
  • 종속 변수 : 승점


1.2.4 데이터 분석

  • 학습 데이터와 테스트 데이터를 나눠줌
    • X_train, y_train, X_test, y_test
  • train 데이터를 가지고 모델을 만들고 (학습), X_test를 모델에 대입하여 pred_y(예측한 y)를 만듬


1.2.5 성능 평가 : MAE(Mean Absolute Error)

  • 모델로 생성된 pred_y와 y_test와 비교
  • MAE는 오차에 절대값을 씌워 모두 더 한뒤 평균을 낸 값.


1.2.6 예측

  • 생성된 모델에 임이의 다른 점수들을 넣어 예측하는 코드를 작성해봄


1.2.7 모델 저장 및 불러오기

  • pickle을 사용하여 모델 객체를 저장하고, 불러와서 실제 사용되는지 확인해봄


2. 실습


2.1 데이터 로드

1
2
3
4
5
import pandas as pd

# premier_df = pd.read_csv('datas/premierleague.csv')
premier_df = pd.read_csv('https://raw.githubusercontent.com/hmkim312/hmkim312.github.io/master/assets/datas/premierleague.csv')
premier_df


namegfgapoints
0Manchester City10627100
1Manchester United682881
2Tottenham Hotspur743677
3Liverpool843875
4Chelsea623870
5Arsenal745163
6Burnley363954
7Everton445849
8Leicester City566047
9Newcastle United394744
10Crystal Palace455544
11Bournemouth456144
12West Ham United486842
13Watford446441
14Brighton and Hove Albion345440
15Huddersfield Town285837
16Southampton375636
17Swansea City285633
18Stoke City356833
19West Bromwich Albion315631


  • name : 팀명
  • gf : 득점
  • ga : 실점
  • points : 승점
  • 득점(gf), 실점(ga)를 가지고 승점(points)를 예측하는 간단한 회귀분석 모델을 만들 예정


2.2 데이터 전처리

2.2.1 독립, 종속변수 나누기

1
2
X = premier_df[['gf', 'ga']]
y = premier_df['points']
  • X와 y로 독립변수와 종속변수를 나누어 주었다


2.2.2 학습 데이터와 테스트 데이터로 나누기

1
2
3
4
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=1)
  • Sklearn의 train_tset_split을 사용하여 학습 데이터와 테스트 데이터를 나누었다
  • 테스트데이터의 사이즈는 20%(0.2)다


3. 데이터 분석


3.1 선형 회귀 모델 생성

1
2
3
4
from sklearn.linear_model import LinearRegression

lr_model = LinearRegression()
lr_model
1
LinearRegression()
  • 간단히 만드는것이기 떄문에 하이퍼파라미터 튜닝은 따로 하지 않았다


3.2 모델 학습

1
lr_model.fit(X_train, y_train)
1
LinearRegression()
  • 모델학습은 생성한 모델 객체에 fit만 해주면된다


3.3 예측

1
2
pred_y = lr_model.predict(X_test)
pred_y
1
array([81.04882762, 40.79688198, 50.99997729, 46.33521283])
  • 예측하는 코드는 model에 predict 메서드를 사용 하면된다.
  • 승점 예측인데 81.048점 등 소수점으로 나온다


1
2
3
import numpy as np

np.around(pred_y).astype('int')
1
array([81, 41, 51, 46])
  • 예측한 승점 점수에 81.048점 처럼 소수점 같은건 없기 떄문에 np.around로 반올림 해준뒤 int형으로 바꿔주는 전처리를 해줌


4. 성능 평가


4.1 MAE로 성능 평가

1
2
3
4
from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_test, pred_y)
round(mae,2)
1
4.05
  • MAE는 낮을수록 좋으나 4점이 얼마나 좋은지는 알 수는 없다.
  • round 함수를 사용하여 소수점 2자리까지 출력함


5. 예측


5.1 예측 함수 작성

1
2
def make_df(gf, ga):
    return pd.DataFrame({'gf' : [gf], 'ga' : [ga]})
  • gf(득점)과 ga(실점)을 넣으면 데이터 프레임으로 만들어주는 함수를 작성
  • 이후 모델에 예측 데이터를 넣을때 사용하기 위해서 만든것


5.2 예측 모델 확인

1
2
gf, ga = 78, 30
int(np.around(lr_model.predict(make_df(gf, ga))))
1
82
  • 득점을 78, 실점을 30점으로 넣으면 위에서 만든 선형회귀모델은 승점 82점을 예측해준다고 한다.


6. Model의 Save와 Load


6.1 Model Save

1
2
3
4
import pickle

with open('datas/premier_lr_model.pkl', 'wb') as f:
    pickle.dump(lr_model, f)
  • pickle을 불러와서 모델을 저장하는 코드
  • 모델을 저장하는 이유
    • Ram에 저장되어있는 model의 fit이 오래걸릴수 있음
    • 코드를 재 실행하면 학습한 model이 사라짐을 방지하기 위해


6.2 Model Load

1
2
with open('datas/premier_lr_model.pkl', 'rb') as f:
    load_model = pickle.load(f)
  • 방금 저장한 모델을 load_model이라는 객체에 불러와서 저장시킴


6.3 Load된 Model 확인

1
2
gf, ga = 78, 30
int(np.around(load_model.predict(make_df(gf, ga))))
1
82
  • 아까와 같이 똑같은 승점을 예측하는것을 알수있다.
  • 이처럼 모델을 생성, 저장, 불러오기를 하면 매번 코드가 재실행될때마다 재 학습을 하지 않아도된다.
  • 데이터가 적으면 재 학습이 오래걸리진 않으나, 데이터가 많다면 학습에 시간이 오래걸리기 때문이다.
This post is licensed under CC BY 4.0 by the author.

판다스(Pandas) 기초(3)

MySQL 기초(1)

Comments powered by Disqus.