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



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

我的数据集长度是 671,所以我将其划分为 513 个训练集、58 个验证集和 100 个测试集

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

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

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

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

在开始分类之前,首先检查您的数据集是平衡的还是不平衡的(与属于一个类的示例相比,不应少于其他类),因为即使它为您提供了良好的准确性,也会误导结果。

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

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

所以这里有几件事要解决。

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

2-您不应该在火车上获得100%。如果这样做,那么您的模型严重过度拟合,将无法推广到新示例。

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

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

希望对:)有所帮助

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

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

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

  3. 数据集的标签有多好?如果您的标签中有任何噪音,那么这将影响分类器的准确性

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

最新更新