-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPositionalModelXGB.py
84 lines (69 loc) · 3.73 KB
/
PositionalModelXGB.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from xgboost import XGBRegressor
from sklearn.ensemble import GradientBoostingRegressor
from catboost import CatBoostRegressor
import numpy as np
class PositionalModelXGB:
def __init__(self, features_GK, features_outfield, to_predict, model_GK=None, model_outfield=None ):
self.features_GK = features_GK
self.features_outfield = features_outfield
self.to_predict = to_predict
if model_GK:
self.model_GK = model_GK
else:
self.model_GK = XGBRegressor(
random_state=42,
# verbosity = 0,
# n_estimators=500,
# early_stopping_rounds=5,
# learning_rate=0.2
)
if model_outfield:
self.model_outfield = model_outfield
else:
self.model_outfield = XGBRegressor(
random_state=42,
# verbosity = 0,
# n_estimators=500,
# early_stopping_rounds=5,
# learning_rate=0.2
)
self.assign_custom_predicts()
def fit(self, X, y, X_valid, y_valid):
# print(y[y["FPL_pos"] == "GK"].shape)
self.model_GK.fit(X[X["FPL_pos"] == "GK"][self.features_GK], y[y["FPL_pos"] == "GK"][self.to_predict],
# eval_set=[(X_valid[X_valid["FPL_pos"] == "GK"][self.features_GK], y_valid[y_valid["FPL_pos"] == "GK"][self.to_predict])],
# verbose=False
)
self.model_outfield.fit(X[X["FPL_pos"] != "GK"][self.features_outfield], y[y["FPL_pos"] != "GK"][self.to_predict],
# eval_set=[(X_valid[X_valid["FPL_pos"] != "GK"][self.features_outfield], y_valid[y_valid["FPL_pos"] != "GK"][self.to_predict])],
# verbose=False
)
def predict(self, X):
X_preds = X.copy()
# print(X_preds[X_preds["FPL_pos"] == "GK"].shape, X_preds[X_preds["FPL_pos"] == "GK"][self.features_GK].shape, self.model_GK.predict( X_preds[X_preds["FPL_pos"] == "GK"][self.features_GK] ).shape)
if X_preds[X_preds["FPL_pos"] == "GK"].size > 0:
X_preds.loc[X_preds["FPL_pos"] == "GK", "Pred"] = self.model_GK.predict( X_preds[X_preds["FPL_pos"] == "GK"][self.features_GK] )
if X_preds[X_preds["FPL_pos"] != "GK"].size > 0:
X_preds.loc[X_preds["FPL_pos"] != "GK", "Pred"] = self.model_outfield.predict( X_preds[X_preds["FPL_pos"] != "GK"][self.features_outfield] )
return X_preds["Pred"].to_list()
def custom_predict_GK(self, X):
XGB_COMPONENT = 0.3
OVERALL_COMPONENT = 0.67
FORM_COMPONENT = 0.2
model_pred = np.array(self.model_GK.predict_old(X))
overall_pred = np.array([row["Avg_FPL_points"] for i, row in X.iterrows()])
form_pred = np.array([row["FPL_points_4"] for i, row in X.iterrows()])
return np.add( model_pred * XGB_COMPONENT, overall_pred * OVERALL_COMPONENT, form_pred * FORM_COMPONENT )
def custom_predict_outfield(self, X):
XGB_COMPONENT = 0.39
OVERALL_COMPONENT = 0.45
FORM_COMPONENT = 0.16
model_pred = np.array(self.model_outfield.predict_old(X))
overall_pred = np.array([row["Avg_FPL_points"] for i, row in X.iterrows()])
form_pred = np.array([row["xP_4"] for i, row in X.iterrows()])
return np.add( model_pred * XGB_COMPONENT, overall_pred * OVERALL_COMPONENT, form_pred * FORM_COMPONENT )
def assign_custom_predicts(self):
self.model_outfield.predict_old = self.model_outfield.predict
self.model_outfield.predict = self.custom_predict_outfield
self.model_GK.predict_old = self.model_GK.predict
self.model_GK.predict = self.custom_predict_GK