如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?

Posted

技术标签:

【中文标题】如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?【英文标题】:How to get a good binary classification deep neural model where negative data is more on dataset? 【发布时间】:2019-07-05 20:31:06 【问题描述】:

我想使用 Cifar-10 数据集进行二值图像分类。我将 Cifar-10 修改为 class-0 为 class-True(1),所有其他类为 class-False(0)。现在我的数据集中只有两个类 - True(1) 和 False(0)。

当我使用以下 Keras 模型(Tensorflow 作为后端)进行训练时,我的准确率几乎达到 99%。 但在测试中,我发现所有 False 都被预测为 False,所有 True 也被预测为 False - 并且准确率达到 99%。

但我不希望所有 True 都被预测为 False。

我期待所有 True 都被预测为 True。

我该如何解决这个问题?

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

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

output=model.fit(x_train, y_train, batch_size=32, epochs=10)

【问题讨论】:

你必须使用更好的数据集进行训练...... @Attersson,如果我的 True:False 数据比率为 1:1,那么它可以正常工作。如果我有更多的负面数据,就会出现问题。这是否意味着我需要使用始终平衡的数据? 是的,以便训练您的神经网络。也许不是 1:1,但更平衡,你明白了 Google 用于“类不平衡”,这是 ML 领域中的一个巨大子主题... @desertnaut 说得好。 【参考方案1】:

你有几个选择:

    使用True 标签获取更多数据。然而,在大多数情况下,这并不容易。 仅使用少量标记为False 的数据。也许训练你的模型就足够了? 在训练期间为损失函数使用权重。在 Keras 中,您可以使用 class_weight option 或 fit 来执行此操作。在您的示例中,True 类的权重应该高于 False 类。

正如 cmets 中所述,这是 ML 领域的一个大问题。这些只是您可以尝试的一些非常简单的事情。

【讨论】:

感谢您的好回答。我认为第三个选项对我的问题更有意义。

以上是关于如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?的主要内容,如果未能解决你的问题,请参考以下文章

在深度全连接神经网络中进行二元分类的反向传播的正确方法是啥

使用 LSTM 构建二元分类模型

Keras:如何找出零假设?

Keras深度学习实战(10)——音频分类

第四范式提出深度稀疏网络模型,显著提升高维稀疏表数据分类效果

是否可以仅通过仅向其提供一个类的输入来训练二元分类神经网络?