我正在建立一个预测足球结果的模型,我尝试了许多不同的模型,例如Matlab中的神经网络,Python中使用keras的Deep Networks和LSTM。我的准确性提高不超过50%
我从13个不同的联赛中收集了24000场比赛,这些比赛具有相同的方面(按点数获胜)。我的数据包括:
The week of the league that is ocurring that match
Ratings of all the 22 titular players
Goals Average
Goals Against Average
Shots_H, Shots_A,
ShotsOnTarget_H, ShotsOnTarget_A,
PassSuccess_H, PassSuccess_A,
AerialDuelSuccess_H, AerialDuelSuccess_A,
DribblesWon_H, DribblesWon_A,
Tackles_H, Tackles_A,
Posesion_H, Posesion_A,
Rating_H, Rating_A,
DribbleSucces_H, DribbleSucces_A,
TacklesSucces_H, TacklesSucces_A,
Interceptions_H, Interceptions_A,
Dispossesse_H, Dispossesse_A,
Corners_H, Corners_A,
我从所有数据中得出了最后5个匹配项的平均加权平均值,以用作在比赛中和比赛中消失的神经网络模型的输入。因此,如果主队要参加比赛,则数据将是主场中最近5场比赛的平均加权平均值(最后一场比赛的权重大于倒数第二场的权重,依此类推)。输出是一个热编码:(1 0 0)代表赢家,(0 1 0)吸引...
我尝试了几种模型,现在我正在尝试Keras Dense模型。
我正在使用以下方法缩放输入数据:
sc = StandardScaler()
entrada_training = sc.fit_transform(entrada_training)
entrada_validation = sc.transform (entrada_validation)
entrada_teste = sc.transform (entrada_teste)
模型是:
drop=0.3
model = Sequential()
model.add(Dense(40, input_shape=(57,), activation='relu'))
#model.add(layers.BatchNormalization())
model.add(Dropout(drop))
model.add(Dense(20, activation='relu'))
model.add(Dropout(drop))
#model.add(layers.BatchNormalization())
model.add(Dense(10, activation='relu'))
model.add(Dropout(drop))
#model.add(layers.BatchNormalization())
model.add(Dense(3, activation='softmax'))
adam = optimizers.Adam(lr=0.0001)
mcp_save = ModelCheckpoint('.mdl_wts.hdf5', save_best_only=True, monitor='val_loss', mode='min')
reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=5, min_lr=0.0001)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(entrada_training, saida_training,
batch_size=28,
epochs=100,
verbose=2,
callbacks=[mcp_save, reduce_lr],
# class_weight=d_class_weights,
validation_data=(entrada_validation, saida_validation))
我可以达到的最大结果是在测试集上达到50%的准确度,但是在混淆矩阵的情况下,我可以看到该模型没有预测任何抽奖,因此我为类添加了权重:
from sklearn.utils.class_weight import compute_class_weight
y_integers = np.argmax(saida_training, axis=1)
class_weights = compute_class_weight('balanced', np.unique(y_integers), y_integers)
d_class_weights = dict(enumerate(class_weights))
达到了46%的准确度,但矩阵更好。
我真的不知道该怎么办,我尝试了很多不同的模型,激活函数和方法,但是准确性似乎并没有太大改变。
编辑:我做了相关矩阵,发现与结果的最大相关不高于0.2。而且我看到有6个变量彼此相关,相关系数为0.87。我已删除结果相关性小于0.05的变量。从57个变量中,我现在有44个,但仍然具有45%的相同精度。