Я использую RandomForestRegressor для прогнозирования набора футбольных матчей, чтобы предсказать количество голов, забитых для данного матча / набора матчей, как показано ниже:
dte.head()
HomeTeam
AwayTeam B365H B365D B365A FTHG FTAG
-- -------------- ---------- ------- ------- ------- ------ ------
0 Leeds Chelsea 4.8 3.9 1.68 nan nan
1 Crystal Palace West Brom 2.28 3 3.4 nan nan
2 Everton Burnley 1.95 3.2 4.2 nan nan
3 Fulham Man City 10.5 5 1.3 nan nan
4 Southampton Brighton 2.9 3.05 2.55 nan nan
dtr.head()
HomeTeam AwayTeam FTHG FTAG
-- -------------- ----------- ------ ------
0 Fulham Arsenal 0 3
1 Crystal Palace Southampton 1 0
2 Liverpool Leeds 4 3
3 West Ham Newcastle 0 2
4 West Brom Leicester 0 3
def encode_features(df_train, df_test):
features = ['HomeTeam', 'AwayTeam']
df_combined = pd.concat([df_train[features], df_test[features]])
for feature in features:
le = preprocessing.LabelEncoder()
le = le.fit(df_combined[feature])
df_train[feature] = le.transform(df_train[feature])
df_test[feature] = le.transform(df_test[feature])
return df_train, df_test
dtr, dte = encode_features(dtr, dte)
dtr_g = dtr.loc[:, dte.columns.intersection(
['HomeTeam', 'AwayTeam', 'FTHG', 'FTAG', 'B365H', 'B365D', 'B365A'])]
dte_g = dte.loc[:, dte.columns.intersection(
['HomeTeam', 'AwayTeam', 'FTHG', 'FTAG', 'B365H', 'B365D', 'B365A'])]
dtr_g_h = dtr_g.drop(['FTAG'], axis=1)
dtr_g_a = dtr_g.drop(['FTHG'], axis=1)
dte_g = dte_g.drop(['FTHG', 'FTAG'], axis=1)
dte_g = dte_g.dropna()
# Encoding string features
def encode_features(df_train, df_test):
features = ['HomeTeam', 'AwayTeam']
df_combined = pd.concat([df_train[features], df_test[features]])
for feature in features:
le = preprocessing.LabelEncoder()
le = le.fit(df_combined[feature])
df_train[feature] = le.transform(df_train[feature])
df_test[feature] = le.transform(df_test[feature])
return df_train, df_test
dtr, dte = encode_features(dtr, dte)
# After Encoding
dte_g.head()
HomeTeam AwayTeam B365H B365D B365A Month Weekend/Weekday
-- ---------- ---------- ------- ------- ------- ------- -----------------
0 271 114 4.8 3.9 1.68 3 2
1 134 495 2.28 3 3.4 3 2
2 170 88 1.95 3.2 4.2 3 2
3 194 297 10.5 5 1.3 3 2
4 429 83 2.9 3.05 2.55 3 1
dtr_g_h.head()
HomeTeam AwayTeam B365H B365D B365A Month FTHG Weekend/Weekday
-- ---------- ---------- ------- ------- ------- ------- ------ -----------------
0 194 33 6 4.33 1.53 9 0 1
1 134 428 3.1 3.25 2.37 9 1 1
2 282 271 1.28 6 9.5 9 4 1
3 497 326 2.15 3.4 3.4 9 0 1
4 496 273 3.8 3.6 1.95 9 0 1
dtr_g_a.head()
HomeTeam AwayTeam B365H B365D B365A Month FTAG Weekend/Weekday
-- ---------- ---------- ------- ------- ------- ------- ------ -----------------
0 194 33 6 4.33 1.53 9 3 1
1 134 428 3.1 3.25 2.37 9 0 1
2 282 271 1.28 6 9.5 9 3 1
3 497 326 2.15 3.4 3.4 9 2 1
4 496 273 3.8 3.6 1.95 9 3 1
# Predicing Goals
X_g_h = dtr_g_h.drop(['FTHG'], axis=1)
y_g_h = dtr_g_h['FTHG']
X_g_a = dtr_g_a.drop(['FTAG'], axis=1)
y_g_a = dtr_g_a['FTAG']
print("Splitting for Home")
train_X_g_h, val_X_g_h, train_y_g_h, val_y_g_h = train_test_split(X_g_h, y_g_h, test_size=0.2, random_state=1)
print("Splitting for away goals")
train_X_g_a, val_X_g_a, train_y_g_a, val_y_a = train_test_split(X_g_a, y_g_a, test_size=0.2, random_state=1)
print("Running Random Forest model")
rf_model_on_full_data_g_h = RandomForestRegressor()
rf_model_on_full_data_g_a = RandomForestRegressor()
print("Fitting for home goals")
rf_model_on_full_data_g_h.fit(X_g_h, y_g_h)
rf_model_on_full_data_g_a.fit(X_g_a, y_g_a)
print("Predicting goals for Home Team")
test_preds_h_g = rf_model_on_full_data_g_h.predict(dte_g)
print("Predicting goals for Away Team")
test_preds_a_g = rf_model_on_full_data_g_a.predict(dte_g)
result = pd.DataFrame({
'League': dte_input.League,
'Match DateTime': dte_input.DateTime,
'Home Team': dte_input.HomeTeam,
'Away Team': dte_input.AwayTeam,
'Full time Home Goals': test_preds_h_g,
'Full time Away Goals': test_preds_a_g,
})
result.head():
| | League | Match DateTime | Home Team | Away Team | Full time Home Goals | Full time Away Goals |
|-----|------------------------|----------------------------|--------------------|---------------------|------------------------|------------------------|
| 0 | English Premier League | 2021-03-12 23:00:00.000001 | Leeds | Chelsea | 1.23 | 1.84 |
| 1 | English Premier League | 2021-03-12 23:00:00.000001 | Crystal Palace | West Brom | 1.65 | 1.13 |
| 2 | English Premier League | 2021-03-12 23:00:00.000001 | Everton | Burnley | 1.4 | 0.73 |
| 3 | English Premier League | 2021-03-12 23:00:00.000001 | Fulham | Man City | 0.59 | 2.35 |
| 4 | English Premier League | 2021-03-13 23:00:00.000001 | Southampton | Brighton | 1.34 | 1.36 |
| 5 | English Premier League | 2021-03-13 23:00:00.000001 | Leicester | Sheffield United | 1.75 | 0.92 |
| 6 | English Premier League | 2021-03-13 23:00:00.000001 | Arsenal | Tottenham | 1.37 | 1.19 |
Мой квестон преимущественно:
- Правильно ли я применяю регрессию? Я получаю результат, который (в рамках понимания футбольных матчей и границ результатов) приемлем для реального мира. Как это сочетается; Я частично это осознаю.
- Если я могу понять это с точки зрения непрофессионала, я задаю вопрос: 1- Прогнозируйте цели домашней команды, когда две команды играют на основе исторических данных. 2. Точно так же прогнозируйте голы команды гостей. Но это осторожные вопросы, на которые осторожно отвечают, в то время как футбольное мероприятие носит не дискретный, а динамичный характер (я, наверное, могу лучше сформулировать это определенно) Подхожу ли я к этой проблеме правильно?
- Есть ли способ использовать
.predict
таким образом, чтобы я мог получать прогнозы HomeTeam и AwayTeam одновременно? (НАСКОЛЬКО МНЕ ИЗВЕСТНО.predict
может использоваться только для одной переменной, а не для нескольких переменных)
Если я подам заявление GridsearchCV
результаты не улучшаются (по сравнению с реальным миром), следовательно, нет никакой ценности в соотношении ресурсов обработки / результата. Могу ли я улучшить этот алгоритм / применить лучше sklearn.predict
опции?