Avrupa Futbol Takımlarının Regresyon (Regression)
Modeli İle Analizi -Scikit-learn
Dataset' i Kaggle'dan indirebilirsiniz.
+25,000 maç +10,000 futbolcu 11 Ülkenin şampiyon kulüpleri 2008 - 2016 Sezonu Takım ve Futbolcuların Özellikleri Ayrıntılı Maç Detayları (Gol Tipleri, pozisyonlar, korner, çalım , faul, kartlar vs...) +10,000 maç için.
Gerekli Küphanelerin İçe Aktarımı
import sqlite3
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
Veritabanından Veriyi Pandas DataFrame'ine Çekme
# sqlite3 ile veritabanı bağlantısı kurma
cnx = sqlite3.connect('database.sqlite')
df = pd.read_sql_query("SELECT * FROM Player_Attributes", cnx)
df.head()
id | player_fifa_api_id | player_api_id | date | overall_rating | potential | preferred_foot | attacking_work_rate | defensive_work_rate | crossing | ... | vision | penalties | marking | standing_tackle | sliding_tackle | gk_diving | gk_handling | gk_kicking | gk_positioning | gk_reflexes | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 218353 | 505942 | 2016-02-18 00:00:00 | 67.0 | 71.0 | right | medium | medium | 49.0 | ... | 54.0 | 48.0 | 65.0 | 69.0 | 69.0 | 6.0 | 11.0 | 10.0 | 8.0 | 8.0 |
1 | 2 | 218353 | 505942 | 2015-11-19 00:00:00 | 67.0 | 71.0 | right | medium | medium | 49.0 | ... | 54.0 | 48.0 | 65.0 | 69.0 | 69.0 | 6.0 | 11.0 | 10.0 | 8.0 | 8.0 |
2 | 3 | 218353 | 505942 | 2015-09-21 00:00:00 | 62.0 | 66.0 | right | medium | medium | 49.0 | ... | 54.0 | 48.0 | 65.0 | 66.0 | 69.0 | 6.0 | 11.0 | 10.0 | 8.0 | 8.0 |
3 | 4 | 218353 | 505942 | 2015-03-20 00:00:00 | 61.0 | 65.0 | right | medium | medium | 48.0 | ... | 53.0 | 47.0 | 62.0 | 63.0 | 66.0 | 5.0 | 10.0 | 9.0 | 7.0 | 7.0 |
4 | 5 | 218353 | 505942 | 2007-02-22 00:00:00 | 61.0 | 65.0 | right | medium | medium | 48.0 | ... | 53.0 | 47.0 | 62.0 | 63.0 | 66.0 | 5.0 | 10.0 | 9.0 | 7.0 | 7.0 |
5 rows × 42 columns
silmeden_once = df.shape[0]
silmeden_once
183978
df.columns
Index(['id', 'player_fifa_api_id', 'player_api_id', 'date', 'overall_rating', 'potential', 'preferred_foot', 'attacking_work_rate', 'defensive_work_rate', 'crossing', 'finishing', 'heading_accuracy', 'short_passing', 'volleys', 'dribbling', 'curve', 'free_kick_accuracy', 'long_passing', 'ball_control', 'acceleration', 'sprint_speed', 'agility', 'reactions', 'balance', 'shot_power', 'jumping', 'stamina', 'strength', 'long_shots', 'aggression', 'interceptions', 'positioning', 'vision', 'penalties', 'marking', 'standing_tackle', 'sliding_tackle', 'gk_diving', 'gk_handling', 'gk_kicking', 'gk_positioning', 'gk_reflexes'], dtype='object')
Analizde Kullanacağımız Özellikleri (Features) Tanımlama
features = [
'potential', 'crossing', 'finishing', 'heading_accuracy',
'short_passing', 'volleys', 'dribbling', 'curve', 'free_kick_accuracy',
'long_passing', 'ball_control', 'acceleration', 'sprint_speed',
'agility', 'reactions', 'balance', 'shot_power', 'jumping', 'stamina',
'strength', 'long_shots', 'aggression', 'interceptions', 'positioning',
'vision', 'penalties', 'marking', 'standing_tackle', 'sliding_tackle',
'gk_diving', 'gk_handling', 'gk_kicking', 'gk_positioning',
'gk_reflexes']
Y (Target-Sonuç) Tanımlama
target = ['overall_rating']
Data Temizleme
bos_satir_sayisi = df.isnull().any(axis=1).sum()
bos_satir_sayisi
3624
df = df.dropna()
sildikten_sonra = df.shape[0]
sildikten_sonra
180354
#Bu işlemin sonucu bos_satir_sayisi = 3624 değerine eşit olmalı
silmeden_once - sildikten_sonra
3624
Gördüğünüz gibi sonuç istediğimiz değere eşit çıktı
Özellikleri (Features) ve Target Değerlerini Ayrıştıma
X = df[features]
y = df[target]
X.shape
(180354, 34)
X.iloc[2]
potential 66.0 crossing 49.0 finishing 44.0 heading_accuracy 71.0 short_passing 61.0 volleys 44.0 dribbling 51.0 curve 45.0 free_kick_accuracy 39.0 long_passing 64.0 ball_control 49.0 acceleration 60.0 sprint_speed 64.0 agility 59.0 reactions 47.0 balance 65.0 shot_power 55.0 jumping 58.0 stamina 54.0 strength 76.0 long_shots 35.0 aggression 63.0 interceptions 41.0 positioning 45.0 vision 54.0 penalties 48.0 marking 65.0 standing_tackle 66.0 sliding_tackle 69.0 gk_diving 6.0 gk_handling 11.0 gk_kicking 10.0 gk_positioning 8.0 gk_reflexes 8.0 Name: 2, dtype: float64
Sonuç (Target) değerlerine bakalım.
y.head(50)
overall_rating | |
---|---|
0 | 67.0 |
1 | 67.0 |
2 | 62.0 |
3 | 61.0 |
4 | 61.0 |
5 | 74.0 |
6 | 74.0 |
7 | 73.0 |
8 | 73.0 |
9 | 73.0 |
10 | 73.0 |
11 | 74.0 |
12 | 73.0 |
13 | 71.0 |
14 | 71.0 |
15 | 71.0 |
16 | 70.0 |
17 | 70.0 |
18 | 70.0 |
19 | 70.0 |
20 | 70.0 |
21 | 70.0 |
22 | 69.0 |
23 | 69.0 |
24 | 69.0 |
25 | 69.0 |
26 | 69.0 |
27 | 69.0 |
28 | 69.0 |
29 | 68.0 |
30 | 65.0 |
31 | 64.0 |
32 | 54.0 |
33 | 51.0 |
34 | 52.0 |
35 | 47.0 |
36 | 53.0 |
37 | 53.0 |
38 | 65.0 |
39 | 66.0 |
40 | 66.0 |
41 | 67.0 |
42 | 68.0 |
43 | 68.0 |
44 | 68.0 |
45 | 69.0 |
46 | 70.0 |
47 | 71.0 |
48 | 70.0 |
49 | 70.0 |
Dataset' i Eğitim (Train) ve Test Kümelerine Ayrıma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=324)
(1) Lineer Regresyon (Linear Regression):
regression = LinearRegression()
regression.fit(X_train, y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
Lineer Regresyon Modeli İle Tahmin Yapma
y_prediction = regression.predict(X_test)
y_prediction
array([[ 66.51284879], [ 79.77234615], [ 66.57371825], ..., [ 69.23780133], [ 64.58351696], [ 73.6881185 ]])
Tahmin Edilmesi Gereken Sonuç (Target) Değerinin Ortalamısı Nedir?
y_test.describe()
overall_rating | |
---|---|
count | 59517.000000 |
mean | 68.635818 |
std | 7.041297 |
min | 33.000000 |
25% | 64.000000 |
50% | 69.000000 |
75% | 73.000000 |
max | 94.000000 |
68.63 oranında bir ortalamaya sahip. Tahmin değerlerimizinde bu civarda çıkmasını bekliyoruz.
Lineer Regresyon Modelinin Doğruluğunu Root Mean Square Error Kullanarak Bulma
Eğer sonuç 0 çıkarsa Modelimiz mükemmel bir tahmin yapmıştır.
rmse = sqrt(mean_squared_error(y_true = y_test, y_pred = y_prediction))
print(rmse)
2.805303046855223
(2) Karar Ağacı (Decision Tree):
regression = DecisionTreeRegressor(max_depth=20)
regression.fit(X_train, y_train)
DecisionTreeRegressor(criterion='mse', max_depth=20, max_features=None, max_leaf_nodes=None, min_impurity_split=1e-07, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best')
Karar Ağacı Modeli İle Tahmin Yapma
y_prediction = regression.predict(X_test)
y_prediction
array([ 62. , 84. , 62.38666667, ..., 71. , 62. , 73. ])
For comparision: What is the mean of the expected target value in test set ?
y_test.describe()
overall_rating | |
---|---|
count | 59517.000000 |
mean | 68.635818 |
std | 7.041297 |
min | 33.000000 |
25% | 64.000000 |
50% | 69.000000 |
75% | 73.000000 |
max | 94.000000 |
Karar Ağacı Modelinin Doğruluğunu Root Mean Square Error Kullanarak Bulma
rmse = sqrt(mean_squared_error(y_true = y_test, y_pred = y_prediction))
print(rmse)
1.461295383115322