我们如何确定神经网络的效率

How can we be sure of the efficiency of a neural network

我为二元分类训练了一个前向神经网络,我得到了 83% 的准确率,(我希望)我稍后会通过改变输入参数来提高它。但是有些测试让我感到困惑:

My dataset length is 671 so I divide it as 513 train set, 58 Validation set and 100 test set

  1. 当我更改集的大小时(训练、验证、测试),准确度分数可能会降低到一些非常低的分数,例如 40%

  2. 神经网络应该从训练集中学习,但是当我在训练后使用相同的训练集而不是测试集进行测试时,我认为模型应该得分 100% , 因为他刚学过, 看过, 但只提高了几个, 87% ...

我是 ML 的初学者,所以我不知道这是否正常,我只是好奇并且想抓住所有要知道的小事情,以完全理解我在做什么。我想这可能是我的向量集的规范化,但我对此不是很了解。如果你愿意,我可以与你分享我的完整代码,但与每个神经网络一样,它很长但易于阅读。

这里有几件事要解决。

1-这是一个非常非常小的 NN 数据集,因此当改变集合的大小时,结果变化如此之大也就不足为奇了。

2- 你不应该在训练集上达到 100%。如果你这样做,那么你的模型已经严重过度拟合,它将无法推广到新的例子。

3- 对如此小的数据集的泛化性能进行良好估计的最佳方法是使用 K 折交叉验证(我应该说,可以说是最好的,但在我看来它肯定是最简单的) .基本上不是像你那样分离数据集,例如,你会在 80% 的数据集上训练并在 20% 上测试,然后在另外 80% 上训练并在不同的 20% 上测试 5 次,直到所有示例都已测试on(这有一些变化)。在这里阅读更多 https://en.wikipedia.org/wiki/Cross-validation_(statistics)

4- 对于如此小的数据集,我认为另一种算法可能表现更好。

希望对您有所帮助:)

OP:你的问题对于刚开始接触机器学习的人来说非常好。

  1. 你确定你的训练集和测试集的分布是相似的吗?如果可能的话,我会尽量保持每个 class(标签)的样本数量大致相等。例如,如果您的训练集严重不平衡,那么您的预测算法可能倾向于选择出现频率更高的标签。

  2. 我认为您正走在过度拟合模型的正确轨道上,以确保您的神经网络架构、训练和其他任何设置正确。你在使用正则化吗?如果是这样,我认为您可能想删除它以查看您的模型是否适合您的训练数据集。我知道这与接受的答案 #2 所建议的相反,但这是调试设置的有用方法

  3. 您数据集的标签有多好?如果您的标签中有任何噪音,那么这会影响您的 classifier

  4. 的准确性
  5. 如果无法获得更多训练数据,也可以尝试迁移学习

正如许多人所建议的那样 3:1:1 (60:20:20 = train-validate-test) 比率是分割数据的经验法则,如果你正在玩小数据集,最好坚持使用80:20 或 70:30 只是训练测试,我通常选择 90:10 比率以获得更好的结果。

在你开始class化之前,首先检查你的数据集是平衡的还是不平衡的(属于一个class的例子不应该比其他的少)因为即使它为您提供良好的准确性,但会误导结果。

如果数据集不平衡,用采样算法(例如SMOTE)预处理数据集并重新采样。它将根据邻居为 class 创建相等的示例集。

正如其他答案中正确提到的那样,使用交叉验证 class化,例如 K 折。交叉验证的概念是调整用于训练的参数,以优化其准确性并消除过度拟合对训练数据的影响,它还消除了数据集中的噪声。我通常进行 10 折交叉验证,其中数据集分为 10 个分区,在每次迭代中 1/10 分区用作测试,其余部分用作训练。取 10 次计算的平均值以获得 classifier 性能的良好估计。