用英超賽事數據實踐機器學習
Experiencing Machine Learning with Premier League Data
作者以 2024-2025 賽季英超賽事數據訓練隨機森林分類器,根據射門、射正、犯規及卡牌等特徵預測比賽結果。模型準確率為 59%,較能預測主隊和客隊勝出,較難預測和局;在一場新賽事的示例中,模型預測客隊勝出。
Introduction: Taking on Machine Learning!
I've been studying machine learning recently. To gain practical experience, I decided to work with Premier League data and apply machine learning techniques to it.
Using Premier League Match Data
For this project, I used match result data from the 2024-2025 season. The data was downloaded from this site.
As the main features, I selected the following:
- Shots (HS, AS)
- Shots on Target (HST, AST)
- Fouls (HF, AF)
- Cards (HY, AY)
The target variable is the match result (win, draw, or loss).
Building a Machine Learning Model
Here's the actual code I used:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
import joblib
# 1. Load data
df = pd.read_csv('epl2024.csv')
# 2. Extract only necessary columns
features = ['HS', 'AS', 'HST', 'AST', 'HF', 'AF', 'HC', 'AC', 'HY', 'AY'] # Shots, fouls, cards, etc.
target = 'FTR' # Match result (H/D/A)
# 3. Create feature and target data
X = df[features]
y = df[target]
# 4. Label encoding (convert target variable to numbers)
le = LabelEncoder()
y_encoded = le.fit_transform(y) # H->0, D->1, A->2, etc.
# 5. Split into training and test data
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)
# 6. Create and train model
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 7. Prediction and evaluation
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred, target_names=le.classes_))
# 8. Save the trained model and label encoder
joblib.dump(model, 'epl_rf_model.pkl')
joblib.dump(le, 'label_encoder.pkl')
Looking at Prediction Results and Evaluation
When I ran the code, I got the following output:
Accuracy: 0.5921052631578947
Classification Report:
precision recall f1-score support
A 0.62 0.75 0.68 28
D 0.15 0.12 0.14 16
H 0.76 0.69 0.72 32
accuracy 0.59 76
macro avg 0.51 0.52 0.51 76
weighted avg 0.58 0.59 0.58 76
The accuracy (correct prediction rate) was 59%. Looking at the details more closely, I can see that away wins (A) and home wins (H) have both high precision and recall, so the model predicts them fairly accurately. On the other hand, draws (D) are difficult for the model to predict.
Making Actual Predictions
Now that I've created the model, let me use it to make predictions on new data:
import pandas as pd
import numpy as np
import joblib
model = joblib.load('epl_rf_model.pkl')
le = joblib.load('label_encoder.pkl')
# New match data (as a DataFrame with feature names)
new_match = pd.DataFrame(
[[15, 8, 1, 3, 10, 12, 5, 4, 2, 1]],
columns=['HS', 'AS', 'HST', 'AST', 'HF', 'AF', 'HC', 'AC', 'HY', 'AY']
)
predicted_num = model.predict(new_match)
predicted_label = le.inverse_transform(predicted_num)
print(f"Prediction result: {predicted_label[0]}")
What Was the Prediction Result for the New Match?
The output was as follows:
Prediction result: A
In this example, the home team had only 1 shot on target while the away team had 3 shots on target, so the model predicted an away team victory.
Summary
Even though I had almost no knowledge of machine learning, working hands-on with actual data deepened my understanding. Next, I'd like to try more advanced analysis, such as predicting next season's standings (hoping my favorite Manchester United will finish in first place...!)
來源:DEV Community · dev.to