如何在测试结果中以高精度但低概率解释我的神经网络

数据挖掘 Python 喀拉斯 准确性
2022-03-08 02:01:54

我使用 keras 构建了一个经典的 ANN,它提供了结果(0 或 1)的概率(使用 sigmoid 函数)。虽然当模型拟合约 90% 时模型的准确性很高,但测试集结果的结果概率非常差。我该如何解释这个?

构建人工神经网络

classifier = Sequential()
classifier.add(Dense(activation="relu",input_dim=7,kernel_initializer="uniform", units = 4))
classifier.add(Dense(activation="relu",kernel_initializer="uniform", units = 4))
classifier.add(Dense(activation="sigmoid", kernel_initializer="uniform", units = 1))
classifier.compile(optimizer="adam", loss="binary_crossentropy",metrics=['accuracy'])
classifier.fit(X_train,y_train, batch_size=10,epochs=100)

预测结果:

y_pred = classifier.predict(X_test)

我附上了测试集结果,其中可以看到与频率相关的结果概率。蓝色表示 1 的概率,橙色表示 0 测试结果

这是过拟合的情况吗?如何调整 ann 以避免过度拟合?

1个回答

第一种可能性:

您的数据集平衡性如何?大部分是0s吗?如果我很好地理解了您的图表,那么情况似乎就是这样。

如果您的数据集中实际上有 90%0和 10% 1,那么您的结果将表明模型实际上只是在执行随机选择。这意味着它还没有真正了解数据。

第二种可能:

如果你的训练准确率很高,但你的测试准确率很低,这通常表明过度拟合,正如你所怀疑的那样。

您的模型本质上是在记忆训练数据集,使其能够非常可靠地简单地回忆出正确的结果,但无需学习描述数据集的底层函数。

以下是可能背后的一些事情:

  • 训练太多epoch
  • 使用太大而复杂的模型
  • 没有使用足够的正则化

我建议首先检查数据集的类平衡。如果它高度不平衡,您可以考虑执行分层抽样来创建您的训练/测试拆分。这确保了每个批次的样本数量大致0相同1

其次,您可以考虑使用稍微大一点的网络。在第一种情况下,这可能就像增加每Dense一层中的神经元数量一样简单。我会建议一些类似(100, 50, 1)的开始。这将立即告诉您模型的大小是否限制了学习。