我有一个训练DNN模型的数据集。
我的数据集就像这样(单个示例行):
hash name surname datetime total nb_success nb_loss
axBBdnn78 aaa bbb 2016-01-01 00:01:26 50.00 1 2
我替换了标题名称(机密性),但它们都很重要。我尝试预测的值是state
列(存在于数据集中),可以采用2个值:'ok'和'nok'。
通过对数据集进行一些准备并使用以下代码对字符串进行一次编码:
data = data.select_dtypes(exclude=['number']).apply(LabelEncoder().fit_transform).join(data.select_dtypes(include=['number']))
然后我得到了我的最终训练集,如下所示:
hash name surname datetime total nb_success nb_loss
1696 4 37 01 50.00 1 2
然后我使用以下Keras DNN模型:
model = Sequential()
model.add(Dense(16, input_shape=(7,)))
model.add(Activation('relu'))
# model.add(Dropout(0.5))
model.add(Activation('relu'))
model.add(Dense(1)) # 2 outputs possible (ok or nok)
model.add(Activation('relu'))
model.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])
但是,我的损失都没有减少,或者我的准确度都没有提高。
5000/5000 [==============================] - 0s - loss: 0.5070 - acc: 0.4930 - val_loss: 0.4900 - val_acc: 0.5100
Epoch 2/10
5000/5000 [==============================] - 0s - loss: 0.5054 - acc: 0.4946 - val_loss: 0.5100 - val_acc: 0.4900
Epoch 3/10
5000/5000 [==============================] - 0s - loss: 0.5112 - acc: 0.4888 - val_loss: 0.4140 - val_acc: 0.5860
Epoch 4/10
5000/5000 [==============================] - 0s - loss: 0.4900 - acc: 0.5100 - val_loss: 0.4660 - val_acc: 0.5340
我尝试了其他几种丢失函数以及其他优化器,但每次我只能达到大约50%的精度(因此,输出为2级时没有任何内容)。
我有两个问题:
答案 0 :(得分:3)
例如:如果您有4个名称,则需要3个代表4种可能状态的二进制标签。
您可以使用Scikit-learn的OneHotEncoder:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
其中一个原因是现在名称#37比名称#36或#10或#5“更多”或“更高”没有任何意义(因为这些是分类值而不是连续值)的)
还有一件事:您可能需要增加模型尺寸。您的代码中有两行model.add(Activation('relu'))
。