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