【问题标题】:How can we be sure of the efficiency of a neural network我们如何确定神经网络的效率
【发布时间】:2019-12-03 22:52:50
【问题描述】:

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

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

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

  2. 1234563从中学习,观看,但仅提高了 87%...

我是 ML 的初学者,所以我不知道这是否正常,我只是好奇,想了解所有需要了解的小事,以完全了解我在做什么。我想这可能是我的向量集的规范化,但我对此不太了解。如果你愿意,我可以把我的完整代码分享给你,但是作为每个神经网络,它很长但很容易阅读。

【问题讨论】:

    标签: python machine-learning neural-network dataset normalization


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不懂采样算法...我的意思是,SMOTE 会给我的测试集与训练集相同的形状,这样做,将不再有 80 的比率:20 ??你能给我解释一下吗? (我关注这个example for SMOTE@VimalThilak
    • 不,它将为少数类创建更多示例。例如,您的原始数据集具有 1 类:1000 和 0 类:10,然后基于邻域,它将为 0 类创建更多示例并使其成为平衡数据集。在您的 SMOTE 示例中,您可以看到少数类标签的数量增加了,整体数据大小也增加了。
    • 过采样前,标签“1”的计数:[345] 过采样前,标签“0”的计数:[199019] 过采样后,train_X 的形状:(398038, 29)过采样后, train_y 的形状:(398038,) 过采样后,标签“1”的计数:199019 过采样后,标签“0”的计数:199019
    • 好吧,如果我理解得很好,它会复制一些数据以使标签 1 与标签 0 一样多,好吧,我已经做到了,我仍然发现大约相同的准确度,85%,但当然我必须更改一些参数,例如隐藏层中的神经元数量
    • 为了清楚起见,您仍然需要训练/测试的比率公式。注意:请使用 MCC、F-Score 等指标衡量您的表现。
    【解决方案2】:

    OP:您的问题非常适合刚开始使用机器学习的人。

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

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

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

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

    【讨论】:

    • 你说得对,我的数据集是不平衡(测试集中标签 0 的 70% 和训练集中只有 40%,所以是的,标签 1 更受青睐)。我正在尝试@SUN 建议的 SMOTE 算法,但我认为我们希望在测试和训练集中的标签百分比方面具有相同的比例,因为我看到 SMOTE 会给出与我的数据集形状相同,所以 不再有 90-10% 的比例,这正常吗?我可以自己平衡吗? 3) 我的标签中有一些噪音,对此无能为力,但肯定会影响准确性。
    • @Benech17 我只能在这里提供大致的方向。看起来您已经在尝试重新平衡您的课程,这很好。其他选项包括: - 分层抽样 - 修改您的损失函数以解决数据集的不平衡性质 在做所有这些之前,您能否建立一个基线,不仅是准确度,还包括分类器的准确率、召回率和 AUC ?
    【解决方案3】:

    这里有几件事要解决。

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

    2- 你不应该在火车上获得 100% 的成绩。如果你这样做了,那么你的模型已经严重过度拟合,它无法推广到新的例子。

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

    4- 对于这么小的数据集,imo 另一个算法可能会执行得更好。

    希望有帮助:)

    【讨论】:

    • 感谢您的帮助,但您在第 4 点中究竟是什么意思?什么样的算法?什么尺寸才是合理和“安静的”?
    • 嗯,有很多可用的算法(如果你想要一些开箱即用的算法,我建议你访问 sklearn 实现了很多)。我猜你正在根据你使用准确性作为分数的事实进行二进制分类,所以也许尝试 SVM 或线性回归,这些通常适用于小数据集的二进制分类。随机森林也总是一个有效的选择,特别是如果你有很多特征!
    • 我已经尝试过线性回归,但效果不佳,我几乎可以肯定我需要神经网络,因为线性回归只是关于统计数据,它什么也没学到,我的分类需要它。但是为我的问题拥有一个大数据集并不容易..
    • 对不起,我的意思是逻辑回归不是线性的。仅供参考,机器学习中的所有内容都与统计数据有关。如果我有更多关于这个问题的信息会更容易
    • 除非您在测试后通过训练以外的其他方式修改网络,否则在所有训练之前测试 [原文如此] 会有什么好处?
    猜你喜欢
    • 2018-10-16
    • 2020-06-08
    • 2022-11-07
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多