使用 DNN 对二进制数据集进行二进制分类

Binary Classification for binary dataset with DNN

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

age (0-9) age (10-19) age (20-59) age (10-19) gender (male) gender (female) ... desired (very much) desired (moderate) desired (little) desired (None)
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. 将隐藏层激活更改为 sigmoidtanh
  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],然后应用第一步,壮举会像这样 [0.2,0.8,0.2,0.2] 然后将这个数组乘以 [0.1,0.2,0.3,0.4] 和将它们加在一起得到 [0.32] 以某种方式代表年龄“18”。 然后通过将前面的阶段应用于特征,我得到了一个长度为 15 而不是 22 的数组。
  3. 第三阶段是使用 PCA 应用特征尺寸缩减,将特征数量减少到 10 个。

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

这给了我关于 85% 的准确性,这让我非常满意。