问题描述
年龄 (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>
准确率和损失完全没有变化,我尝试了以下实验,都给出了相同的结果:
- 将隐藏层激活更改为
sigmoid
,tanh
- 将最后一层更改为只有一个节点,将
y_train
标记为 (1,2,3) 而不是一个热编码,并将损失函数更改为稀疏分类交叉熵 - 将优化器更改为 Adam
- 将数据更改为 (-1,1) 而不是 (0,1)
我在这里遗漏了什么?
解决方法
我想出了一些方法来解决这个问题,我认为这不是很科学,但实际上对我的情况有效
- 首先,我将训练数据集中的每个“1”替换为“0.8”,将每个“0”替换为“0.2”。
- 然后我将每个相似的特征以某种权重相乘。例如,如果年龄是“18”,那么特征首先将是这样的
[0,1,0]
,然后应用第一步的专长将是这样的[0.2,0.8,0.2,0.2]
然后将此数组乘以[0.1,0.3,0.4]
和将它们相加得到[0.32]
以某种方式代表年龄“18”。 然后通过将前面的阶段应用于特征,我得到了一个长度为 15 而不是 22 的数组。 - 第三阶段是使用
PCA
进行特征尺寸缩减,以将特征数量减少到 10 个。
这种方法就像通过给它一个新的域而不是二进制域来从现有特征中提取一些其他特征。
这让我对 85%
的准确性非常满意。