微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 DNN

如何解决使用 DNN

我有一个这样的二进制数据数据集:

年龄 (0-9) 年龄(10-19) 年龄 (20-59) 年龄(10-19) 性别(男) 性别(女) ... 想要(非常) 需要(中等) 想要的(小) 想要(无)
1 0 0 0 0 1 ... 0 1 0 0
0 0 1 0 1 0 ... 1 0 0 0

这里的特征是前几列,目标是最后4列。 我在这里尝试使用通过 tensorflow/keras 实现的 DNN 来适应这些数据。

这是我的模型和代码

input_layer = Input(shape=(len(x_training)))
x = Dense(30,activation="relu")(input_layer)
x = Dense(20,activation="relu")(x)
x = Dense(10,activation="relu")(x)
x = Dense(5,activation="relu")(x)
output_layer = Dense(4,activation="softmax")(x)
model = Model(inputs=input_layer,outputs=output_layer)


model.compile(optimizer="sgd",loss="categorical_crossentropy",metrics=['accuracy'])

model.fit(x=x_train,y=y_train,batch_size=128,epochs=10,validation_data=(x_validate,y_validate))

这是训练的历史:

Epoch 1/10
2005/2005 [==============================] - 9s 4ms/step - loss: 1.3864 - accuracy: 0.2525 - val_loss: 1.3863 - val_accuracy: 0.2533
Epoch 2/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2518 - val_loss: 1.3864 - val_accuracy: 0.2486
Epoch 3/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2499 - val_loss: 1.3863 - val_accuracy: 0.2487
Epoch 4/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2515 - val_loss: 1.3863 - val_accuracy: 0.2539
Epoch 5/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2511 - val_loss: 1.3863 - val_accuracy: 0.2504
Epoch 6/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2501 - val_loss: 1.3863 - val_accuracy: 0.2484
Epoch 7/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2511 - val_loss: 1.3863 - val_accuracy: 0.2468
Epoch 8/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2509 - val_loss: 1.3863 - val_accuracy: 0.2519
Epoch 9/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2505 - val_loss: 1.3863 - val_accuracy: 0.2463
Epoch 10/10
2005/2005 [==============================] - 6s 3ms/step - loss: 1.3863 - accuracy: 0.2512 - val_loss: 1.3863 - val_accuracy: 0.2474
<tensorflow.python.keras.callbacks.History at 0x7f6893c61e90>

准确率和损失完全没有变化,我尝试了以下实验,都给出了相同的结果:

  1. 将隐藏层激活更改为 sigmoid,tanh
  2. 将最后一层更改为只有一个节点,将 y_train 标记为 (1,2,3) 而不是一个热编码,并将损失函数更改为稀疏分类交叉熵
  3. 将优化器更改为 Adam
  4. 将数据更改为 (-1,1) 而不是 (0,1)

在这里遗漏了什么?

解决方法

我想出了一些方法来解决这个问题,我认为这不是很科学,但实际上对我的情况有效

  1. 首先,我将训练数据集中的每个“1”替换为“0.8”,将每个“0”替换为“0.2”。
  2. 然后我将每个相似的特征以某种权重相乘。例如,如果年龄是“18”,那么特征首先将是这样的 [0,1,0],然后应用第一步的专长将是这样的 [0.2,0.8,0.2,0.2] 然后将此数组乘以 [0.1,0.3,0.4] 和将它们相加得到 [0.32] 以某种方式代表年龄“18”。 然后通过将前面的阶段应用于特征,我得到了一个长度为 15 而不是 22 的数组。
  3. 第三阶段是使用 PCA 进行特征尺寸缩减,以将特征数量减少到 10 个。

这种方法就像通过给它一个新的域而不是二进制域来从现有特征中提取一些其他特征。

这让我对 85% 的准确性非常满意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。