在本文中,将探讨如何利用Keras框架和FIFA数据集来构建一个神经网络模型,该模型能够预测足球运动员的位置。这个完整的过程包括数据预处理和清洗,然后将数据输入到神经网络模型中以预测结果。
所使用的数据集包含了FIFA 19游戏中所有球员及其属性的完整数据,这些数据由EA Sports提供。数据集可以从以下链接获取:。拥有18207名球员的详细信息,每个球员大约有88个特征。目标是利用这些特征来预测球员的位置。在深入神经网络模型之前,先对数据集进行一些整理。以下展示了一些对分类任务重要的特征的热图:
通过热图,可以看到所有守门员的属性高度相关。如果看第一列,可以看到在完成度方面,大多数值高于0.8的特征包括凌空抽射、盘带、远射、站位等,知道这些是攻击手或顶级中场的特征,具有这些特征的球员是出色的终结者。可以看到在相关性矩阵中许多其他特征之间也有类似的相关性。
使用直方图,可以了解到大多数球员的年龄范围在20到26岁之间。在足球中,26岁被认为是黄金年龄。球员通常在30岁以后开始退役,这就是为什么从30岁开始看到柱状图的高度下降。
既然目标是预测球员的位置,让现在可视化一下数据集中位置的分布情况。前锋位置的数量是最高的,其次是守门员。攻击型中场和边锋球员在数据集中的数量最少。将这些位置归类为几个类别:攻击手 - 3,中场 - 2,后卫 - 1,守门员 - 0。
即使前锋位置在数量上是最多的,当将它们归类为类别时,可以看到中场在总体数量上占主导地位。
1. 导入所有所需的库并读取数据:
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
from keras.utils.np_utils import to_categorical
df = pd.read_csv('data.csv')
首要任务是导入所有所需的库。使用Keras库来构建顺序模型,并且可以看到已经导入了Keras所需的包。
2. 从位置中移除所有空值:
na = pd.notnull(df["Position"])
df = df[na]
在使用Keras的顺序模型时,数据集不能包含任何空值。如果遇到空值,将会遇到错误。由于正在预测位置特征,将删除这一列中的所有可能的空值。
3. 获取分类问题所需的特征:
df = df[["Position", 'Finishing', 'HeadingAccuracy', 'ShortPassing', 'Volleys', 'Dribbling', 'Curve', 'FKAccuracy', 'LongPassing', 'BallControl', 'Acceleration', 'SprintSpeed', 'Agility', 'Reactions', 'Balance', 'ShotPower', 'Jumping', 'Stamina', 'Strength', 'LongShots', 'Aggression', 'Interceptions', 'Positioning', 'Vision', 'Penalties', 'Composure', 'Marking', 'StandingTackle', 'SlidingTackle', 'GKDiving', 'GKHandling', 'GKKicking', 'GKPositioning', 'GKReflexes']]
上述是要考虑的所有特征。在这里,位置特征是Y值或目标变量,其余的是输入变量或X。其他特征如姓名、年龄等不用于预测目的。
4. 对位置进行分类:
forward_player = ["ST", "LW", "RW", "LF", "RF", "RS","LS", "CF"]
midfielder_player = ["CM","RCM","LCM", "CDM","RDM","LDM", "CAM", "LAM", "RAM", "RM", "LM"]
defender_player = ["CB", "RCB", "LCB", "LWB", "RWB", "LB", "RB"]
df.loc[df["Position"] == "GK", "Position"] = 0
df.loc[df["Position"].isin(defender_player), "Position"] = 1
df.loc[df["Position"].isin(midfielder_player), "Position"] = 2
df.loc[df["Position"].isin(forward_player), "Position"] = 3
正如之前讨论的,在这一步对位置进行分类。
5. 特征的标准缩放:
x = df.drop("Position", axis = 1)
sc = StandardScaler()
x = pd.DataFrame(sc.fit_transform(x))
y = df["Position"]
在将数据传递到神经网络之前,使用StandardScaler对所有值进行缩放,使用fit_transform函数。
6. 将预测转换为分类:
y_cat = to_categorical(y)
只需将y转换为分类类型以进行编码。
7. 测试训练拆分:
x_train, x_test, y_train, y_test = train_test_split(x.values, y_cat, test_size=0.2)
将数据集拆分为20%的测试数据和80%的训练数据。
8. 构建模型:
model = Sequential()
model.add(Dense(60, input_shape = (33,), activation = "relu"))
model.add(Dense(15, activation = "relu"))
model.add(Dropout(0.2))
model.add(Dense(4, activation = "softmax"))
model.compile(Adam(lr = 0.01), "categorical_crossentropy", metrics = ["accuracy"])
model.summary()
上述图表解释了构建的神经网络模型。模型有两个ReLU单元和最后一个是密集层,具有softmax激活函数,用于预测多类概率输出。在中间使用了0.2的dropout作为正则化。还使用了分类交叉熵作为损失函数,并使用了Adam优化器。
9. 拟合模型并运行10个周期:
model.fit(x_train, y_train, verbose=1, epochs=10)
在前10个周期内,大约达到了87.7%的准确率。
10. 混淆矩阵:
y_pred_class = model.predict_classes(x_test)
from sklearn.metrics import confusion_matrix
y_pred = model.predict(x_test)
y_test_class = np.argmax(y_test, axis=1)
confusion_matrix(y_test_class, y_pred_class)
11. 分类报告:
print(classification_report(y_test_class, y_pred_class))