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
name | gf | ga | points | |
---|---|---|---|---|
0 | Manchester City | 106 | 27 | 100 |
1 | Manchester United | 68 | 28 | 81 |
2 | Tottenham Hotspur | 74 | 36 | 77 |
3 | Liverpool | 84 | 38 | 75 |
4 | Chelsea | 62 | 38 | 70 |
5 | Arsenal | 74 | 51 | 63 |
6 | Burnley | 36 | 39 | 54 |
7 | Everton | 44 | 58 | 49 |
8 | Leicester City | 56 | 60 | 47 |
9 | Newcastle United | 39 | 47 | 44 |
10 | Crystal Palace | 45 | 55 | 44 |
11 | Bournemouth | 45 | 61 | 44 |
12 | West Ham United | 48 | 68 | 42 |
13 | Watford | 44 | 64 | 41 |
14 | Brighton and Hove Albion | 34 | 54 | 40 |
15 | Huddersfield Town | 28 | 58 | 37 |
16 | Southampton | 37 | 56 | 36 |
17 | Swansea City | 28 | 56 | 33 |
18 | Stoke City | 35 | 68 | 33 |
19 | West Bromwich Albion | 31 | 56 | 31 |
- 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
- 아까와 같이 똑같은 승점을 예측하는것을 알수있다.
- 이처럼 모델을 생성, 저장, 불러오기를 하면 매번 코드가 재실행될때마다 재 학습을 하지 않아도된다.
- 데이터가 적으면 재 학습이 오래걸리진 않으나, 데이터가 많다면 학습에 시간이 오래걸리기 때문이다.