我正忙于分类问题,分为三个班级。其中一个类别永远不会被预测/分类。我想知道是否有将先验信念注入到我的神经网络中的方法,无论设计与否。

我的足球预测模型预测[Draws , Home Win , Away Win]。我的课程很平衡(40%,30%,30%)。占数据40%的类[Draw]是我的NN从未预测过的类。我的数据集包含1900个样本。

我正在使用具有2到4个隐藏层的深度NN。

我的最佳模型代码(基于训练/损失值)如下:

X_all = df.copy()

train_cols = ['a_line0','a_line1','a_line2','a_line3','a_line4','a_line5',
              'a_line6','a_line7','a_line8','a_line9','a_line10','h_line0',
              'h_line1','h_line2','h_line3','h_line4','h_line5','h_line6',
              'h_line7','h_line8','h_line9','h_line10','odds0','odds1','odds2']


x = X_all[train_cols]

x_v = x.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x_v)
x = pd.DataFrame(x_scaled)

y = X_all['result']
ohe = OneHotEncoder(n_values=3,categories='auto')
y = ohe.fit_transform(y.reshape(-1,1))

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

for lr,ep in [(0.001,300)]:
    model = Sequential()
    model.add(Dense(25, input_dim=25, activation='relu'))
    model.add(Dense(36, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(12, activation='relu'))
    model.add(Dense(3, activation='sigmoid'))
    adam = kr.optimizers.Adam(lr=lr, decay=1e-6)
    model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
    model.fit(X_train, y_train, epochs=ep, batch_size=10,verbose = 0)
    _, accuracy = model.evaluate(X_test, y_test)
    _, accuracy1 = model.evaluate(X_train, y_train)
    print('Testing Accuracy: %.2f' % (accuracy*100),'Train Accuracy: %.2f' % (accuracy1*100), 'learning rate : ', lr)


如果代码有点混乱,我深表歉意。
在此网络配置中,我的模型也过拟合+-16%(52%对68%)。

最佳答案

由于您处于多类单标签设置中(即,标签是互斥的),因此不应在最终层中使用sigmoid作为激活;更改为

model.add(Dense(3, activation='softmax'))


另外,默认情况下不应该使用dropout;首先将其删除,只有在改善结果的情况下才添加它。

关于python - 将先验信念添加到神经网络,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57871767/

10-11 15:20
查看更多