提高我的DNN模型的准确性

时间:2017-06-26 11:39:26

标签: python machine-learning tensorflow keras

我有一个训练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级时没有任何内容)。

我有两个问题:

  1. 我的单编码方法是否正确?
  2. 我希望模型实际训练/收敛哪一部分?

1 个答案:

答案 0 :(得分:3)

  1. 您已对数据进行了标签编码,但未对其进行单一编码。对于每个功能中的每个标签,您需要创建一个二进制标签。
  2. 例如:如果您有4个名称,则需要3个代表4种可能状态的二进制标签。

    您可以使用Scikit-learn的OneHotEncoder:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

    其中一个原因是现在名称#37比名称#36或#10或#5“更多”或“更高”没有任何意义(因为这些是分类值而不是连续值)的)

    1. 在最后一个Dense图层上,您需要使用sigmoid作为激活函数。
    2. 还有一件事:您可能需要增加模型尺寸。您的代码中有两行model.add(Activation('relu'))