如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?
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 领域的一个大问题。这些只是您可以尝试的一些非常简单的事情。
【讨论】:
感谢您的好回答。我认为第三个选项对我的问题更有意义。以上是关于如何获得一个良好的二元分类深度神经模型,其中负数据更多位于数据集上?的主要内容,如果未能解决你的问题,请参考以下文章