我的神经网络模型预测足球成绩不会超过50%

时间:2019-07-02 19:42:36

标签: python machine-learning keras deep-learning

我正在建立一个预测足球结果的模型,我尝试了许多不同的模型,例如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%的相同精度。

0 个答案:

没有答案